LINUX.ORG.RU

Интерфейсы в ООП

 , , , ,


0

2

Введение: Объект != Класс

Тут народ путается с понятиями: интерфейс - переходник, класс - тип, объект - модуль («физическая» часть системы, класс это описание, объект это функционирующая сущность: Состояние+Методы). Многие вообще классы с объектами путают.

Под «физическим» понимается участвующий в работе, а не являющийся описанием. Разница как описанием типа Int, и реальными 32битами в RAM в которых хранится число. Объект это то, что «работает», а «класс» это описание того как данный «тип» должен работать.

Интерфейс: Прослойка между Объектами

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

  • «Модуль» как правило объект.
  • «Тип» как правило класс.

Пример: интерфейс Писатель используются для сохранения данных, а по этому интерфейсу данные могут передавать на сохранения в разные места: по сети, на диск, на принтер.

Пример из жизни: электрическая розетка/штепсель - передают энергию на разные устройтсва от разных источников: ГЭС, Генератор, ТЭЦ, Аккумулятор.

В Системной Дизайне Интерфейсы это «прокладки» через которые модули системы становятся отделяемыми и заменяемыми. Это уже не просто «тип-класса», а именно набор правил которым может соответствовать любой тип. Интерфейсы еще называют контрактами - т.е. наборами договоренностей которые должен соблюдать объект.

Заключение: Достаточно Объекта с Интерфейсом

В ЯП есть еще модули, миксины, лябды и прочее словеса которые затрудняют общее понимание системы как набора заменяемых модулей. Класс - это шаблон/тип по которому создаются объекты. Объект это «физический модуль», интерфейс - переходник по которому модули соединятся друг с другом. Вот и всё ООП.

ЭПИЛОГ

В своей статье я расскзаываю, что сделали инженеры Google, а по совместительству создатели UNIX, в языке Go: максимально упростили ООП модель для практического применения.

Убрали классы, убрали наследование, оставили Композицию/Агрегацию и Интерфейсы. Звучит сложно, на деле примитивно: представили программу как набор заменяемых «модулей» подключенных через интерфейсы.

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

Специально я не иду в детальное объяснение принципов проектирования и не пользуюсь словами вроде Dependency Injection. Цель статьи объяснить базовую идею OOD - Объектно Ориентированного Дизайна, того с чем мы сталкиваемся в быту на ежедневной основе: USB порт, крепление смесителя в ванной, приемник карточки в банкомате, диаметр горлышка пластиковой бутылки, габаритные размеры пакета с соком, высота полки в холодильнике, крышка на банке с соленьями, размер куска мыла - всё реализации концепции интерфейса. Каждый из этих объектов соответствует каким-то правилам, сохраняет контакт и делает элементы системы заменяемыми.

UPD #1:

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

  • Объект - это деталь.
  • Класс - чертеж детали.
  • Интерфейс - чертеж соединительного крепления или штекера (интерфейса) по которому идет подключение. Модель крепления, Прокладка, Тип разъема/кабеля для подключения.

Одна идея интерфейсов может быть объяснена с разных сторон. Может быть более прикладным образом через Переходники/Штекеры/Прокладки, а может быть более абстрактно через зависимость реализации от абстракции.

Более абстрактное представление описывает Robert Martin в своей статье DIP (Dependency Inversion Principle) где интерфейс представляет как абстракцию (абстрактный класс). Что накладывается на преставление штекера для розетки - который питает прибор от абстрактной сети, которая может быть ТЭЦ, ГЭС, Дизель, Аккумулятор, Солнечные Батареи.

UPD #2:

Наследование - это синтаксический сахар над Агрегацией. При Агрегации подключается Компонент явно. При Наследовании Компонент подключается не явно: есть разные механизмы наследования. Базовая идея в перенаправленный СООБЩЕНИЯ на обработку в другой КОМПОНЕНТ. Другим КОМПОНЕТНОМ может быть: базовый класс, объект по прототипу, миксин - базовой идеи делегирования полномочий синтаксическая обертка не меняет.

Факт который не понимает 80% кодеров - наследование это дополнение к ООП, а не его суть. А 99% кодеров не понимает, что ООП это про Сообщения, а не про Компоненты-Объекты. Кодер != Инженер.

Изображение от Sendi Metz: Объект как космическая капсула принимающая и передающая радио сигналы.

Суть от Alan Kay:

I thought of objects being like biological cells and/or individual computers on a network, only able to communicate with messages (so messaging came at the very beginning – it took a while to see how to do messaging in a programming language efficiently enough to be useful).



Последнее исправление: lbvf50txt (всего исправлений: 4)
Ответ на: комментарий от vtVitus

Признаю. Да. В костылях, инвалидных колясках и слуховых аппаратах милостью Божьей я тоже не разбираюсь.

ugoday ★★★★★
()
Ответ на: комментарий от vtVitus

