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)

Тут народ путается с понятиями

Где?

лябды

Ааа...

slackwarrior ★★★★★
()

«переходник» не очень годный термин. Потому что возникает смешение с шаблоном adapter. Лучше контракт

cobold ★★★★★
()

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

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

Вроде бы оно постарше жабы

Turbo Pascal 5.5, 2 мая 1989 года. Объектно-ориентированное программирование. Возможность копирования в программу примеров из справочной системы. Электронный учебник на диске. Turbo Profiler — профилировщик, фиксирующий время выполнения каждого блока анализируемой программы в машинных циклах и миллисекундах для последующей оптимизации критических участков. Автономный отладчик Turbo Debugger дополнен средствами для работы с объектами — возможно просматривать иерархию объектов, вызывать методы, просматривать и модифицировать поля. Появилась возможность пошаговой отладки программы.

Но я уже не помню, было ли сразу ключевое слово interface, или его позже добавили…

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

Вернее, не так. Ключевое слово interface было сразу, но означало другое (разделяло интерфейс модуля/реализацию модуля). А для automation там что-то другое нагородили. Забыл уже:)

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

Слово interface там было с тех пор как появились модули (в 5.0 они уже точно были, а вот в 3.0 их кажется не было). Интерфейс модуля это аналог хедер-файла из Си, только он не компилируется каждый раз заново.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)

Скорее бы LLM уже писали код вместо людей. Я гарантирую, ни одна LLM не придумает такую шизу и не будет портить ей мозг окружающим.

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

Это не LLM, это я написал. Просто некоторые люди больше одного предложения написать не в состоянии. По этому считают, что любая статья LLM.

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

Да, я понимаю, я не имел ввиду что статья написана ботом, я высказал свое отношение к ООП и куче абстракций которые напридумывали вокруг него чтобы что?

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

Я унаследовал от бабушки квартиру. Теперь у меня есть квартира. Наследование это круто.

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

lbvf50txt
() автор топика
Ответ на: комментарий от Beewek

Ну это ж вообще не то. Так-то и женская грудь — интерфейс (и чем выше твой класс, тем больше у тебя доступа к интерфейсам), но это всё же из другой оперы.

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

Давайте разделим «кучу абстракций» и ООП. Само ООП очень просто - оно определяется концепцией «сообщений» которые отсылают друг другу объекты. Объекты взяты из Биологии и представляют собой «клетки».

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

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

Ну, делать хорошую мину при плохой игре — это наше всё, я понимаю. У одних интерфейс — это не костыль, а концепция. У других — дженерики (особенно в Го) не особо и нужны … а постойте-постойте. С недавних пор что-то произошло и дженерики очень нужная и полезная штука, без которой и ЯП-то называться стыдно.

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

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

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

Но ведь интерфейсы и наследование приводят к разным стилям программирования. Где-то даже рекомендуют избегать наследования (книжка Design Patterns) под названием “composition over inheritance”. Да и сам принцип интерфейсов постарше джавы будет. Как будто это сравнение тёплого с мягким.

Но да, мне тоже кажется, что отсутствие множественного наследования в джаве — это недостаток. Раз уж джава поощряет иерархии, то множественное наследование одновременно необходимо и незаменимо.

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

Когда ты ездишь на мерседесе, ты можешь рассказывать, что у тебя нет айфона, потому что ты презираешь айфоны, эпл и лично Стива Джобса. А когда ты ездишь на трамвае — лучше не распространяться на эти темы. Могут неправильно понять. Или правильно.

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

Нет. У концепции ООП есть создатель, его имя Alan Kay. Есть общепризнанные в мировом сообществе авторы, которые развили концепцию OOD: Sendi Metz, Grady Booch, Robert Martin, Martin Fowler.

Концепция детально описана, протестирована и принята к использованию.

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

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

Ахах, вот оно что)

А я щас потроха своего ФМ отлаживаю, ответственные за работу с виртуальными путями GVFS. Так сказать, ООП на практике.

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

Ключевое слово interface было сразу, но означало другое

Да это я помню. :) Само-собой имелось в виду его использование в ООП.

dataman ★★★★★
()

Тут народ путается с понятиями: интерфейс - переходник, класс - тип, объект - модуль

Сначала хотел написать, что про переходники не слышал, а тип и есть класс. А потом понял, что ты синонимы приводишь. Тогда с модулем это ты путаешь %)

router ★★★★★
()

Такое ощущение, что это либо нейросетка, либо плохой перевод

Тем, кто не разбирается, понятнее не станет. Наоборот, тумана напустит

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

Но да, мне тоже кажется, что отсутствие множественного наследования в джаве — это недостаток.

