![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 24 Pomógł: 2 Dołączył: 8.06.2007 Ostrzeżenie: (0%) ![]() ![]() |
Witam, mam pewien problem z którego rozwiązaniem już trochę się zmagam i nie mogę znaleźć dobrego rozwiązania.
Mianowicie, przykładowo mam strukturę klas korowych:
Jako, że w przyszłości nie chciałbym wymuszać zmiany tych klas, chciałbym zaprojektować mechanizm Override. Każda z tych klas dziedziczyła by po klasach korowych i mógłbym w ten sposób zmieniać ich metody (przeciążać) bez ingerencji w kod korowy.
Nie ma problemu z wczytaniem tych klas ponieważ stosuję schemat PSR-0 i mój autoloader sobie z tym poradzi. Natomiast problem pojawia się w momencie otrzymania obiektu. Obiekty są u mnie tworzone w sposób normalny czyli przykładowo:
W rezultacie - ładowana jest zawsze klasa korowa i zawsze zwracany jest jej obiekt. Chciałbym doprowadzić do momentu w którym ładowany jest obiekt klasy rozszerzającej (gdy ona istnieje) w innym wypadku ładowanie korowej. Próbowałem już napisać sobie klasę, która zwraca odpowiedni obiekt, taki prosty Loader, który sprawdza czy klasa posiada swój Override. Jednak jest to trochę uciążliwe podczas pisania, a w szczególności podczas gdy odwołujemy się do klas abstrakcyjnych i ich metod statycznych, wtedy przykładowo kod musiałby wyglądać tak:
Czy macie jakieś inne pomysły na rozwiązanie tego problemu ? Byłbym wdzięczny za każdą wskazówkę |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Klasy/kod korowy, mechanizm Override - co to za potworki?!
Cytat Czy macie jakieś inne pomysły na rozwiązanie tego problemu ? Problem rozwiązany już wiele, wiele lat temu. Google: Dependency Injection Container - w PHP możesz skorzystać z DIC-a dostępnego w FW Symfony. Jest wystarczająco rozbudowany by nie sprawiać problemów.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 24 Pomógł: 2 Dołączył: 8.06.2007 Ostrzeżenie: (0%) ![]() ![]() |
Od razu potworki, tak sobie to ponazywałem
![]() Co do DIC to już słyszałem o tym, (Pimple od Symfony). A wiesz może jak to wygląda po stronie odwołań do klas abstrakcyjnych i ich metod statycznych ? Bo w przykładach widziałem tylko zastosowanie do obiektów i zastanawiam się czy nie będzie z tym problemów. |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Do klas abstrakcyjnych nie powinieneś się w ogóle odnosić poza ich dziedziczeniem. Z metod/właściwości statycznych również nie powinno się z reguły korzystać. Jeżeli potrzebujesz takową nadpisać na 95% masz błąd w założeniach/projekcie danej klasy.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 24 Pomógł: 2 Dołączył: 8.06.2007 Ostrzeżenie: (0%) ![]() ![]() |
Z reguły nie korzystam z metod statycznych, ale większość moich klas korowych korzysta ze wzorca Singleton
Więc aby otrzymać ich instancję muszę wykonać statyczne getInstance(); Niektóre klasy korowe mają swoje sterowniki/adaptery, które także są "singletonowe", i aby zwrócić odpowiedni obiekt danego adaptera także muszę wykonać statyczne getInstance(); Ten post edytował reptile_rex 29.12.2012, 13:43:59 |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat Z reguły nie korzystam z metod statycznych, ale większość moich klas korowych korzysta ze wzorca Singleton No to już masz pierwszy poważny błąd w projekcie kodu, a co za tym idzie problemy, których przy normalnym projektowaniu nie byłoby.
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 24 Pomógł: 2 Dołączył: 8.06.2007 Ostrzeżenie: (0%) ![]() ![]() |
Sugerujesz, że używanie singletona jest poważnym błędem ?
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
|
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
W niemal wszystkich przypadkach w jakich widzę Singletona jest on użyty niepotrzebnie komplikując jedynie życie. W skrócie: niemal zawsze tak.
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 24 Pomógł: 2 Dołączył: 8.06.2007 Ostrzeżenie: (0%) ![]() ![]() |
Przykładowo mam klasy obsługujące tablice super globalne POST / GET / SESSION etc.
W tym przypadku nie chciałbym pozwolić na tworzenie nowych instancji tych klas poza głównymi. Więc użycie singletona w tym wypadku wydaje mi się uzasadnione. @phpion CodeIgniter jak i zapewne Kohana, która chyba wywodzi się z CodeIgnitera, posiadają własne Loadery o których pisałem w pierwszym poście, dzięki temu mogą zwracać odpowiedni obiekt Ten post edytował reptile_rex 29.12.2012, 13:57:03 |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat Przykładowo mam klasy obsługujące tablice super globalne POST / GET / SESSION etc. Idealny przykład obrazujący złe użycie Singletona. Dlaczego niby niemożliwym miałoby być utworzenie dwóch obiektów tego typu? Już pomijam fakt, że przy różnego rodzaju testach będziemy potrzebowali wielu instancji takich obiektów.W tym przypadku nie chciałbym pozwolić na tworzenie nowych instancji tych klas poza głównymi. Więc użycie singletona w tym wypadku wydaje mi się uzasadnione. @phpion Mechanizm wykorzystywany w Kohanie jest jednym z bardziej porąbanym i niewygodnym jaki w życiu widziałem. Nawet nie sugeruj takich cudów. ![]() |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 24 Pomógł: 2 Dołączył: 8.06.2007 Ostrzeżenie: (0%) ![]() ![]() |
Żeby w pełni uzasadnić swoje podejście musiałbym Ci dokładnie opisać założenia i jądro systemu który projektuję, a nie mogę tego zrobić.
Nie mniej jednak zastanowię się jeszcze jakby to wyglądało bez singletona i podejmę decyzję co z tym zrobić dalej. Dzięki za wszelkie wskazówki |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 07:28 |