Является ли интерфейс php избыточным для приложений, созданных одним разработчиком? - PullRequest
7 голосов
/ 26 августа 2010

Мой вопрос: в PHP действительно полезны интерфейсы для разработчиков, которые сами создают веб-приложения? Разве абстрактный класс не предоставляет все то, что обеспечивает интерфейс?

Если интерфейс - это просто "контракт", разве разработчик не знает, что должен реализовать класс?

Единственное преимущество, о котором я могу думать, это то, что класс может реализовывать несколько интерфейсов, но опять же, насколько это полезно ... когда вы знаете все, что должен реализовать класс. Вы просто заставляете себя реализовать эти методы.

Как вы можете понять, я все еще жду того момента A-HA, когда я действительно пойму, почему интерфейс полезен.

Чтобы обернуть это и сказать проще: когда я должен использовать интерфейсы и почему бы не использовать абстрактные классы вместо этого?

Ответы [ 6 ]

2 голосов
/ 26 августа 2010

То, что вы «знаете», что нужно реализовать, не означает, что вы помните это. Это не значит, что вы никогда не ошибетесь и не опечатаете имя функции. «Контракты» в программировании предназначены не только для того, чтобы один разработчик навязывал вещи другому, но и для обеспечения жесткости кода, который может отлавливать ошибки, которые в противном случае могли бы ускользнуть от радара.

1 голос
/ 26 августа 2010

«Программирование на интерфейсе, а не на реализации» - это принцип, представленный GoF в их книгах Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения .

Цитата Эриха Гамма на принципе:

Как только вы зависите только от интерфейсов, вы не связаны с реализацией.Это означает, что реализация может варьироваться, и это здоровые отношения зависимости.Например, для целей тестирования вы можете заменить тяжелую реализацию базы данных на легковесную фиктивную реализацию.[…]

Таким образом, этот подход дает вам гибкость, но он также отделяет действительно ценную часть, дизайн, от реализации, что позволяет отделить клиентов от реализации.Один вопрос заключается в том, следует ли вам всегда использовать для этого интерфейсы Java.Абстрактный класс также хорош.На самом деле абстрактный класс дает вам больше гибкости, когда дело доходит до эволюции.Вы можете добавить новое поведение, не нарушая клиентов.[…]

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

Прочитайте полное интервью здесь

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

Вам также может быть интересно:

и еще немного:

1 голос
/ 26 августа 2010

Вы можете использовать интерфейсы для

  • Подсказки типов в функциях public function foo(IWhatever $x)
  • Для проверки типа $x instanceof IWhatever
  • Для создания макетов объектов в блокеtests $this->getMock('IWhatever')

Конечно, вы также можете использовать абстрактные классы, но если вам на самом деле не нужно определять какой-либо код, вероятно, лучше использовать интерфейс.

0 голосов
/ 15 августа 2014

Некоторое время с тех пор, как об этом спросили, но поскольку функциональность интерфейсов, кажется, озадачивает многих людей - если вы пришли сюда, ищите, попробуйте пример здесь с 500+ голосами. Я нашел это действительно полезным.

Что значит «программировать на интерфейс»?

0 голосов
/ 26 августа 2010

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

Абстрактный класс полезен, когда мы расширяем его в разных классах. Например, метод __construct () общий для всех дочерних классов, но другие методы отличаются.

Наша команда использует эту модель: Интерфейс-> аннотации:> Class1-> Class2

Class1 extends Abstract implements Interface

Class2 extends Abstract implements Interface
0 голосов
/ 26 августа 2010

Когда я должен использовать интерфейсы и почему бы не использовать абстрактные классы вместо этого?

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

Взгляните на различные шаблоны дизайна.http://www.ibm.com/developerworks/library/os-php-designptrns/

РЕДАКТИРОВАТЬ: изменил ссылку для лучшего объяснения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...