2017-02-20 3 views
5

Я проходил через Larvel's Illuminate, и я заметил, что у него есть интерфейс почти для каждой реализации.Почему у Laravel есть контракт/интерфейс практически для всего?

Какова цель этого? Имеет ли он какое-либо текущее использование, или это больше, чтобы сделать структуру максимально масштабируемой?

+0

В контрактах на разработку программного обеспечения более ценны, чем их реализации. Вы можете написать класс, который использует контракт в возрасте до того, как кто-то действительно создает реализацию контракта и все еще сможет проверить его, насмехаясь. Затем существует множество различных реализаций (например, кеширование контракта с использованием файла, redis, db и т. Д.) – apokryfos

+0

Итак, Laravel создал интерфейсы, чтобы написать тесты перед выполнением реализаций? –

+0

Почему создатель laravel написал интерфейсы - вопрос для него. Я могу только сказать, что написание интерфейсов - это просто хорошая практика кодирования для большого программного проекта. – apokryfos

ответ

5

В контрактах на разработку программного обеспечения более ценны, чем их реализации.

Вот несколько причин:

  1. Вы можете тестировать классы, которые зависят от интерфейса, не полагаясь на реализацию интерфейса (который сам по себе может быть багги). Пример с 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. Вы можете написать класс, который использует контракт без необходимости реализации, например,

    function dependentFunction(MyInterface $interface) { 
        $interface->contractMethod(); // Assume it's there even though it's not yet implemented. 
    } 
    
  3. Имейте один контракт, но несколько вариантов осуществления.

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

Laravel предлагает поддержку последнего, используя свой контейнер службы следующим образом:

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

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

Тогда есть также тот факт, что его легче документировать интерфейсы, так как нет никаких реальных реализаций там так они все еще доступны для чтения.

Смежные вопросы