Никаких претензий. Просто пытаюсь угодить вашим вкусам.

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

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

vtVitus ★★★★★
()
Ответ на: комментарий от kaldeon

В целом, мне кажется, что наследование — скорее неудобная фича.

Наследование - это синтаксический сахар над Агрегацией. При Агрегации подключается Компонент явно. При Наследовании Компонент подключается не явно: есть разные механизмы наследования. Базовая идея в перенаправленный СООБЩЕНИЯ на обработку в другой КОМПОНЕНТ. Другим КОМПОНЕТНОМ может быть: базовый класс, объект по прототипу, миксин - базовой идеи делегирования полномочий синтаксическая обертка не меняет.

Факт который не понимает 80% кодеров - наследование это дополнение к ООП, а не его суть. А 99% кодеров не понимает, что ООП это про Сообщения, а не про Компоненты-Объекты. Кодер != Инженер.

Изображение от Sendi Metz: Объект как космическая капсула принимающая и передающая радио сигналы.

Суть от Alan Kay:

I thought of objects being like biological cells and/or individual computers on a network, only able to communicate with messages (so messaging came at the very beginning – it took a while to see how to do messaging in a programming language efficiently enough to be useful).

lbvf50txt
() автор топика
Последнее исправление: lbvf50txt (всего исправлений: 4)

Дрисня какая-то. Ты из нулевых, с RSDN или какого-то жабо-сообщества свалился?

Кстати, в CL интерфейсы это пакеты и обобщенные функции. Куда тут их приткнуть?

P.S.: объект это процесс, см мой доклад: Основы метаобъектного протокола CLOS

lovesan ★★☆
()
Ответ на: комментарий от lbvf50txt

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

Тем более это относится к передаче сообщений. В случае ООП на обобщённых функциях её может вообще не быть.

ugoday ★★★★★
()

Что-то я не понял главного – как и когда что делать или не делать. Похоже на какое-то личное осмысление темы через метафоры

oxo
()
Ответ на: комментарий от oxo

Я вместо него.

— “Что делать?” — спросил нетерпеливый петербургский юноша. — “Как что делать: если это лето — чистить ягоды и варить варенье; если зима — пить с этим вареньем чай”.
ugoday ★★★★★
()

Концептуально, по самому смыслу слова, интерфейс это не переходник, а «лицо во внешний мир». Можно трактовать как «панель управления».

Многие вообще классы с объектами путают

Наоборот, многие ошибочно думают что якобы класс это не объект. В настоящем ООП все есть объект. Термин Хьюитта был точней - все есть Актор. Слово объект неудачно, объект означает пассив.

Это похоже на ошибку схоластов-номиналистов (современные материалисты), которые ошибочно полагали что умозрительных сущностей в реальности не существует, а есть только их имена.

no2700
()
Ответ на: комментарий от cobold

Контракт вообще мимо. Контракт это соглашение между сторонами, Контракт, как частный случай, может определять протокол взаимодействия, например общий язык, но это не интерфейс. Интерфейс это то что видят окружающие. Объект может сказать окружающим: если вы попросите меня foo я отдам сообщение bar объекту baz.

no2700
()

Кодер != Инженер. В наше время слово инженер стало ругательным. В основном это бюрократический планктон. В слове кодер есть что то романтичное, типа «жиган» или «ковбой», дескать, я на ую видал этих ваших инфантильных ничтожных бумажных червей

no2700
()
Ответ на: комментарий от masa

Не думаю что устоявшиеся ныне «термины» и «паттерны» имеют что то общее с настоящим ООП. Деградация всегда начинается с классического немецкого подхода, взять модное словечко и причесать его под тупого немецкого раба, от настоящей вещи ничего не остается, это просто мимикрия. Например немецкий офиссер, офисный работник военного департамента нашивает себе лампасы и в глазах прусского крестьянина становится кавалеристом, хотя имеет толстую задницу а седла никогда не видел. Крестьянин это хавает, пипл хавает. Не случайно первая нелепая мимикрия под ООП пошла с северных болотных широт. Из этого потом вылупился нелепый С++ и тп

no2700
()
Ответ на: комментарий от no2700

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

no2700
()
Ответ на: комментарий от no2700

Допустим есть объект кофемашина с кнопкой «приготовить кофе». Вот эта кнопка и есть интерфейс этого объекта. Вместо кнопки это как правило сообщение. Отсылка сообщения = нажатие не кнопку. В конце - чашка кофе.

no2700
()
Ответ на: комментарий от no2700

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

masa ★★★
()
Ответ на: комментарий от masa

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

no2700
()
Ответ на: комментарий от no2700

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

no2700
()
Ответ на: комментарий от cobold

К сожалению ты далеко не уникальный объект немецкого класса для которого «расширение интерфейса» и «интерфейс» это одно и то же. Последние лет 20 мир накрывает лавина аутизма

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

no2700
()
Ответ на: комментарий от no2700

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

no2700
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.