2017-02-20 6 views
5

Ich ging durch die Laravel's Illuminate und ich bemerkte, dass es eine Schnittstelle für fast jede Implementierung hat.Warum hat Laravel einen Vertrag/eine Schnittstelle für fast alles?

Was ist der genaue Zweck? Hat es eine aktuelle Verwendung oder ist es eher möglich, den Rahmen so skalierbar wie möglich zu machen?

+0

In der Softwareentwicklung sind Verträge wertvoller als ihre Implementierungen. Sie können eine Klasse schreiben, die einen Vertrag verwendet, bevor jemand tatsächlich eine Implementierung des Vertrags erstellt und trotzdem in der Lage ist, ihn zu testen. Dann gibt es die verschiedenen Implementierungen (z. B. Caching-Vertrag mit Datei, Redis, Db etc) – apokryfos

+0

Also Laravel erstellt die Schnittstellen, um Tests zu schreiben, bevor Sie die Implementierungen machen? –

+0

Warum der Schöpfer von Laravel Schnittstellen geschrieben hat, ist eine Frage für ihn. Ich kann Ihnen nur sagen, dass das Schreiben von Schnittstellen nur eine gute Programmierpraxis für ein großes Software-Projekt ist. – apokryfos

Antwort

5

In der Softwareentwicklung sind Verträge wertvoller als ihre Implementierungen.

Hier ein paar Gründe:

  1. Sie können Klassen testen, die, ohne sich auf eine Schnittstelle Implementierung einer Schnittstelle abhängen (die selbst fehlerhaft sein kann). Beispiel mit 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. Sie eine Klasse schreiben, die einen Vertrag verwendet, ohne eine Implementierung zu benötigen z.B.

    function dependentFunction(MyInterface $interface) { 
        $interface->contractMethod(); // Assume it's there even though it's not yet implemented. 
    } 
    
  3. haben einen einzigen Vertrag, sondern mehrere Implementierungen.

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

Laravel bietet Unterstützung der letzte seiner Service-Container wie folgt verwendet wird:

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

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

Dann gibt es auch die Tatsache, dass es einfacher Schnittstellen zu dokumentieren, da gibt es keine tatsächlichen Implementierungen in dort so Sie sind immer noch lesbar.

Verwandte Themen