Какой смысл интерфейсов в слабо типизированном языке, таком как PHP? - PullRequest
5 голосов
/ 03 мая 2010

Я никогда не мог понять это. Если ваш язык не проверяет тип, какие преимущества предоставляют интерфейсы?

Ответы [ 9 ]

10 голосов
/ 03 мая 2010

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

В традиционной ООП PHP вы должны были полагаться на что-то вроде следующего, чтобы выдавать ошибку времени выполнения:

class Base_interface {
    function implement_me() { assert(false); }
}

class Child extends Base_interface {
}

С интерфейсом вы получаете немедленную обратную связь, когда один из ваших интерфейсовПодклассы не реализуют такой метод, в то время как подкласс объявлен, а не позже во время его использования.

4 голосов
/ 03 мая 2010

Взято из по этой ссылке (приятно подводит итог):

  • Интерфейсы позволяют определять / создавать общая структура для ваших классов - установить стандарт для объектов.
  • Интерфейсы решают проблему одиночное наследство - они позволяют вам ввести "качества" из нескольких источники.
  • Интерфейсы обеспечивают гибкость базовая / корневая структура, которую вы не делаете получить с классами.
  • Интерфейсы хороши, когда у вас есть несколько кодеров, работающих над проектом ; Вы можете создать свободную структуру для программистов, чтобы следовать и позволить они беспокоятся о деталях.
2 голосов
/ 03 мая 2010

Лично я нахожу интерфейс аккуратным решением при создании слоя DataAccess, который должен поддерживать несколько СУБД. Каждая реализация СУБД должна реализовывать глобальный интерфейс DataAccess с такими функциями, как Query, FetchAssoc, FetchRow, NumRows, TransactionStart, TransactionCommit, TransactionRollback и т. Д. Поэтому, когда вы расширяете свои возможности доступа к данным, вы вынуждены использовать общую определенную функциональную схему, чтобы вы приложение не сломается в какой-то момент, потому что вы решили, что функция Query теперь должна называться execQuery.

Интерфейс помогает вам развиваться в целом:)

1 голос
/ 03 мая 2010

Типы выполняют три разные функции:

  • дизайн
  • Документация
  • проверка фактического типа

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

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

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

Теперь к третьему пункту: PHP на самом деле делает проверки типов интерфейсов. То, что он проверяет их во время выполнения, еще не означает, что он вообще не проверяет тип .

И, фактически, он даже не проверяет их во время выполнения, он проверяет их при времени загрузки , что происходит до времени выполнения. И разве «проверка типов не происходит во время выполнения, но до этого» в значительной степени само определение статической проверки типов?

0 голосов
/ 03 мая 2010

Подсказка типов в сигнатурах функций / методов позволяет вам гораздо больше контролировать, как класс взаимодействует со своей средой.

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

Тип подсказки дает вам инструмент для обеспечения совместимости без каких-либо раздутых, рукописных проверок. Это также позволяет вашим классам рассказать миру, что они могут сделать и где они вписываются.

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

0 голосов
/ 03 мая 2010

Может быть слабо напечатан, но для методов есть подсказка типа: function myFunc(MyInterface $interface) Кроме того, интерфейсы помогают в тестировании и отделении кода.

0 голосов
/ 03 мая 2010

На мой взгляд, нет смысла, нет необходимости и нет смысла. Такие вещи, как интерфейсы, модификаторы видимости или подсказки типов, предназначены для обеспечения «правильности» программы (в некотором смысле) без ее фактического запуска. Поскольку это невозможно в динамическом языке, таком как php, эти конструкции по сути бесполезны. Единственная причина, по которой они были добавлены в php - это то, что он больше похож на java, что делает язык более привлекательным для «корпоративного» рынка.

Забыл добавить: без комментариев отстой. //

0 голосов
/ 03 мая 2010

Интерфейсы, часто используемые при модульном тестировании (тест-дизайн).

также предлагает более стабильный код. интерфейсы также используются для поддержки итераторов (например, поддержка foreach для объектов) и компараторов.

0 голосов
/ 03 мая 2010

Вы получаете ошибки, если вы не добавили необходимые методы с точно такой же подписью.

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