В контрактах на разработку программного обеспечения более ценны, чем их реализации.
Вот несколько причин:
Вы можете тестировать классы, которые зависят от интерфейса, не полагаясь на реализацию интерфейса (который сам по себе может быть багги). Пример с 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
Вы можете написать класс, который использует контракт без необходимости реализации, например,
function dependentFunction(MyInterface $interface) {
$interface->contractMethod(); // Assume it's there even though it's not yet implemented.
}
Имейте один контракт, но несколько вариантов осуществления.
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
Тогда есть также тот факт, что его легче документировать интерфейсы, так как нет никаких реальных реализаций там так они все еще доступны для чтения.
В контрактах на разработку программного обеспечения более ценны, чем их реализации. Вы можете написать класс, который использует контракт в возрасте до того, как кто-то действительно создает реализацию контракта и все еще сможет проверить его, насмехаясь. Затем существует множество различных реализаций (например, кеширование контракта с использованием файла, redis, db и т. Д.) – apokryfos
Итак, Laravel создал интерфейсы, чтобы написать тесты перед выполнением реализаций? –
Почему создатель laravel написал интерфейсы - вопрос для него. Я могу только сказать, что написание интерфейсов - это просто хорошая практика кодирования для большого программного проекта. – apokryfos