Наследование - это такая концепция которую большинство разработчиков не может объяснить. Стоит сесть и начать расспрашивать и задавать конкретные вопросы «Как это работает?», «В чем плюсы?», «Зачем требуется?» - в ответ будет растерянность и фразы вроде «ну это».

Что изящно продемонстрировал @ugoday при просьбе объяснить концепцию. Свалившись в оскорбления и усешки «мина при плохой игре», «подтянули дженерики».

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

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

Свалившись в оскорбления и усешки «мина при плохой игре», «подтянули дженерики».

Ну так прекращай уже читать нам неумелые лекции.

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

Интерфейсы придумали в жабе, потому что не смогли создать нормальное множественное наследование

ИМХО, нет. Наследование можно накостылять и без интерфейсов. А интерфейсы сделают код намного более читаемым

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

Автор пытается нащупать филосовские основы программирования. А что делают философы (по крайней мере начиная с нового времени)? Всего лишь две вещи: а) составляют свой словарик, в котором старые слова наделяются нужным им смыслом и б) говорят, в общем-то, тривиальные вещи с использованием этого понятийного аппарата. А поскольку фактически они разговаривают на собственном языке, пока его не выучишь получается всё очень сложно и непонятно.

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

Ну так прекращай уже читать нам неумелые лекции.

Многоуважаемый @dataman, объясните пожалуйста концепцию наследования в парадигме ООП. На практическом примере и объясните какие и как она решает задачи.

Умело, четко, по делу. Жду.

lbvf50txt
() автор топика
Ответ на: комментарий от Beewek

Ещё в OLE automation были интерфейсы. Вроде бы оно постарше жабы:)

В CORBA и OpenGroup/DCE они были, т.к.IDL, энтерпрайзно-надежно, для кучи платформ и языков (распределенная связь гетерогенных сред), а OLE это мелкомягкие попытки «объять и расширить»... и прибить гвоздями к винде, когда их DDE не взлетело и они подсмотрели у OMG и OpenGroup как надо «OMG! А чо так можно было?». Причем CORBA и DCE — изначально IPC/RPC, а OLE — локальная шляпа, впоследствии допиленная через ребрендинг ехал COM через DCOM в ActiveX до чего-то позволяющего что-то распределенное... между оффтопиками.

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

Вы тоже, много уважаемый @ugoday, объясните концепцию наследования. Чуть более подробно, какие задачи и какими методами она решает. Ближе к программированию.

lbvf50txt
() автор топика
Ответ на: комментарий от router

Наследование можно накостылять и без интерфейсов.

Вот, не люблю я слово «можно». Теоретически на любом полном по Тьюрингу языке можно сделать что угодно. А практически — нифига подобного. Вот, я уже дженерики в Го упоминал. Их можно было сделать с самого начала. Но потребовалось 10 лет (а если считать от alef’а, то и все 20), чтобы «теоретически можно» превратилось «готово, можно пользоваться». Так и тут, не придумали как удобно реализовать множественное наследование, потому что не сумели. Ну и нечего рассказывать о том какой виноград за забором зелёный.

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

Зря, я не страдаю дефицитом внимания.

Дефицитом не конструктивной критики вы тоже не страдаете. Покажите класс в лекциях по ООП. Мои вам не нравятся, дерзайте.

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

Давайте начнём с начала. Что такое «концепция» и зачем она вам нужна? Какие задачи и какими методами она решает?

Ближе к программированию.

Для этого надо писать в IDE, а не браузере.

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

Так и тут, не придумали как удобно реализовать множественное наследование, потому что не сумели.

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

В вам меня раздражает ваша напыщенность, вы не можете объяснить концепт, но ставите себя на уровень критике разработчиков на порядки более квалифицированных чем вы (я о создателях языков).

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

Давайте начнём с начала. Что такое «концепция» и зачем она вам нужна? Какие задачи и какими методами она решает?

Ага, хорошо. Еще одно сообщение от вас подожду, если вы продолжите в том же ключе то вас забаню.

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

Наследование - примитивно, стабильно, работоспособно и практично. Просто надо прочитать POODR, там разложено по полочкам. Рекомендую. Увы этого базиса многие не знают, от этого код плохого качества.

POODR - решает вопрос. Там описаны приемы создания качественного и читабельного кода.

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

Я понимаю и принимаю многотысячелетнюю мужскую традицию меренья письками, но предпочитаю меряться своей, а не чужого, даже очень авторитетного дяди.

ugoday ★★★★★
()

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

Убрали классы, убрали наследование, оставили Композицию/Агрегацию и Интерфейсы.

Усп, человек, который не понимает основное отличие го, пишет о нём статью?

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

Усп, человек, который не понимает основное отличие го, пишет о нём статью?

Конкретнее. Что не так?

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