Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czy opierać skrypt o metody statyczne?
Forum PHP.pl > Forum > PHP > Object-oriented programming
Fipaj
Cześć!

Mój prosty framework winksmiley.jpg jest już na ukończeniu, jednak mam wątpliwości jeśli chodzi o zastosowanie obiektów...

Skrypt działa na systemie szablonów Smarty.

--------------

Każdy plik posiada swoją klasę, jako przykład weźmy plik libs.php (zarządzanie bibliotekami):

  1. <?php
  2. require_once ('class/Lib.php');
  3. require_once ('lib/smarty/Smarty.class.php');
  4. require_once ('class/Tpl.php');
  5. $tpl = Tpl::loadSmarty ();
  6. Tpl::loadTemplate ('libs', $tpl);
  7.  
  8. if ($_GET['act'] == 'cp') {
  9. Lib::copyLib ($_GET['dir']);
  10. }
  11. if ($_GET['act'] == 'del') {
  12. Lib::delDir ($_GET['dir']);
  13. }
  14.  
  15. $tpl -> display ('main.tpl');
  16. ?>


i class/Lib.php:

  1. <?php
  2. class Lib {
  3. static function copyLib ($name) {
  4. system ('cp -R lib/' . $name . ' www/lib/');
  5. }
  6. static function delDir ($name) {
  7. if (is_file ('www/lib/' . $name)) {
  8. return unlink ('www/lib/' . $name);
  9. }
  10. $dir = dir ('www/lib/' . $name);
  11. while (FALSE !== $entry = $dir -> read ()) {
  12. if ($entry == '.' || $entry == '..') {
  13. continue;
  14. }
  15.  self::delDir ($name . '/' . $entry);
  16. }
  17. $dir -> close ();
  18. return rmdir ('www/lib/' . $name);
  19. }
  20. }
  21. ?>


A więc każda biblioteka to po prostu klasa złożona z kilku funkcji statycznych... Zastanawiam się, czy nie jest to głupotą/nagięciem zasad OOP.

Zastosowałem metody statyczne, bo:
* Nie muszę tworzyć obiektu, by się do nich odwołać...
* ...przez co nie jest problemem użycie danej metody w innym pliku
* Są proste w kodowaniu i użyciu

Z tym, że cały framework jest oparty i takie właśnie klasy... Może można by to rozpisać inaczej: prościej, a zarazem poprawniej?

Pozdrawiam,
Fipaj
aleksander
to nie jest OOP to jest po prostu umieszczenie funkcji w klasach.

Trudno mi wyjaśnic na czym polega OOP, ponieważ nie jest to tylko class Foo a cały sposób myślenia, filozofia i nie da się tego wytłumaczyc w dwóch zdaniach. Polecam czytac dużo materiałów, tutaj na forum, na wiki i php.pl jest troche, plus phppatterns.com plus sitepoint.com
Fipaj
Cytat
to nie jest OOP to jest po prostu umieszczenie funkcji w klasach.


Wiem winksmiley.jpg

Jestem po lekturze znakomitej książki Matta Zandstry o OOP, może przesadziłem, mówiąc, iż "cały framework jest oparty o te metody statyczne", ale po prostu szukam sposobu na ominięcie tego.

Bo z drugiej strony, pisanie tego jako normalną klasę też nie jest dobre, bo to poprostu jedna linijka kodu więcej.

Wiem i rozumiem, iż funkcje statyczne służą do troszkę czego innego, ale jak to rozwiązać?
Vengeance
Singleton, Factory, Decorator, cala masa innych wzorcow obiektowych.
Pozatym przeciez przekazywanie argumentow przez konstruktor i metody, dziedziczenie etc.
Fipaj
Cytat
Pozatym przeciez przekazywanie argumentow przez konstruktor i metody, dziedziczenie etc.


Tyle tylko, że skrypt jest tak prosty, iż to jest po prostu nie potrzebne...

Co do wzorców: można, tylko po co?
Singleton to taki OO odpowiednik zmiennych globalnych, ale nie ma tutaj potrzeby jego stosowania...
Inne wzorce: między poszczególnymi metodami nie ma jakiegoś większego związku, więc sa one, w większości, nieprzydatne...

Specjalnie przytoczyłem kawałek kodu, żeby pokazać, że aplikacja jest max prosta...
NuLL
Cytat
Singleton to taki OO odpowiednik zmiennych globalnych, ale nie ma tutaj potrzeby jego stosowania...
Jesli uwazasz ze singleton sluzy tylko do tego to daj sobie spokoj z obiektowka i jeszcze duuuzzzooo poczytaj.
Fipaj
Null: czytam, czytam.

Cytat
Jesli uwazasz ze singleton sluzy tylko do tego to daj sobie spokoj z obiektowka i jeszcze duuuzzzooo poczytaj.


Po prostu tak sobie tłumaczę, że nie mam tu jak go stosować...

----------

Słowem wyjaśnienia - programowac obiektowo umiem troche w teorii, troche w praktyce, ale jeszcze nigdy nie stosowałem wzorców... Kilka dni temu zacząłem czytać nowe phppatterns.com i dopiero *poznaję* wzorce, więc tu proszę o wyrozumiałość...
dtb
Jak używasz tylko funkcji statycznych, to odpuść sobie klasy. Nie prościej napisać:
  1. <?php
  2. function copyLib ($name) {
  3. system ('cp -R lib/' . $name . ' www/lib/');
  4. }
  5. function delDir ($name) {
  6. if (is_file ('www/lib/' . $name)) {
  7. return unlink ('www/lib/' . $name);
  8. }
  9. $dir = dir ('www/lib/' . $name);
  10. while (FALSE !== $entry = $dir -> read ()) {
  11. if ($entry == '.' || $entry == '..') {
  12. continue;
  13. }
  14.  delDir ($name . '/' . $entry);
  15. }
  16. $dir -> close ();
  17. return rmdir ('www/lib/' . $name);
  18. }
  19. ?>

