8

Próbuję używać Dependency Injection tak często, jak to możliwe, ale mam problemy, jeśli chodzi o takie krótkotrwałe zależności.Czy abstrakcyjne fabryki używają "nowego"?

Na przykład, powiedzmy, że mam blogu menedżera obiektu, który chciałby, aby wygenerować listę blogów, które to znajdują się w bazie danych. Dostępne opcje (o ile wiem) to:

  1. nowy blog();
  2. $ this-> loader-> blog();
    • obiekt loader tworzy różne inne typy obiektów, takich jak obiekty bazy danych, filtrów tekstowych itp
  3. $ this-> blogEntryFactory-> create();

Jednak nr 1 jest zły, ponieważ tworzy silne połączenie. # 2 nadal wydaje się zły, ponieważ oznacza, że ​​fabryka obiektów musi zostać wcześniej wstrzyknięta - odsłaniając wszystkie inne obiekty, które może stworzyć.

Numer 3 wydaje się być w porządku, ale jeśli użyję # 3, czy wstawię "nowe" słowa kluczowe do samego bloga EnteryFactory, LUB, czy wprowadzę program ładujący do blogaEntryFactory i użyję programu ładującego?

Jeśli mam wiele różnych fabryk, takich jak blogEntryFactory (na przykład mogę mieć userFactory i commentFactory) wydaje się, że wprowadzenie słowa kluczowego "new" w tych wszystkich różnych fabrykach spowoduje problemy z zależnościami.

Mam nadzieję, że to ma sens ...

UWAGA

miałem kilka odpowiedzi na temat, jak to jest konieczne w tym konkretnym przykładzie blogu, ale istnieją w rzeczywistości, przypadki, w których należy użyj Wzorca Abstrakcyjnej Fabryki, i to jest punkt, do którego dążę. Czy używasz w tym przypadku "nowego", czy też coś innego?

+0

Gdybym nie wyjaśni to prawidłowo lub wystarczająco dokładnie, proszę dać mi znać, a postaram się wyjaśnić – johnnietheblack

+0

Nigdy nie widziałem Dependency Injection jest używany w klasach modelowych. O ile klasa 'Blog' nie zawiera jakiejś logiki biznesowej (której modele rzadko się zdarzają), nie ma sensu próbować sprowadzać się do niej - nie ma żadnego zachowania, z którym można się połączyć. (Jest tylko struktura podmiotu, ale to się nie zmieni.) – millimoose

+0

Po pierwsze, dziękuję za komentarz ... więc czy mówicie, że BlogManager powinien/mógł nazwać "nowy blog()"? – johnnietheblack

Odpowiedz

4

Nie jestem ekspertem, ale zamierzam to załatwić. Zakłada się, że Blog to tylko obiekt modelu danych, który działa jako kontener dla niektórych danych i zostaje wypełniony przez kontroler (new Blog nie ma większego znaczenia). W tym przypadku Blog jest liściem wykresu obiektu, a użycie new jest w porządku. Jeśli zamierzasz przetestować metody, które muszą utworzyć Blog, musisz jednocześnie przetestować tworzenie Blog, a użycie pozornego obiektu nie ma sensu. Blog nie utrzymuje się poza tą metodą.

Jako przykład powiedzmy, że PHP nie ma konstrukcji tablicy, ale ma obiekt kolekcji. Czy zadzwoniłbyś pod numer $this->collectionsFactory->create(), czy byłbyś zadowolony, gdybyś powiedział new Array;?

+0

Oświecenie z wyjaśnieniem liści. – johnnietheblack

+1

Tandu, jak już dodałem powyżej, chociaż ten scenariusz może nie zasługiwać na fabrykę, istnieją scenariusze, w których fabryki są zasłużone. W takich przypadkach używasz "nowego" w Fabryce, czy robisz coś innego? – johnnietheblack

Powiązane problemy