2017-02-20 28 views
5

Przeszedłem przez iluminację Laravella i zauważyłem, że ma interfejs dla prawie każdej implementacji.Dlaczego Laravel ma umowę/interfejs dla prawie wszystkiego?

Jaki jest dokładny cel tego? Czy ma jakieś aktualne zastosowanie, czy też bardziej czyni możliwym skalowalność w miarę możliwości?

+0

W kontraktach inżynierii oprogramowania są cenniejsze niż ich implementacje. Możesz napisać klasę, która używa wieku umowy, zanim ktoś faktycznie stworzy implementację umowy i nadal będzie mógł ją przetestować przez kpiny. Istnieje wiele różnych implementacji (np. Buforowanie umowy za pomocą pliku, redis, db itp.). – apokryfos

+0

. Więc Laravel stworzył interfejsy, aby napisać testy przed wprowadzeniem implementacji? –

+0

Dlaczego twórca laravel napisał interfejsy to dla niego pytanie. Mogę tylko powiedzieć, że pisanie interfejsów to po prostu dobra praktyka kodowania dla dużego projektu oprogramowania. – apokryfos

Odpowiedz

5

W umowach inżynierii oprogramowania są cenniejsze niż ich implementacje.

Oto kilka powodów:

  1. można przetestować klas, które zależą od interfejsu nie opierając się na implementacji interfejsu (który sam może być wadliwy). Przykład z PHPUnit:

    //Will return an object of this type with all the methods returning null. You can do more things with the mock builder as well 
    $mockInterface = $this->getMockBuilder("MyInterface")->getMock(); 
    $class = new ClassWhichRequiresInterface($mockInterface); 
    //Test class using the mock 
    
  2. Można napisać klasy, która używa umowę bez konieczności implementacji np

    function dependentFunction(MyInterface $interface) { 
        $interface->contractMethod(); // Assume it's there even though it's not yet implemented. 
    } 
    
  3. Mieć jedną umowę, ale wiele wdrożeń.

    interface FTPUploader { /* Contract */ } 
    
    class SFTPUploader implements FTPUploader { /* Method implementation */ } 
    class FTPSUploader implements FTPUploader { /* Method implementation */ } 
    

laravel oferuje wsparcie ostatnim użyciu jego Container Service następująco:

$app->bind(FTPUploader::class, SFTPUploader::class); 

resolve(FTPUploader::class); //Gets an SFTPUploader object 

Potem jest również fakt, że jej łatwiej udokumentować interfejsy ponieważ nie ma rzeczywiste implementacje tam tak nadal są czytelne.