LINUX.ORG.RU
ФорумTalks

Про ненужность наследования

 ,


2

2

Посмотрел запись доклада Алименкова про ООП и ненужность наследования, надо бы прокомментировать что-то.

Вот ссылка на его видео: https://www.youtube.com/watch?v=G6LJkWwZGuc, предлагаю посмотреть, прежде чем вайнить :3

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

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

Вместо этого для большинства коллег сейчас ООП - это кода ты в IDE протыкал кнопочку «отнаследоваться от класса и переопределить вот такие методы», когда функциональности существующего класса не хватает. Особенно хорошо видно на собеседованиях: тебя спрашивают какую-то чепуху типа «всех методов ArrayList» (вероятно чтобы потом нажать кнопочку «доопределить»), а о самой сути работы, которая как раз есть ООП моделирование, почему-то не спрашивают.

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

В качестве примера, мне кажется важным: ООП в Java есть продукт теории типов, и она хорошо решает ситуации, когда нужно разобраться с чем-то типа полиморфизма подтипов. Отсюда принципы SOLID, в частности принцип подстановки Лисков.

Но как только люди начинают задавать вопросы типа «а вдруг в этом классе добавятся-убавятся методы» (типичный пример про хэшмеп, в базовый класс которого добавился метод addAll, реализованный как попало), это уже объект внимания совершенно другой по структуре и сложности области. Например, темпоральной логики. И в Java нет никаких встроенных методов решения проблем темпоральной логики.

Есть модель памяти и конкаренси, но это про другое, она отвечает на вопрос, какое в данный момент значение имеет символ, и это не вопрос высокоуровневого дизайна программы, а вопрос разряда «ой, ёпть, чота всё сломалось». У меня есть ощущение, что джава - это скорей о снапшотах, и создании ощущения что мир состоит из снапшотов, чтобы скрыть от глаз страшный реальный мир.

И понимая это, ты приходишь к проблеме конструирования мета-языка поверх Java. Например, правил SOLID (одно из которых говорит, что на каждое мажорное изменение нужно создавать новый класс), или специальных фреймворков (не знаю специальных, наверняка есть, но например в Spring есть своя особенная внутренняя философия на эту тему). Или решать вопрос выходя из границ языка, с помощью пакетного менеджера Linux. Или что-то гибридное, версии бандлов в OSGi. И всё это обмазать системой деплоя, которая реально будет работать в настоящем времени, например, Ansible.

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

И вот к чему это. Утверждение «наследование - это плохо» - это немного неверно. Наследование не нужно без всего остального. Слепым мастерам, джедаям всех методов класса ArrayList, придется ознакомиться еще с сотнями кусочков, прежде чем осознать свой путь к выходу :3

(Кстати о видеозаписях докладов. Приходите на джава-конференцию JBreak 2017, сможете набить мне морду за эти еретические мысли. Нет, я не докладчик по проблемам ООП, а вот какой-нибудь Бугаенко там точно будет)

★★★★☆

(Кстати о видеозаписях докладов. Приходите на джава-конференцию JBreak 2017, сможете набить мне морду за эти еретические мысли. Нет, я не докладчик по проблемам ООП, а вот какой-нибудь Бугаенко там точно будет)

А я на Бугаенко не пойду, кругом и так бесконечные срачи. Лучше чего полезное послушать.

Irben ★★ ()

к чему эти ржавые велосипеды с треугольными колесами, когда уже есть божественная 1с?

der_looser ★★ ()

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

В природе «всё уже украдено до нас»:
Наследование: одноклеточные жгутиковые ... — > слоны.
Композиция: одноклеточные безжгутиковые ... — > грибы.

Вывод: автор — любитель грибов :)

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

а на что пойдешь?

Да я вообще на Riga Dev Days иду. Там тоже будет Егор, но его выступление не интересует.

Стараюсь посещать доклады о новомодных devops'ах и прочем, дабы иметь своё представление и направлять начальство куда надо. Недавно посмотрел Greek Tradegy in 3 Acts от Баруха, выступление сильно повлияло на то, как я вижу devops.

Irben ★★ ()

Приходите на джава-конференцию JBreak 2017,
единственная жава-конференция в сибири

нет уж, лучше вы к нам

Deleted ()

