Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Object-oriented programming _ Zmuszenie do korzystania z fabryki

Napisany przez: q.michal 26.06.2017, 13:27:30

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?

Napisany przez: Crozin 26.06.2017, 14:23:23

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 http://php.net/manual/pl/language.oop5.traits.php.

Napisany przez: q.michal 26.06.2017, 14:25:45

Np. obsluga bazy danych, konfiguracji globalnej, rejestr, ...

Napisany przez: nospor 26.06.2017, 14:28:07

Baza danych nie powinna byc singletonem. Dosyc czesto w aplikacjacj korzysta sie z wielu baz danych

Napisany przez: q.michal 26.06.2017, 14:40:18

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.

Napisany przez: viking 26.06.2017, 14:49:12

Nie lepiej zacząć korzystać z jakiegoś service managera? Wtedy zawsze kiedy potrzebujesz zwraca 1 instancję.

Napisany przez: q.michal 26.06.2017, 14:53:04

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?

Napisany przez: viking 26.06.2017, 15:05:11

Na przykładzie zenda https://github.com/zendframework/zend-servicemanager

Napisany przez: markuz 26.06.2017, 15:09:50

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.

Napisany przez: Pyton_000 27.06.2017, 07:57:41

http://php-di.org/

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)