• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Interface'y - kiedy stosować?

Object Storage Arubacloud
0 głosów
222 wizyt
pytanie zadane 3 sierpnia 2019 w PHP przez Artek Stary wyjadacz (11,800 p.)

Zastanawiałem się nad zastosowaniem interface'ów w php i natrafiłem na coś takiego :

PRIMARY PURPOSES OF AN INTERFACE:

  • Interfaces allow you to define/create a common structure for your classes – to set a standard for objects.
  • Interfaces solves the problem of single inheritance – they allow you to inject ‘qualities’ from multiple sources.
  • Interfaces provide a flexible base/root structure that you don’t get with classes.
  • Interfaces are great when you have multiple coders working on a project – you can set up a loose structure for programmers to follow and let them worry about the details.

WHEN SHOULD YOU MAKE A CLASS AND WHEN SHOULD YOU MAKE AN INTEFACE?

  • If you have a class that is never directly instantiated in your program, this is a good candidate for an interface. In other words, if you are creating a class to only serve as the parent to other classes, it should probably be made into an interface.
  • When you know what methods a class should have but you are not sure what the details will be.
  • When you want to quickly map out the basic structures of your classes to serve as a template for others to follow – keeps the code-base predictable and consistent. 

https://www.killerphp.com/articles/php-interfaces/

Co o tym sądzicie? Coś dodać, coś ująć?

2 odpowiedzi

+1 głos
odpowiedź 3 sierpnia 2019 przez Bosswell Nałogowiec (36,470 p.)

Interfejsy warto stosować jako type-hint parametru metody, która oczekuje pewnych zależności płynących z tego parametru. Jest to wymuszenie i pewien kontrakt między programistami pracującymi w danym projekcie. A nawet i sobą samym, ponieważ po jakimś czasie możesz zapomnieć o tym, że musisz dostarczyć funkcji jakieś zależności. W momencie testowania gdy zapomnisz uwzględnić danego przypadku, to na produkcji może dojść do błędów. Jeżeli oczekujesz interfejsu a go nie dostaniesz, to po odświeżeniu strony od razu się dowiesz o tym że tego nie zrobiłeś i po prostu podepniesz interfejs pod klasę i zaimplementujesz metody.

Teraz przykład. Załóżmy, że chcesz napisać program, w którym będziesz sterował pojazdem. Implementacja mogłaby wyglądać w ten sposób.

class Car
{
    public function turnLeft(): void
    {
        // code  
    }
}

class Program
{
    public function main($car): void
    {
           $car->turnLeft();
    }
}

Ale nie mamy pewności czy aby na pewno zmienna car w metodzie main() posiada taką funkcje jak turnLeft(). Może to prowadzić do błędów. Aby się upewnić że możemy takiej metody użyć, moglibyśmy zapisać to w ten sposób.

class Car
{
    public function turnLeft(): void
    {
        // code  
    }
}

class Program
{
    public function main(Car $car): void
    {
           $car->turnLeft();
    }
}

Teraz jest już lepiej, ale i tak nie jest to dobrze zbudowana aplikacja. Co jeżeli chcielibyśmy dodać sterowanie innym pojazdem do naszej funkcji main() ? Może zamiast typowania parametru jako Car, powinniśmy pomyśleć o czymś czego dana metoda wymaga do działania, a niekoniecznie martwić się o mechanizmy, które potrzebuje aby była wykonana? W myśl 5 zasady SOLID, parametry powinniśmy uzależniać od abstrakcji.

interface Vehicle
{
    public function turnLeft(): void
}

class Car implements Vehicle
{
    public function turnLeft(): void
    {
        // code  
    }
}

class Motocycle implements Vehicle
{
    public function turnLeft(): void
    {
        // code  
        $this->cośTuMuszęPoliczyć();
    }

    private function cośTuMuszęPoliczyć()
    {
        // code
    }
}

class Program
{
    public function main(Vehicle $vehicle): void
    {
           $vehicle->turnLeft();
    }
}

Tutaj abstrakcja jest dosyć powiązana i zamiast interfejsu Vehicle moglibyśmy zrobić klasę abstrakcyjną z abstrakcyjną metodą turnLeft()

 

Jeżeli używasz IDE np PHPStorm, to dodatkowo zyskasz podpowiedzi co dana zmienna zawiera.

komentarz 6 sierpnia 2019 przez Artek Stary wyjadacz (11,800 p.)
Nie do końca obczaiłem SOLIDne zasady jeszcze, ale na pewno to zrobię i przeczytam jeszcze raz Twój post. Dzięki za obszerną wypowiedź.
+1 głos
odpowiedź 3 sierpnia 2019 przez Ehlert Ekspert (212,670 p.)
Zawsze każdą zależność typu serwis-serwis pokrywam interfejsem. Zmniejsza to zależność, serwisy nie są zależne od siebie, istnieje tylko kontrakt wykonania czegoś.

Taki kod o wiele łatwiej się również testuje. Poza tym mając wzorzec DI wymiana implementacji jest prosta.

Podobne pytania

0 głosów
2 odpowiedzi 1,068 wizyt
pytanie zadane 10 sierpnia 2015 w PHP przez Benek Szeryf (91,010 p.)
0 głosów
1 odpowiedź 270 wizyt
+1 głos
1 odpowiedź 246 wizyt
pytanie zadane 13 kwietnia 2022 w C# przez Nabuchadonozor Gaduła (3,120 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...