dzieki temu nie trzeba dodatkowo pisać 'nazwaKlasy::'
Fipaj
Z pewnej strony masz rację, ale to da się zrobić tylko w *tej* klasie. Już obsługa plug-in'ów jest bardziej skomplikowana, występują tam pewne zależności...

Szukam rozwiązań OO.
NuLL
W jakim OOP ty piszesz ? snitch.gif - co za za OOP piszac na samych metoda statycznych ? Piszesz strkturalnie grupujac funkcje w klasy - nic wiecej.
Kocurro
Kolejna ofiara nowego systemu szkolnictwa - brak czytania ze zrozumieniem.

Jeśli chcesz to zrobić porządnie to proponuje pójść do najblizszego sklepu z materiałami biurowymi a następnie kupienie bloczku kartke w kratke formatu A4 i ołówka.

Potem jak wrócisz do domu to ułóz to przed sobą i odpręż się a potem zacznij szkicować cały serwis - jak ma wyglądać itp.

To co zaprezentowałeś to nic - brak funkcji sprawdzajacych poprawność wprowadzanych danych, brak funkcji obsługujących błędy, brak możliwości rozszerzenia.

Poza tym proszę wyedytuj pierwszego posta i zamiast "mój prosty framework" napisz "najprostszy framework na świecie".

Naprawdę polecam przygotowanie najpierw szkicu porządnego, bez tego ani rusz jeśli chcesz coś porządnego zrobić. A jeśli chcesz zrobić g*** to lepiej do WC pójdź winksmiley.jpg
Fipaj
Cytat
Jeśli chcesz to zrobić porządnie to proponuje pójść do najblizszego sklepu z materiałami biurowymi a następnie kupienie bloczku kartke w kratke formatu A4 i ołówka.

Potem jak wrócisz do domu to ułóz to przed sobą i odpręż się a potem zacznij szkicować cały serwis - jak ma wyglądać itp.


1. nie serwis, a framework

Prometeus, wiem, że to jest po prostu grupka funkcji w klasie... Ale to jest wykorzystane do tak prostych działań, między metodami nie ma żadnego powiązania...

Ale chyba mam już pomysł na rozwiązanie tego problemiku... Klasa Lib jest bardzo podobna do klasy File, obie służą do zarządzania, jedna katalogami, druga plikami. Tworzę interfejs:

  1. <?php
  2.  
  3. interface Manage {
  4. function add ();
  5. function del ();
  6. function cp ();
  7. }
  8.  
  9. ?>


Potem tworzymy dwie klasy, przykładowo Lib:

  1. <?php
  2.  
  3. class Lib implements Manage {
  4. private $smarty;
  5. public $dir;
  6.  
  7. function __construct ($dir) {
  8. $this -> dir = $dir;
  9.  // przy tworzeniu obiektu wymuszamy ustawienie zmiennej $this -> dir
  10. }
  11. function add () {
  12.  // tworzymy nową bibliotekę ($this -> dir), jeśli coś nie pójdzie, rzucamy wyjątek
  13. }
  14. function del () {
  15.  // usuwamy katalog ($this -> dir), jak wyżej
  16. }
  17. function cp () {
  18. // kopiujemy katalog ($this -> dir), wyjątki jak wyżej
  19. }
  20. static function getLibs () {
  21. // funkcja, za pomocą scandir (), pobiera listę katalogów w /lib i zwraca ją w postaci tablicy
  22. // funkcja jest statyczna ;), ponieważ musi być dostępna zawsze i wszędzie...
  23. }
  24. }
  25.  
  26. ?>


Better? winksmiley.jpg
Kocurro
No już trochę lepiej smile.gif

Ogólnie to mela clupa - framework należy rozpisać, serwis najczęściej buduje się w oparciu o już istniejący framework lub o framework, który się dla niego napiszze.
Fipaj
No to może jakieś wyjaśnienie o frameworku.

Framework buduję nie po to, aby zbudować jakiś serwis, ale po to, by uprościć tworzenie innych aplikacji... Podstawowe funkcje frameworka to 'dorzucanie' do przygotowywanej aplikacji bibliotek (Smarty, Creole, itp.), generowanie systemu plików, dołączanie skryptów umożliwiających stworzenie instalatora, systemu błędów, itp...

Poza tym framework posiada prosty system plug-in'ów oraz szablonów... Tworzony akurat na moje potrzeby tongue.gif
sf
olej system szablonow smile.gif nie ma czasu na pierdoly, sam framework Ci powinien zajac pare miesiecy jesli to ma byc COS winksmiley.jpg
Fipaj
1. system szablonów to prowizorka, po prostu w katalog /tpl szablony są pogrupowane w katalogu, a klasa Tpl wczytuje z pliku 'default-tpl' nazwę aktualnego szablonu ;P już zrobione

2. to nie ma być COS, to ma mi pomóc *szybko* tworzyć projekty, wykonując za mnie takie zadania jak dołączanie bibliotek, organizowanie struktury katalogów, tworzenia instalatora, wielojęzykowości i wieloszablonowości winksmiley.jpg

3. już kiedyś chciałem stworzyć COS, umieściłem w tym nawet menedżer notatek tongue.gif, ale potem wyrzuciłem cały kod uznając go za kilkaset bezużytecznych linijek... 'i tak powstał loveframework!' biggrin.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.