Wpis z mikrobloga

#programowanie #php

Mam klase singleton odpowiedzialna za wysylanie requestow do zewnetrznego api

Podobno singleton jest zly, ale wydaje mi sie ze nie w tym przypadku. Po co mi wiecej instancji? Instancjuje raz, podaje klucze, i potem wysylam requesty z roznych miejsc

Czegos nie dostrzegam?
  • 25
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@usmiechniety_syzyf zależy co masz na myśli poprzez singleton, część ludzi myśli że jest to jeden obiekt danej klasy na całą aplikacje który jest przekazywany za pomocą Di do innych klas, to jest okej, natomiast jeśli masz coś w stylu Class::getInstance() no to tego trza unikać
  • Odpowiedz
Po co mi wiecej instancji?


@usmiechniety_syzyf: Kto Ci każe robić więcej instancji?
Singleton blokuje taką możliwość, ale to nie znaczy, że jak zamierzasz mieć tylko jedną instancję w swoim przypadku użycia, to masz robić od razu singleton. Możesz przecież po prostu nie tworzyć kolejnych instancji zwykłej klasy.
  • Odpowiedz
część ludzi myśli że jest to jeden obiekt danej klasy na całą aplikacje który jest przekazywany za pomocą Di do innych klas,


@Jurigag: True story. Ostatnio z taką personą była mi dane rozmawiać. ()
  • Odpowiedz
@usmiechniety_syzyf: @Jurigag: @Jare_K: takie korzystanie z singletonów jest sprzeczne z programowaniem obiektowym. OP zakłada, że mamy obiekt który ma jakiś stan i bazujące na nim zachowania. Jeśli tworzymy singleton, to najczęściej albo do przechowywania wartości globalnych (co czasem ma sens) albo jako kontener na metody (często wtedy klasa ma w nazwie Service albo Manager) a wtedy pod płaszczykiem obiektów uprawiamy programowanie proceduralne
  • Odpowiedz
@dog_meat: Zależy gdzie wstrzykujesz ten kontener/service locator. Jeśli do obiektu domenowego to masz schowaną i nieokreśloną (nawet w runtime jak kogoś poniesie fantazja) zależność, ale do fabryk, czy obiektów zorientowanych na tworzenie złożonych instancji można bez problemu - tam nie ma bezpośrednich zależności a typów pilnują konstruktory klas w tworzonej strukturze (fail early).
  • Odpowiedz
@qwertyu: Nie do końca:, za https://pl.wikipedia.org/wiki/Singleton_(wzorzec_projektowy) :

Singleton – kreacyjny wzorzec projektowy, którego celem jest ograniczenie możliwości tworzenia obiektów danej klasy do jednej instancji oraz zapewnienie globalnego dostępu do stworzonego obiektu


Samo utrzymywanie jednej instancji jest okej, dowolny kontener zależności jest w stanie to zrobić, natomiast sam access globalny kłóci się z wieloma innymi - powszechnie uznawanymi za dobre - zasadami, przede wszystkim z Dependency Inversion
  • Odpowiedz
@qwertyu: Nie no jasne, ale przecież nie o tym była rozmowa. Rozmowa była o tym, że utrzymywanie jednej instancji to nie jest singleton, a singleton jak najbardziej obejmuje utrzymywanie jednej instancji. Ban na operator new to raczej poboczna do tematu praktyka
  • Odpowiedz
@usmiechniety_syzyf: A tak jeszcze odnośnie pojedynczej instancji - nawet jeśli nie pochodzi od wzorca Singleton, to tak samo trzeba się wystrzegać mutowalności. Inaczej masz ukryte zależności strukturalne (kolejność interakcji) podobne do global state, tyle tylko, że bardziej formalnie rozrzucone.
  • Odpowiedz
@usmiechniety_syzyf: W takim razie @Jurigag chyba trafił w punkt.

Niech zgadnę. Używasz Kurvalera (a.k.a. Laravela). Rozpoznaję po słowie "binduję" oraz właśnie złym pojmowaniu singletona. To piękny przykład szerzenia bredni przez ten framework.

Singleton to klasa, która ma prywatny konstruktor, statyczną metodę publiczną (zwykle getInstance()) do uzyskiwania instancji i statyczny, prywatny atrybut posiadający referencję o tego obiektu. Czyli nie da się zrobić new Foo(), bo konstruktor jest prywatny,
  • Odpowiedz