Я просматривал Laravel’s Illuminate и заметил, что он имеет интерфейс почти для каждой реализации.
Какова точная цель этого? Имеет ли он какое-либо текущее применение, или это больше для того, чтобы сделать структуру максимально масштабируемой?
В разработке программного обеспечения контракты являются более ценными, чем их реализации.
Вот несколько причин:
Вы можете тестировать классы, которые зависят от интерфейса, не полагаясь на реализацию интерфейса (которая сама по себе может содержать ошибки).
Пример с 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
Кроме того, есть еще и тот факт, что проще документировать интерфейсы, поскольку там нет реальных реализаций, поэтому они все еще читаемы.
Других решений пока нет …