![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 532 Pomógł: 24 Dołączył: 15.04.2011 Skąd: Kalisz Ostrzeżenie: (0%) ![]() ![]() |
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ć. |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 226 Pomógł: 61 Dołączył: 20.08.2010 Ostrzeżenie: (0%) ![]() ![]() |
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:
to powinieneś o tym poczytać. -------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 532 Pomógł: 24 Dołączył: 15.04.2011 Skąd: Kalisz Ostrzeżenie: (0%) ![]() ![]() |
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). Ten post edytował adbacz 13.12.2011, 22:35:05 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 1 798 Pomógł: 307 Dołączył: 13.05.2009 Skąd: Gubin/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 532 Pomógł: 24 Dołączył: 15.04.2011 Skąd: Kalisz Ostrzeżenie: (0%) ![]() ![]() |
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ą. |
|
|
![]()
Post
#6
|
|
![]() Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
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 -------------------- |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 04:37 |