LINUX.ORG.RU

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

 , , , ,


0

2

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

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

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

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

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

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

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

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

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

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

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

ЭПИЛОГ

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

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

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

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



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

Сходил ТСу в профиль. Там написано:

Программист должен программировать

Странно всё это. =)

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

@libvf50txt ведёт личный дневничёк на лоре.

До упоминания Столярова осталось 3..2..1…

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

В целом, мне кажется, что наследование — скорее неудобная фича. Наследование наследует интерфейс и реализацию (через protected-поля), что ломает инкапсуляцию (сокрытие реализации) и приводит ко всем сопутствующим проблемам (размытые границы, запутанный поток выполнения). Можно, конечно, не использовать protected, но тогда мне сложно представить какие удобства даст наследование. Без доступа к реализации как будто весь смысл наследования теряется.

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

Множественное наследование в 99% не нужно, а том самом 1% делается через interface + @Delegate за 1 минуту. 99% воплей про «Множественное наследование в java» идёт от людей не программирующих в java и не знающих её.

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

Да, поддерживаю вас, множественное наследование - не сложная в реализации фича языка. Но это избыточная абстракция для прикладной разработки.

Ссылка на «множественное наследование» в беседе это неумелая и не очень чистоплотная попытка запугать собеседника «непонятным словом».

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

Ну так может быть этот человек писал на C++, где множественное наследование есть.

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

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

Не, до можно пользоваться они так и не доехали.

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

Лично я знаю только одну фичу го, которая прежде не появилась у какого либо из популярных языков.

Вы вообще поняли, что написали?

  • В Go упростили модель ООП.
  • Ты не понимаешь Go.
  • Конкретнее.
  • Лично я знаю одну фичу Go…
lbvf50txt
() автор топика
Последнее исправление: lbvf50txt (всего исправлений: 1)
Ответ на: комментарий от ugoday

делается за 1 минуту, как я и написал, если уж без геморроя жизни нет.

import lombok.RequiredArgsConstructor;
import lombok.experimental.Delegate;

public class Test {

    public interface IClassA {
        int a1();
        void a2(int y);
        void common();
    }

    public interface IClassB {
        int b1();
        void b2(String y);
        void common();
    }

    @RequiredArgsConstructor
    public class ClassC implements IClassA, IClassB {

        @Delegate
        private final IClassA a;
        @Delegate
        private final IClassB b;

        @Override
        public void common() {
            //for example
            a.common();
            b.common();
        }
    }

    public void test(ClassC c) {
        c.a1();
        c.b2("test");
        c.common();
    }

    public void test() {
        
    }

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

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

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

Закончат обсуждением лиспа как обычно.

Вносите Лавсана. Только в чистое белое переоденьте.

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

Много где упростили ооп, начиная с жабоскрипта. Главная фича го не имеет к ооп отношения.

ya-betmen ★★★★★
()
Ответ на: комментарий от vtVitus
  1. Выкинуть из дизайна языка множественное наследование.

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

  3. Обвинять окружающих, что у них «без геморроя жизни нет».

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

Готов выслушать содержательную критику.

ugoday ★★★★★
()

Можно проще:

  1. Интерфейс это требования к изделию (контракт)
  2. Класс это чертёж изделия (реализация)
  3. Объект это готовое изделие (экземпляр)
Obezyan
()
Ответ на: комментарий от imatveev13

Я категорически не приветствую Тикток, но Гуглу стоит взять с них пример и ограничить длину роликов, скажем, 30 или 40 минутами. А то это выходит уже за всякие рамки — что не ролик то полтора часа, Леха Фридман вообще по 6 часов интервью пилить стал.

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

Хорошая аналогия, мне нравится. Но это взгляд с позиции проектирования. В статье приведет взгляд с позиции функционирующего агрегата: модульная система с горячей заменой модулей, модули крепятся через прокладки, чтоб не прикипели друг к другу.

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