Автор Тема: Почему наследование не может быть основой ОС?  (Прочитано 54322 раз)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Почему наследование не может быть основой ОС?
« Ответ #60 : Январь 30, 2013, 06:24:40 pm »
Я не сторонник запрещения наследования в языке (и в КП оно есть). Но я за ограничение его использования, как специфического средства.
Вот конкретно тут - у нас консенсус. Слишком это мощное и страшное средство чтобы его использовать на право и на лево, как и динамическая загрузка модулей и активное использование метаинформации/рефлекшина (особенно страшно тут это все в сочетании). В 90% случаев использования динамической загрузки модулей за оную загрузку надо руки отрывать на месте. Потом разобраться в таком коде решительно не возможно.
Y = λf.(λx.f (x x)) (λx.f (x x))

alexus

  • Гость
Re: Почему наследование не может быть основой ОС?
« Ответ #61 : Январь 30, 2013, 06:34:08 pm »
Так в том-то и дело, что настоящее наследование к "наследованию реализации", отношения практически не имеет. И Илья с Вами согласен, что оно практической пользы не даёт.

Господа, вы меня совсем запутали.

Итак, раскладываем по полочкам:
1) alexus утверждает что наследование у интерфейсов это не наследование.
Естественно... (А запутали Вас не мы, а тот кто эти совершенно разные понятия обозвал одинаково...)

2) Valery Solovey утверждает что Илья согласен с alexus'ом (и видимо сам Valery Solovey тоже согласен) и что настоящее наследование к наследованию реализации не имеет отношения.

Пардон, а что тогда остается? Интерфейсов наследование отпадает (1), реализации наследование тоже отпадает (2). Ы?
Илья Евгеньевич говорит о некоем специфическом "наследовании", которое он почему-то называет "наследованием реализации"
Имеется в виду, что доступен для всех только абстрактный класс, допустим, AbstractButton. Любой конкретный Button недоступен в принципе. А могут быть только созданы его экземпляры через фабрику (функцию или фабричный объект). А работать с ним будут как с AbstractButton.
Но полноценное/нормальное наследование реализации в ООП не запрещает создавать классы-потомки и наследоваться от них... сколько угодно... То "наследование", о котором говорит Илья Евгеньевич, я считаю ущербным и практически бесполезным (по-крайней мере, в сравнении с нормальным наследованием).
« Последнее редактирование: Январь 30, 2013, 06:36:26 pm от alexus »

Valery

  • Full Member
  • ***
  • Сообщений: 101
    • Просмотр профиля
Re: Почему наследование не может быть основой ОС?
« Ответ #62 : Январь 30, 2013, 06:35:09 pm »
Собственно, мощным и страшным его делает только принцип подстановки.
Ибо появляется динамический тип, а отсюда и динамический полиморфизм.
Соответственно, напрашивается вопрос: а не сделать ли это дело явно управляемым в языке.
То есть, добавить типа ключевое слово, по которому принцип подстановки для данного типа разрешен.
А по умолчанию - запрещен. Как наследование в КП.

alexus

  • Гость
Re: Почему наследование не может быть основой ОС?
« Ответ #63 : Январь 30, 2013, 06:56:27 pm »
То, что Илья Евгеньевич называет "наследованием" реализации... практической пользы не даёт по сравнению с тем, что в ООП называют наследованием. К сожалению, Н. Вирт видимо так и не понял возможностей ОО-концепции, что сказалось и на Обероне, и... на его адептах.

