[#] Интерфейс vs interface
habrabot(difrex,1) — All
2017-07-31 12:00:05


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



Часто сложность в понимании принципа "программируйте на уровне интерфейса" кроется в концентрации на инструменте, а не на смысле. Из-за наличия в Java ключевого слова `interface`, происходит искажение понимания принципа, и он превращается в "программируйте, используя `interface`". Так как в Python инструмент в виде ключевого слова `interface` отсутствует, некоторые питонисты пропускают этот принцип.



В книге Банды Четырех примеры приводятся на Smalltalk и C++. Оба этих языка не имеют ключевого слова `interface`, но это не мешает авторам применять принцип, используя имеющиеся в распоряжении конструкции языка:


> У манипулирования объектами строго через интерфейс абстрактного класса есть два преимущества:
>
> * клиенту не нужно иметь информации о конкретных типах объектов, которыми он пользуется, при условии, что все они имеют ожидаемый клиентом интерфейс;
> * клиенту необязательно "знать" о классах, с помощью которых реализованы объекты. Клиенту известно только об абстрактном классе (или классах), определяющих интерфейс.
>
>
>
> Данные преимущества настолько существенно уменьшают число зависимостей между подсистемами, что можно даже сформулировать принцип объектно-ориентированного проектирования для повторного использования: _программируйте в соостветствии с интерфейсом, а не с реализацией_.

Но даже приведенные в цитате преимущества не являются единственными, если посмотреть на принцип под более широким углом.

[Читать дальше →][1]

[1]: https://habrahabr.ru/post/332578/?utm_source=habrahabr&utm_medium=rss&utm_campaign=feed_posts#habracut