Ты кто такой, Алименков? А вот Буч - голова! Его книгу можно даже не читать, посмотреть там картинки и понять силу ООП и наследования.

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

ТС, у тебя 5 звезд и ты не знаешь прописную истину? ЛОР-овцы не ходят по ссылкам.

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

Туплю, наверное. В чём здесь принципиальное различие? Вроде и те, и другие же являются композицией.

А в плане развития оба схожи с наследованием.

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

А кто является предком всех классов фигур в наборе Point, Shape, Circle, Ellipse, Triangle, Parallelogram, Square? Слоны наследуются от бегемотов или наоборот?

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

А кто является предком всех классов фигур в наборе Point, Shape, Circle, Ellipse, Triangle, Parallelogram, Square?

Простите, а что за фигура Shape?

tailgunner ★★★★★ ()

Фанатики, в отличие от прагматиков, слепо следуют своим сверхценным идеям, а не конкретной целесообразности.

String так и сделан - почему наследование _конкретно_ этого класса (и некоторых других) есть зло, можно прочитать еще у Гослинга.

Ну а по поводу того, что на каждый чих надо создавать свой класс - была статья на хабре, как погромист-титеретик и KISS-программист пейсали программку для хлебопечки - поищите.

Как говорится, обсуждение доставляет больше, чем сама статья.

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

В чём здесь принципиальное различие?

В процессе наследования структуры (клетка + жгутик) у слонов возникает сильная специализации клеток разных органов, а у грибов слабо дифференцированные ткани — результат простой композиции безжгутиковых клеток.

А в плане развития оба схожи с наследованием.

Ага, но результат — разные царства живой природы.

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

А я вот как раз Bent Out Of Shape прослушал - ностальгия.

Там как раз картинка, показывающая геометрическую фигуру Shape.

Ну, а если серьезно - java.awt.Shape - это интерфейс, предоставляющий определения для объектов, предстовляющие собой некоторые _геометрические формы_.

Дословно - some form of geometric shape.

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

А я вот как раз Bent Out Of Shape прослушал - ностальгия.

Ну там-то понятно, что имеется в виду (но рулит Rising, да).

Ну, а если серьезно [...]

Я понимаю. Но персонаж, которому я задал вопрос, говорил что-то о предке.

tailgunner ★★★★★ ()

Люблю эти ява-сообщества, то у них мода на GoF шаблоны проходит, теперь вот на ООП. С нетерпением жду заката аджайлов.

urxvt ★★★★★ ()

Да, хотя бы, из-за полиморфизма это можно оставить.

SomeClient map = new SomeClient();

Если, вдруг, это не понравится, то всегда можно заменить на
SomeClient map = new SomeCachingClient(CACHING_POLICY);

а остальной код не трогать.

GblGbl ★★★★★ ()

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

Теперь ты наследование из структуры мира вычеркнешь?

DELIRIUM ☆☆☆☆☆ ()

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

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

А как же философия джавы, которая определяет бытие и законы эволюции, но в которой не должно быть теперь наследования?

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

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

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

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

DELIRIUM ☆☆☆☆☆ ()

ООП вообще неюзабельное говно, я уж про его частные случаи вроде наследования молчу.

Hertz ★★★★★ ()

Тут еще надо вспомнить про долгоиграющие проекты. Когда вот создал ты объект. Ну пусть какую нибудь платежку. А потом хрясь и счета стали 20 значными. И вот наследуешь ты счет от старого? Или лепишь новый класс? А потом через год хрясь и отменили законодательно какое нибудь поле. А у тебя оно обязательное. И вот ладно еще Shape. Это такие штуки которые были при Архимеде еще.

Ну и про мета языки. Вот берем OLE Automation. Кот на каком бы ты ЯП не писал его для экселя - все получается VBA.

dmxrand ()

Как написать 13 абзацев и ничего толком не сказать.

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

полиморфизм, инкапсуляция и наследование - это как воздух, без них нельзя дышать =)

В JavaBeans и Spring десятилетия прекрасно дышат миазмами от их разложения и ничего.

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

Слоны наследуются от бегемотов или наоборот

Биологи говорят, что бегемоты наследуются от китов.

DonkeyHot ★★★★★ ()

а меня больше достает что нет переопределения операторов и свойства как элемента языка.

barberry ★★ ()
Последнее исправление: barberry (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.