Почему у Laravel есть контракт / интерфейс для почти всего?

Я просматривал Laravel’s Illuminate и заметил, что он имеет интерфейс почти для каждой реализации.

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

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

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

5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector