Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: System plików - Jak go ubrać w klasy?
Forum PHP.pl > Forum > PHP > Object-oriented programming
adbacz
Na potrzeby pewnego projektu, zacząłem pisać system uploadu, donwloadu plików oraz w tym samym systemie tworzenie katalogów i ich przeglądanie, usuwanie katalogów i plików oraz inne pomniejsze funkcje. Chodzi o to, że nie wiem jak to dobrze ubrać w klasy i jak sobie proadzić z zależnościami pomiędzy nimi.

Do tej pory powstało mi kilka różnych klas, przykładowo: Path, Upload, Download, File, MimeTypes itp. Ogólnie, do tej pory działałem na jednej klasie głównej, która w konstruktorze brała jako swój patrametr tablicę z nazwami, i odpowiednie klasy były tworzone pod pola głównej klasy. Zrobiłem tak, żeby nie marnować zasobów, po co mi 6 klas, skoro korzystam tylko z jednej?

Chcąc załadować nowa klasę, tworzę pole klasy głównej (FileSystem), i zapisuję nową instancje klasy do tego pola. W dalszej części sktyptu korzystam z nowej klasy, odnosząc się do odpowiedniego pola klasy głównej. Ale co zrobić, jak klasa Download będzie potrzebowała dostepu do metody lub właściwości klasy Path? W takim przypadku musiałbym tworzyć nowy obiekt (drugi) klasy Path by go wykorzystać w klasie Download - a drugi, bo pierwszy obiekt tej klasy został już utworzony w klasie głównej, i istnieje pod odpowiednim polem.

Teraz pytanie: Jak to wszystko zgrabnie ogarnąć? Jak utworzyć odpowiednie zależności pomiędzy klasami? Zrobić główna klase, lub każdą, stosując singleton (chciałbym tego uniknąć)? Proszę o jakieś sugestie, ewentualnie linki lub, jeśli ktoś miał z podobnym problemem do czynienia - jakies wskazówki, jak to rozwiązać.
Noidea
Co robi twoja klasa Path? Jeśli jest to tylko zbiór funkcji pomocniczych używanych do operowania na ścieżkach w postaci stringów, to przerób ją na klasę statyczną. Natomiast jeśli klasa Path reprezentuje jedną konkretną ścieżkę, to obiekt tej klasy powinien być utworzony dla każdej ścieżki z osobna.
Nie patrz na programowanie obiektowe pod względem wydajności pamięciowej, bo skończysz z kodem proceduralnym opakowanym w śmieci typu "class". Szczególnie, że możesz mieć błędne pojęcie o tym, jak tak na prawdę obiekty klas przechowywane są w pamięci. Jeśli obawiasz się tworzenia wielu obiektów takiej klasy:
  1. <?php
  2.  
  3. class Path
  4. {
  5. //string
  6. private $path;
  7.  
  8. public function __construct( $path )
  9. {
  10. $this->path = $path;
  11. }
  12.  
  13. public function getFileName()
  14. {
  15. //...
  16. }
  17.  
  18. public function getFileExtension()
  19. {
  20. //...
  21. }
  22.  
  23. public function getDirectory()
  24. {
  25. //...
  26. }
  27.  
  28. public function getRoot()
  29. {
  30. //...
  31. }
  32.  
  33. public function isAbsolute()
  34. {
  35. //...
  36. }
  37.  
  38. // I jeszcze 50 takich metod, łącznie 500 linijek kodu!
  39. }

to powinieneś o tym poczytać.
adbacz
Spokojnie, w klasie Path mam zdefiniowane dwie właściwości: mainDir (ścieżka bezwzględna do plików uploadu), oraz nazwe katalogu, gdzie przechowywane są obrazki. Oczywiście są metody, takie jak getMainDir() (zwraca wartość prywatnego pola mainDir), checkUriString() (Sprawdza, czy podana ścieżka zawiera znaki katalogu nadrzędnego ../ (zabezpieczenie)) oraz generateBackUrl() (tworzy z podanej ścieżki, ścieżkę do katalogu nadrzędnego).

Nie chodzi mi o to, że napiszę milion pięćset klas z niepotrzebnymi metodami (ten okres mam już za sobą), poszukuję tylko rozwiązania, aby to wszystko ładnie poukładać, żeby nie tworzyć niepotrzebych obiektów a tymbardziej dwóch, w dwóch różnych miejscach.

Chciałem aby to było możliwie proste, małe a zarazem modyfikowalne. Nie wiem czy się to uda, ale spróbować można, zawsze troszkę praktyki za sobą, a tym bardziej, że na razie tego nie będe używał i nie śpieszy mi się więc mogę poeksperymentować.

PS. Kod który napisałeś, wg mnie jest niepotrzebny. Po co pakować każdy plik w obiekt? Unikam tego jak ognia. Chcę tylko rozwiązania, jak upakować wszystko ładnie i jak rozwiązać problem zależności klas między sobą, żeby tworzyć jak najmniej obiektów (takich jak Path, którą klasę potrzebuję w 2 innych, osobnych klasach, choćby dlatego, że sprawdza mi czy ścieżka jest prawidłowa, lub zwraca mi główną ścieżkę do plików).
adbacz
Dzięki by_ikar, linki mi sie przydadzą na pewno, ale wydaje mi się, że źle zrozumieliście mój problem. Nie chodzi mi o to, żeby operacje na plikach (czysto na plikach, dodawanie, usuwanie, przenoszenie, CHMOD itd), ubrać w klasy, ale, żeby rozwiązać zaleśności pomiędzy nimi. Żeby zrobić mały system, który będzie nimi zarządzał. Żeby każda klasa miała dostęp do innej, lub tylko niektóre, żeby miały dostęp do tych, które potrzebują.

Nie mogę dać dziedziczenia, bo co ma wspólnego klasa Path z klasą Download? Prawie nic. Na razie rozwiązałem to w ten sposób, że w głównej klasie tworze nowe pola a w nich instancje moich osobnych klas, i z tych pól głównej klasy mam dostęp do innych klas. Ale jak rozwiązać to, że mniejsza klasa potrzebuje wartości z właściwości innej mniejszej klasy? Albo potrzebuje sprawdzić, czy ścieżka dostepu do pliku, nie zawiera znaku '../'? Chyba, że napiszę całkowicie odrębny system w mojej głównej klasie, i zdefiniuję, jaka podrzędna klasa, korzysta z innyj, i w tedy, jak będę ją ładował, to załaduje też tą wymaganą.
wookieb
Poczytaj o Dependency Injection. Symfony 2 oraz ZF2 implementują kontenery IOC.
Warty wspomnienie jest również standard ładowania plików klas PSR-0. Wszelki info -> google
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.