Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zmuszenie do korzystania z fabryki
q.michal
post 26.06.2017, 13:27:30
Post #1





Grupa: Zarejestrowani
Postów: 111
Pomógł: 1
Dołączył: 24.12.2013

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Crozin
post 26.06.2017, 14:23:23
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
q.michal
post 26.06.2017, 14:25:45
Post #3





Grupa: Zarejestrowani
Postów: 111
Pomógł: 1
Dołączył: 24.12.2013

Ostrzeżenie: (0%)
-----


Np. obsluga bazy danych, konfiguracji globalnej, rejestr, ...
Go to the top of the page
+Quote Post
nospor
post 26.06.2017, 14:28:07
Post #4





Grupa: Moderatorzy
Postów: 36 429
Pomógł: 6289
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
q.michal
post 26.06.2017, 14:40:18
Post #5





Grupa: Zarejestrowani
Postów: 111
Pomógł: 1
Dołączył: 24.12.2013

Ostrzeżenie: (0%)
-----


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.

Ten post edytował q.michal 26.06.2017, 14:41:29
Go to the top of the page
+Quote Post
viking
post 26.06.2017, 14:49:12
Post #6





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1113
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
q.michal
post 26.06.2017, 14:53:04
Post #7





Grupa: Zarejestrowani
Postów: 111
Pomógł: 1
Dołączył: 24.12.2013

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
viking
post 26.06.2017, 15:05:11
Post #8





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1113
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
markuz
post 26.06.2017, 15:09:50
Post #9





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post 27.06.2017, 07:57:41
Post #10





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


http://php-di.org/
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.03.2024 - 07:50