Интерфейсы или Абстрактные классы?

PHP разработчики имеют широкий набор полезный инструментов для объектно-ориентированной разработки. Начиная от предметных моделей, заканчивая концепциями абстрактных классов и интерфейсов. Разработчик может использовать каждый инструмент по-своему и предложить свой набор интересных решений.

Основная проблема среди разработчиков, которая вводит в замешательство, это какой инструмент использовать. И в этом нет ничего необычного, ведь часто разработчики используют либо неверный инструмент, либо верный, но неверным способом.

Давайте рассмотрим использование абстрактных классов против интерфейсов при объектной разработке.

Преимущества абстрактных классов

Абстрактных класс – это класс который не может быть инициализирован напрямую. Вместо этого он должен быть расширен неким дочерним классом, который реализует все его абстрактные методы. Абстрактный класс, также, может реализовывать некоторые методы, которые будут доступны в дочернем классе, но на самом деле реализовывать конкретные тут совсем необязательно.

Пример:

В этом примере и метод и сам класс помечены как абстрактные. В абстрактном методе объявлена его сигнатура, но вместо открывающейся скобки метода, в конце стоит точка с запятой. Это очень похоже на то, как должны быть определены интерфейсы, но разница в том, что в абстрактных классах разработчик может определить некоторые конкретные методы (что в примере не сделано). Разработчик, также, может определить защищенные (protected) абстрактные члены, тогда как интерфейсы обязаны содержать только публичные (public) методы.

Если вы попытаетесь инициализировать такой класс, не расширив его перед этим, то вы получите Fatal error. Аналогично, если бы вы расширили класс и не пометили дочерний класс абстрактным или реализовали все его абстрактные методы. PHP и тут выдаст Fatal error.

Преимущества интерфейсов

Абстрактные классы могут  с первого взгляда показаться хорошей заменой интерфейсам: вы можете определять защищенные методы и реализовывать некоторые из них, вы можете наследовать от абстрактного класса как от базового. Однако, все не так просто.

PHP позволяет наследовать только от одного класса (множественное наследование не поддерживается), то есть дочерний класс может иметь только одного родителя. В отличии от интерфейсов, ведь один класс может реализовывать множество интерфейсов. В этом случае, имея CountableInterface и IterableInterface, можно реализовать оба в одно классе или только один из них. Это упрощает создание сложных объектов.

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

Что же выбрать?

Разработчики должны выбирать инструменты, причем делать это как можно более продумано, чтобы избежать проблем с изменением больших участков кода. В таких моментах, имеет смысл использовать интерфейсы до тех пор, пока абстрактные классы не смогут выполнить то, что нужно  на 100%. Но все же, использование абстрактных классов не так широко, и стоит использовать интерфейсы, за исключением тех случаев, когда вы не можете избавиться от использования абстрактных классов.

Источник

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">