Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zmuszenie do korzystania z fabryki
Forum PHP.pl > Forum > PHP > Object-oriented programming
q.michal
Witam,


Chce aby pewien zbior klas byl singletonem i nie mozna bylo ich klonowac. Stworzylem takze fabryke, za pomoca ktorej sa tworzone instancje. Wszystko dziala jak nalezy i w zasdzie pytanie rozchodzi sie jedynie o powtarzalnosc kodu.
Aby nie zezwalac na klonowanie obiektu, wystarczy zzdefiniowac prywatna/chroniona metode __clone(). No i nie chcialbym teraz w wielu klasach powielac:

  1. private function __clone() {}


Z 2 strony jezeli wrzuce to do 1 klasy, ktora bede wszedzie rozszerzal, to po co mi OOP, skoro tak na prawde wszystkie klasy beda mialy dostep do metod chronionych, a nie wszedzie da sie uzyc private.
Moze da sie to rozwiazac w jeszcze inny, ciekawy sposob? Czy moze nie powinienem sie tym przejmowac i ladowac do kazdej klasy powyzsza linijke z osobna?
Crozin
Tak z czystej ciekawości co to za "zbiór klas, które mają być singletonami"? Generalnie kopiuj to do każdej z osobna bądź skorzystaj z traitsów.
q.michal
Np. obsluga bazy danych, konfiguracji globalnej, rejestr, ...
nospor
Baza danych nie powinna byc singletonem. Dosyc czesto w aplikacjacj korzysta sie z wielu baz danych
q.michal
getDatabase() moze przyjmowac parametr, za pomoca ktorego okresla sie 'kanal'. Jak nie podasz parametru to zwraca ten sam objekt domyslnie, ale mozesz stworzyc inny. Tak czy inaczej, rzeczywiscie moze byc tak jak mowisz.
Co nie zmienia faktu ze jak juz robie taka fabryke, to nawet jesli jakas klasa ma nie byc singletonem, to pomyslalem ze warto to ujednolicic i uniemozliwic tworzenie obiektow bezposrednio za pomoca operatora new, a wymusic korzystanie z fabryki.
Tylko wtedy majac 20 klas nie chcialbym powielac kodu. Traits wydaja sie byc ciekawym rozwiazaniem. W kazdej klasie moglbym dorzucic use commonTrait; o podobnej zawartosci:

  1. trait myTrait {
  2.  
  3. protected function __construct() {
  4. parent::__construct();
  5. }
  6.  
  7. protected function __clone() {
  8. parent::__clone();
  9. }
  10.  
  11. }


tylko wtedy musialbym jeszcze obsluge parametrow dorzucic do tego.
viking
Nie lepiej zacząć korzystać z jakiegoś service managera? Wtedy zawsze kiedy potrzebujesz zwraca 1 instancję.
q.michal
Cytat(viking @ 26.06.2017, 15:49:12 ) *
Nie lepiej zacząć korzystać z jakiegoś service managera? Wtedy zawsze kiedy potrzebujesz zwraca 1 instancję.



Rozwiniesz, albo zapodasz jakiegos linka do madrej strony?
viking
Na przykładzie zenda https://github.com/zendframework/zend-servicemanager
markuz
Dependency Injection + Dependency Injection Container - Google
Singleton to antywzorzec - stosujesz go zazwyczaj wtedy jak do już istniejącego kodu spaghetti chcesz dodać nowe, niezależne elementy.

Jednak jak jeszcze masz mało praktyki to możesz śmiało go stosować - po pewnym czasie sam dojdziesz do tego, że korzystanie z Dependency Injection to jedyne rozsądne wyjście - mi to zajeło kilka lat.
Pyton_000
http://php-di.org/
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-2024 Invision Power Services, Inc.