Вообще не знаю, кто придумал в ООП наследование - его всегда можно заменить композицией, улучшив при этом DIP и OCP
> Вообще не знаю, кто придумал в ООП наследование - его всегда можно заменить композицией, улучшив при этом DIP и OCP.
> Наследование же нарушает чуть ли не все СОЛИД-принципы
вот да, наследование можно заменить композицией. С этим я бы согласился. Равно как и наоборот. А вот как dip и ocp улучшается? всегда полагал, что солид все же про интерфейсы, а то, какой класс (с/без наследования, с/без композиции) какие интерфейсы имплементирует - это его дело, и никак на солид не влияет.
>Это декларация поведения (интерфейс). Наследование в классах - это немного другое. Отстуствие множественного наследования как бы "намекает" на то, что наследование - это плохая практика ;)
Так ведь можно так:
class m1 {
abstract m1() {}
abstract m2() {}
abstract m3() {}
m4() {
m1(m2(m3()))
}
}
class m2 extends m1 {
m1() { }
m2() { }
m3() { }
m4() { super.m4() }
}
А почему плохая?
> Спроектировал ООПшник модель телевизора и модель пульта для включения телевизора. Поставили задачу "включить телевизор", а пульт где-то затерялся. Вместо того, чтоб включить телевизор, ООПшник долго ищет пульт по всей квартире - ведь именно пультом (по его задумке) "правильно" включать телевизор. Или даже пульт есть, а вот "модель батарейки" в нём села. И ООПшник, вместо того, чтоб включить телевизор, бежит в магазин за новой батарейкой для пульта к телевизору ("В доме, который построил Джэк")
> Завтра люди научились силой мысли включать приборы без пульта - и ООП-ник понял, что надо рефакторить весь проект, ведь без модели пульта его код просто не запустится.
У ФП-шника просто была функция, включающая телевизор. У него не было объектов. И ему было всё равно кто и чем тот телек включает. Правда, поскольку у него не было и модели телика, то по факту он включил что-то другое (например, ядерный реактор) - но это уже другая история...
Если телевизор можно включить из пульта, а еще можно напрямую непосредственно включить, то, мне видится, это нарушение srp, т к у телевизора 2 актора (человек и пульт) - в этом случае, мне видится, надо разделять телевизор на 2 типа, и тогда снова нет проблем. Если же это означает, что на каждый чих надо рефакторинг делать, то да, надо, ведь поменялось требование к поведению (последовательность вызовов методов). Но можно и защититься от этого - сделать все классы контроллерами, и вызывать их откуда угодно в любой момент времени. Только зачем это надо?