В том-то и дело, что не означает. Есть такая трактовка, она самая популярная, но крайне неудачная, поскольку смешивает принцип и способ его реализации. Ну написал Мейер в 88-м году про наследование, что теперь, обосраться и не жить?@fixxxer ты разве не знал, что open в этом принципе означает "класс должен быть открыт для наследования"?
эх. я думал сарказм зайдётВ том-то и дело, что не означает. Есть такая трактовка, она самая популярная, но крайне неудачная, поскольку смешивает принцип и способ его реализации. Ну написал Мейер в 88-м году про наследование, что теперь, обосраться и не жить?
Более вменяема формулировка, которая называется Polymorphic Open/Closed Principle.
а оказалось, что люди реально так думали.
Если ты не троллишь, то это какое-то понимание OCP из 80-х
Прости, но это реально звучит как "Представьте, что вот вы взяли говно, а там ваше расширение вместо наследования - не работает! поэтому ваш файнал - говно!"Представь, что ты взял некую стороннюю либу, которая торчит наружу фасадом за которым скрыта жыырная реализация. Если эта либа не предусматривает расширения по типу DI, то единственный вменяемый вариант - наследование.
ты думешь Open означает наследование обьектов?Например, final противоречит Open/Close.
да нет же, просто наевшись кактусов, наследуем только абстракциюИли наследование уже уволили из триады основных принципов ООП?
Да лажа полная эта триада, это C++-ное понимание ООП (ну ок, ноги растут из Simula, но что это меняет)? ООП прекрасно реализуется без наследования вообще. Как и без концепции класса. Вот понятия интерфейса (в широком смысле, как множество контрактов) и объекта (как черного ящика, поддерживающего контракты) - ключевые.Или наследование уже уволили из триады основных принципов ООП?
ты думешь Open означает наследование обьектов?
Как в этой, так и в одной старой теме, ты пытаешься сказать, что OCP требует non-final класс, потому что существуют плохие non-final классы. Или что нельзя unit-тест написать. Ты совершаешь ошибки в рассуждениях.
Нет не так. final не нужен потому, что мне не известен кейс, где его использование будет оправдано. Приведите пример.Я еще раз сформулирую мысль: ты пытаешься сказать, что final не нужен, потому что кто-то не умеет им пользоваться. Это логическая ошибка.
декоратор, на мой взгляд, правильный подходДекорирование-же никого из вас не смущает?
Если бы в языке по умолчанию был final и требовалось бы писать open к тем классам, где наследование разрешено (Kotlin, например), то такой формулировки («где его использование будет оправдано»), наверное, бы не было. Я ищу не места, где нужен final, а где его можно убрать.Нет не так. final не нужен потому, что мне не известен кейс, где его использование будет оправдано. Приведите пример.
https://github.com/adelf/acwa_book_ru/blob/master/manuscript/2-di.md#наследование. Вот здесь я попытался придумать проблему. Вполне вероятную кстати.Нет не так. final не нужен потому, что мне не известен кейс, где его использование будет оправдано. Приведите пример.
Да нормально рефакторился. Контракт соблюдён был всегда. Во многих случаях делать декоратор намного безопаснее.@Adelf пример с одной стороны неплохой, но с другой показывает что против лома нет приема, т.е. против говнокода не устоит ни одна абстракция (и говнокод в данном случае это кусок ларавеля и как он рефакторился)
Ну блин, где нормально??? добавление метода PushOn это не нарушение контракта? Я уверен что провернули все это в минорных версиях. Т.е. говнокодить начали значительно раньше чем вынесли в интерфейс и стали использовать еще один общий метод, но там уже претензий нет. Накосячили значительно раньше, а ошибка это следствие этого и следствие отстутствия тестов.Да нормально рефакторился