Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Interfejsy i klasy abstrakcyjne
eerie
post 2.06.2020, 09:29:09
Post #1





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

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


Przepraszam za moje liczne pytania, ale nie chcę zacząć programować źle i potem wszystko poprawiać.

Możemy dziedziczyć po klasach abstrakcyjnych. Np. Słoń po klasie Zwierzę. I klasy abstrakcyjne mogą, ale nie muszą, implementować swoje metody. Poza tym klasy abstrakcyjne chyba niczym nie różnią się od zwykłych klas.

Interfejsy natomiast opisują pewne cechy. Powinny być małe i konkretne. Interfejsy mogą dziedziczyć po innych, nawet kilku, interfejsach.

Ostatnia zasada SOLID (Dependency Inversion) mówi, iż wszystkie zależności powinny być w jak największym stopniu zależne od abstrakcji. Powinniśmy więc stosować interfejsy wszędzie tam, gdzie to jest możliwe. Szczególnie w parametrach funkcji.

Jednak stosowanie interfejsów dosłownie wszędzie jest uciążliwe. Gdy tworzę obiekt konkretnej klasy, łatwiej jest zwrócić metodą obiekt tej klasy od interfejsu. Dlatego mam wątpliwość, jak bardzo powszechne powinno być stosowanie interfejsów?

Dlatego wypunktuję kilka moich wątpliwości odnośnie tworzenia klas abstrakcyjnych i interfejsów:

1. Czyli klasa abstrakcyjna nie różni się od zwykłej klasy praktycznie niczym? Możemy jedynie zrezygnować z implementacji części metod i zrobić to w klasie dziedziczącej. Do tego klasy abstrakcyjne nie mogą mieć tworzonych obiektów...

2. Czy interfejsy powinienem tworzyć i implementować dosłownie wszędzie, gdzie się tylko da? Co decyduje o tym, iż w parametrze metody używamy interfejsu zamiast konkretnej klasy? Kiedy metoda ma zwracać klasy, a kiedy interfejsy?

3. Co jest nieprawidłowego w stosowaniu typów object zamiast interfejsów? Typ object zapewnia chyba jeszcze większy stopień abstrakcji. Jeśli w metodzie tworzę jakiś obiekt (np. Model), to dlaczego nie mogę zwrócić typu object, a tylko interfejs?

4. Rozumiem, iż w klasach abstrakcyjnych i interfejsach też powinienem deklarować "declare(strict_types=1);" i stosować "namespace" oraz "use"? Bo zauważyłem, iż PHP nie zawsze zwraca błąd, gdy brakuje "use" w interfejsach...

5. Czy deklaracja metody w interfejsie powinna też podawać, jakiego typu przyjmuje parametry i jakiego typu zwraca wartość? Bo PHP nie zwraca błędu, gdy nie poda się, jakiego typu metoda zwraca wartość. Ale podanie typu jest akceptowane...

6. Czy tworzenie interfejsu, który nie definiuje żadnej metody, jest dopuszczalne i ma sens? Bo chcę podać, iż moja metoda getRepository() zwraca RepositoryInterface, ale klasy repozytoriów są totalnie różne i zawierają totalnie różne metody.

7. Czy jest dopuszczalne, aby mój interfejs RepositoryInterface deklarował, iż klasy go implementujące mają zawierać konstruktor "public function __construct(ModelInterface $model);"? Czy zamiast tego mogę w ogóle nie deklarować żadnej metody?
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: 23.04.2024 - 22:17