А на чём ещё основаны "возможности ОО-концепции", как не в полиморфизме (возможности выразить отношения "род-вид" и потом обеспечить принцип Барбары Лисков:, если A` является разновидностью А, использовать его всюду, где и А) и в виртуализации (позднем связывании вызова)?
ОО-концепция основана на "трёх китах"
  • полиморфизм;
  • инкапсуляция;
  • наследование.
Полиморфизм обеспечивает многообразие форм одного и того же. По сути, полиморфными могут быть не только методы, но и сами объекты. Полиморфизм может существовать не только в рамках иерархии классов, но и как самостоятельное явление. Собственно, "наследование интерфейсов" - это частный случай проявления полиморфизма.
Инкапсуляция в ООП решает две большие задачи: объединение кода и данных, а также их сокрытие (защита от "дурака").
Наконец, наследование... позволяет создавать новые классы на основе существующих, без переписывания последних.

Кстати, ссылка на Б. Лискова либо некорректна, либо... автор заблуждается. Использовать надо объект того класса, который нужен... Класс-потомок можно использовать вместо класса-предка, но поведение класса-потомка может кардинально отличаться от поведения класса-предка (поэтому "использовать всюду"... нонсенс).

А повторное использование, извиняйте, и без наследования реализации обеспечить можно, при этом придётся больше подумать над структурой - и она будет лучше (потому что не будет соблазна пойти самым кратчайшим путём, "шоб только заработало побыстрее"). Я не сторонник запрещения наследования в языке (и в КП оно есть). Но я за ограничение его использования, как специфического средства.
Любой инструмент надо использовать по назначению.
Любым инструментом надо уметь пользоваться.
... и надо представлять, какие инструменты нужны для решения каждой конкретной задачи...
(так легче жить... и шишек меньше, IMHO)

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Почему наследование не может быть основой ОС?
« Ответ #64 : Январь 30, 2013, 07:39:57 pm »
Кстати, ссылка на Б. Лискова либо некорректна, либо... автор заблуждается.
Лисков - это она.

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Почему наследование не может быть основой ОС?
« Ответ #65 : Январь 30, 2013, 07:55:33 pm »
Любой инструмент надо использовать по назначению.
Любым инструментом надо уметь пользоваться.
... и надо представлять, какие инструменты нужны для решения каждой конкретной задачи...
(так легче жить... и шишек меньше, IMHO)

Вы рассуждаете почему-то только с позиций "умного себя". Так и структурное программирование, если Вашими рассуждениями следовать, нафиг не сдалось.
На самом деле, насколько меньше ошибок стало в ПО и насколько оно стало сопровождаемей - общеизвестный факт.
Потому что 90% ПО, нас окружающего, создают не "умные Вы", а люди, которые, в лучшем случае, ещё только идут к уровню экспертов, а в худшем - никуда не идущие.
Если не выработать дисциплинирующие рекомендации, помогающие избежать граблей в основной массе задач, то люди так и будут набивать шишки себе и другим :)

alexus

  • Гость
Re: Почему наследование не может быть основой ОС?
« Ответ #66 : Январь 30, 2013, 08:09:59 pm »
Кстати, ссылка на Б. Лискова либо некорректна, либо... автор заблуждается.
Лисков - это она.
А она не может быть автором?..

alexus

  • Гость
Re: Почему наследование не может быть основой ОС?
« Ответ #67 : Январь 30, 2013, 08:14:59 pm »
Любой инструмент надо использовать по назначению.
Любым инструментом надо уметь пользоваться.
... и надо представлять, какие инструменты нужны для решения каждой конкретной задачи...
(так легче жить... и шишек меньше, IMHO)

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

На самом деле, насколько меньше ошибок стало в ПО и насколько оно стало сопровождаемей - общеизвестный факт.
Именно...

Потому что 90% ПО, нас окружающего, создают не "умные Вы", а люди, которые, в лучшем случае, ещё только идут к уровню экспертов, а в худшем - никуда не идущие.
Ну, я о людях плохо не думаю... априори...

Если не выработать дисциплинирующие рекомендации, помогающие избежать граблей в основной массе задач, то люди так и будут набивать шишки себе и другим :)
Рекомендации рекомендациям рознь... равно, как и дисциплины...

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Почему наследование не может быть основой ОС?
« Ответ #68 : Январь 30, 2013, 08:20:58 pm »
Наконец, наследование... позволяет создавать новые классы на основе существующих, без переписывания последних.

Это можно сделать и без наследования. Паттерн Wrapper - я внутри своего MegaButton буду иметь агрегированный SimpleButton (но, конечно, работая с ним как с AbstractButton, ибо тип SimpleButton нигде не используется, всё только через фабрику) и обращаться к нему, когда мне нужно использование его поведения. Вместо супервызова - явный вызов сокрытого внутри объекта.

Проект СУБД я помню, внимательно смотрел, погляжу ещё раз и попробую переформулировать без наследования :)

alexus

  • Гость
Re: Почему наследование не может быть основой ОС?
« Ответ #69 : Январь 30, 2013, 08:25:35 pm »
Наконец, наследование... позволяет создавать новые классы на основе существующих, без переписывания последних.

Это можно сделать и без наследования.
Да, можно... Вопрос: ЗАЧЕМ?

Проект СУБД я помню, внимательно смотрел, погляжу ещё раз и попробую переформулировать без наследования :)
Хм?.. А перевести в мирное русло... не пробовали?

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Почему наследование не может быть основой ОС?
« Ответ #70 : Январь 30, 2013, 08:26:50 pm »
Кстати, ссылка на Б. Лискова либо некорректна, либо... автор заблуждается.
Лисков - это она.
А она не может быть автором?..
Сочетание "ссылка на Б. Лискова" подразумевает, что это "он".

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Почему наследование не может быть основой ОС?
« Ответ #71 : Январь 30, 2013, 08:40:12 pm »
Это можно сделать и без наследования.
Да, можно... Вопрос: ЗАЧЕМ?
[/quote]

Потому что это будет явно и прозрачно, с полной ответственностью программиста за то, что он делает.
Он объявляет свой MegaButton как расширение AbstractButton - он должен определить ВСЕ методы AbstractButton, подумать над ними - может быть, значительная часть из них и будет тупо состоять из вызова this.base.Method() (что тут является аналогом супервызова) - но он будет явно принимать это решение.
А не тупо "перекрыть-переклепать" то, что ему там не нравится, в надежде, что всё остальное будет "дёргаться" автоматически.
Конечно, не надо создавать такие классы, как в VCL - с десятками методов. В большинстве случаев, если у объекта больше десятка методов, его уже пора "резать" на несколько.

Проект СУБД я помню, внимательно смотрел, погляжу ещё раз и попробую переформулировать без наследования :)
Хм?.. А перевести в мирное русло... не пробовали?
[/quote]

Посмотрел. Там наследование, например, применяется для реализации разных типов атрибутов.
Атрибут (Фиксированный размер (числа, временные), Произвольный размер (строки, blob)).

Конечно, наследование тут полезно, но не обязательно реализации.
Можем сделать для них дерево абстрактных классов без реализаций.

Затем уже делаем реализацию каждого "терминального" класса из дерева. Реализации полностью независимы друг от друга, ничего не знают друг про друга. Потом замечаем, что реализация, допустим, блоба, в чём-то начинает повторять код реализации строк. Мы сразу же выносим этот код в некоторую базовую библиотеку, состоящую из функций или наших служебных классов. Т.е. код, который бы хотелось наследовать (засунуть в класс "Произвольный размер", чтобы потом от притащился автоматом при наследовании и в строки, и в блобы) мы просто выносим отдельно в свои служебные модули. Возникнут какие-то внутрение служебные классы, в которых будет зафиксирована вот эта общность реализаций разных атрибутов.
« Последнее редактирование: Январь 30, 2013, 08:42:04 pm от Илья Ермаков »

Valery

  • Full Member
  • ***
  • Сообщений: 101
    • Просмотр профиля
Re: Почему наследование не может быть основой ОС?
« Ответ #72 : Январь 31, 2013, 04:22:30 am »
Наконец, наследование... позволяет создавать новые классы на основе существующих, без переписывания последних.

Это можно сделать и без наследования. Паттерн Wrapper - я внутри своего MegaButton буду иметь агрегированный SimpleButton (но, конечно, работая с ним как с AbstractButton, ибо тип SimpleButton нигде не используется, всё только через фабрику) и обращаться к нему, когда мне нужно использование его поведения. Вместо супервызова - явный вызов сокрытого внутри объекта.
Если принцип подстановки не использовать НИКОГДА, то можно обйтись и без наследования.
Но вопрос требует более тщательного изучения: так ли уж нужен этот самый принцип подстановки ? В конце-концов, обходились же раньше без него... :)

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Почему наследование не может быть основой ОС?
« Ответ #73 : Январь 31, 2013, 04:22:39 am »
К сожалению, Н. Вирт видимо так и не понял возможностей ОО-концепции, что сказалось и на Обероне, и... на его адептах.
Как по-Вашему, в каких языках наиболее правильно реализованы концепции ООП?
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

alexus

  • Гость
Re: Почему наследование не может быть основой ОС?
« Ответ #74 : Январь 31, 2013, 04:38:43 am »
Кстати, ссылка на Б. Лискова либо некорректна, либо... автор заблуждается.
Лисков - это она.
А она не может быть автором?..
Сочетание "ссылка на Б. Лискова" подразумевает, что это "он".
Да, ошибся, простите.