Эй там!
Большинство разработчиков говорят “всегда кодируйте интерфейс”. Но что это значит и почему? В этой статье я собираюсь обсудить, что такое интерфейсы и почему обучение разработке через интерфейсы является ступенькой к реализации шаблонов проектирования.
Что такое интерфейс
По определению интерфейс – это точка, где встречаются и взаимодействуют две системы, субъекты, организации. Подумайте о веб-сайте блога. Он имеет интерфейс (UI), который посетитель использует для чтения контента. В программировании, особенно в ООП, интерфейс – это способ определить структуру того, как класс должен быть реализован и использован. Вот почему некоторые интерфейсы называют контрактами. Как только контракт будет определен, вы должны будете следовать ему, или вас засудят, или мы получим самое страшное для нас сообщение об ошибке call to undefined method
!
Давайте приведем быстрый и простой пример интерфейса, чтобы показать вам, как они выглядят.
interface LightSwitchInterface
{
public function on();
public function off();
}
Здесь мы определили контракт для выключателя света, какие действия он может выполнять. Мы можем либо включить его, либо выключить. Это означает, что вся реализация выключателей света должна следовать этому контракту. Давайте посмотрим на некоторые реализации этого LightSwitchInterface
.
Реализация предназначена только для демонстрационных целей.
// ManualLightSwitch.php
class ManualLightSwitch implements LightSwitchInterface
{
public function on()
{
// Actual implementation
// 1. Walk near the switch
// 2. Raise your right hand index finger,
// 3. Press the part that is elevated.
}
public function off()
{
// Just follow the same steps
$this->on();
}
}
// RemoteLightSwitch.php
class RemoteLightSwitch implements LightSwitchInterface
{
public function on()
{
// Do some awesome networking to turn on the light
}
public function off()
{
// Do some awesome networking to turn off the light
}
}
// Human.php
class Human
{
public function dance(LightSwitchInterface $switch)
{
$tired = false;
while($tired) {
$switch->on();
sleep(10);
$switch->off();
sleep(10);
$tired = true;
}
}
}
$human = new Human();
$human->dance(new ManualLightSwitch());
$human->dance(new RemoteLightSwitch());
Вот оно, пожалуйста. Теперь мы определили 2 реализации программы LightSwitchInterface
и Human, чтобы сделать что-то с этими переключателями. Теперь мы можем публиковаться на GitHub под лицензией MIT!
Но вы можете спросить, зачем мне нужен интерфейс? Разве я не могу просто определить эти реализации без интерфейса? Да, ты можешь, но мы люди и совершаем много ошибок. Вы можете забыть, как вы реализовали ManualLightSwitch
и для чего RemoteLightSwitch
вы сделаете что-то вроде:
// RemoteLightSwitch.php
class RemoteLightSwitch
{
public function turnOn() {}
public function turnOff() {}
}
Без интерфейса и растущего числа реализаций того, как включать или выключать свет, мы будем иметь несоответствия в нашей кодовой базе и в конечном итоге приведем к багам.
// Human.php
$human = new Human();
$human->dance(new ManualLightSwitch());
// Using remote switch will cause an error!
$human->dance(new RemoteLightSwitch());
$human->dance(new RemoteLightSwitch());
будет бросать ошибку, так как человек знает только то, что on off
и метод. Вот почему нам нужен контракт / интерфейс, чтобы избежать подобных несоответствий.
Ступенька к проектированию паттернов
Обучение разработки через интерфейсы, IMO, является ступенькой к пониманию и реализации различных шаблонов проектирования. Шаблоны проектирования-это распространенный способ решения проблемы. Эти шаблоны указывают нам, как структурировать наш код и как он должен себя вести. То есть нам нужны интерфейсы, чтобы заставить наш код следовать определенной структуре-контрактам! Мы погрузимся в детали с реальными примерами в будущих статьях!