Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Kiedy wstrzykiwać jako interfejsy?
eerie
post 28.10.2020, 11:54:13
Post #1





Grupa: Zarejestrowani
Postów: 81
Pomógł: 0
Dołączył: 3.08.2017

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


Mam wątpliwość odnośnie deklaracji typów wstrzykiwanych do np. kontrolera obiektów. Jakiś czas temu dowiedziałem się, że gdy np. moja metoda zwraca tylko obiekt konkretnej klasy, to powinienem zadeklarować jako typ tę konkretną klasę. Jeśli zwraca jakiś obiekt z grupy klas o podobnej właściwości, to powinienem jako typ wskazać wspólny interfejs, który implementują. Gdy zwraca totalnie różne i niepowiązane klasy, to można użyć typu "object". A jak jest przy wstrzykiwaniu w konstruktorze np. do kontrolera? Powinienem wstrzykiwać obiekty wskazując jako typ interfejsy czy starczy podanie konkretnej klasy? Pytam pod kątem testów jednostkowych w np. PHPUnit. Przeczytałem w artykule na temat zasad SOLID, iż należy używać możliwie największego typu abstrakcji. Jednak deklarowanie wszędzie, gdzie się tylko da, jako typów interfejsów jest dość uciążliwe i nie mam pewności, czy właściwe. Czy nie wystarczy, jeśli użyję jako typ interfejsu tylko w sytuacjach, gdy chcę używać testów? A dla całej reszty przypadków wstrzykiwać obiekty podając jako typ konkretną klasę... Jak to jest? Kiedy muszę deklarować jako typ interfejsy, a kiedy mogę deklarować konkretne klasy?
Go to the top of the page
+Quote Post
SmokAnalog
post 28.10.2020, 12:05:44
Post #2





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


To jest bardzo dobre pytanie i odpowiem z mojej dzisiejszej perspektywy.

Jest wielu programistów, którzy mają fetysz interfejsów. Uznają kod nakazujący wstrzykiwać konkretne klasy za zło. Kiedyś też dałem się na to nabrać, dopóki nie dowiedziałem się, że wiele języków, w tym nawet Python, po prostu... nie mają czegoś takiego jak interfejs. Zrozumiałem, że wszystko trzeba robić z głową i nie masturbować się kodem.

That being said, interfejsy czasem są naprawdę super. Szczególnie, gdy testujesz swój kod lub naprawdę piszesz jakieś klasy, które będą używane w wielu projektach. Zawsze zadaj sobie pytanie, czy na pewno jest konieczne, żeby wiele różnych typów obiektów korzystało z tej klasy? Najczęściej odpowiedź brzmi "nie". Wtedy nie ma nic złego w type-hintowaniu po klasie. Ale gdy już nie jest to tak oczywiste, wtedy warto rozważyć stworzenie interfejsu i wstrzykiwanie po nim. Daje to więcej elastyczności, ale tak jak powiedziałem - nie zawsze jest potrzebne, a nie chcemy przerostu formy nad treścią.

Bardzo ciekawie sprawę rozwiązuje Laravel. Gdy masz type hint, duża część frameworka automatycznie szuka tej konkretnej klasy/interfejsu w kontenerze. Czyli np. jeśli masz metodę, która ma type hint na interfejs App\Contracts\Creature (w Laravelu interfejsy nazywa się kontraktami), to framework sprawdza czy nie przypisałeś czegoś do kontenera pod nazwą App\Contracts\Creature. Jest to genialne, znowu, przy testowaniu. Wystarczy w środowisku testowym określić, że domyślnie za App\Contracts\Creature jest podstawiona jakaś atrapa obiektu, dzięki czemu cała aplikacja może korzystać tymczasowo z określonej instancji. Testowanie to główne zastosowanie całej tej zabawy w interfejsy.
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: 29.03.2024 - 16:24