В том-то и дело, что не означает. Есть такая трактовка, она самая популярная, но крайне неудачная, поскольку смешивает принцип и способ его реализации. Ну написал Мейер в 88-м году про наследование, что теперь, обосраться и не жить?@fixxxer ты разве не знал, что open в этом принципе означает "класс должен быть открыт для наследования"?
эх. я думал сарказм зайдёт а оказалось, что люди реально так думали.В том-то и дело, что не означает. Есть такая трактовка, она самая популярная, но крайне неудачная, поскольку смешивает принцип и способ его реализации. Ну написал Мейер в 88-м году про наследование, что теперь, обосраться и не жить?
Более вменяема формулировка, которая называется Polymorphic Open/Closed Principle.
Не троллю. А что расширение OCP до POCP меняет в данном аспекте? Или наследование уже уволили из триады основных принципов ООП? Если нет, то претензии к final обоснованы. Если класс нормальный и пригоден для широкого reuse, то разработчик не может и не должен ограничивать круг его обязанностей. Проблемы чужого дизайна этого разработчика вообще волновать не должны. По поводу POCP я сильно могу потроллить. Представь, что ты взял некую стороннюю либу, которая торчит наружу фасадом за которым скрыта жыырная реализация. Если эта либа не предусматривает расширения по типу DI, то единственный вменяемый вариант - наследование. Я уже не говорю, что во многих случаях, чтобы внедрить нечно стороннее в проект с тестами, без mocking и partial mocking обойтись невозможно. Но когда мы говорим о модульных тестах все остальные разговоры это все про экономию на спичках.
Если ты не троллишь, то это какое-то понимание OCP из 80-х
Прости, но это реально звучит как "Представьте, что вот вы взяли говно, а там ваше расширение вместо наследования - не работает! поэтому ваш файнал - говно!"Представь, что ты взял некую стороннюю либу, которая торчит наружу фасадом за которым скрыта жыырная реализация. Если эта либа не предусматривает расширения по типу DI, то единственный вменяемый вариант - наследование.
ты думешь Open означает наследование обьектов?Например, final противоречит Open/Close.
да нет же, просто наевшись кактусов, наследуем только абстракциюИли наследование уже уволили из триады основных принципов ООП?
Да лажа полная эта триада, это C++-ное понимание ООП (ну ок, ноги растут из Simula, но что это меняет)? ООП прекрасно реализуется без наследования вообще. Как и без концепции класса. Вот понятия интерфейса (в широком смысле, как множество контрактов) и объекта (как черного ящика, поддерживающего контракты) - ключевые.Или наследование уже уволили из триады основных принципов ООП?
Open означает ровно то, как переводится - открыт. Вы упорно не хотите видеть окончание формулировки - для расширения. Каким образом - дело двадцатьпятое. Декорирование-же никого из вас не смущает?ты думешь Open означает наследование обьектов?
Это одно и то же. Современные фреймворки тестирования (и многие IoC контейнеры) работают по одному принципу. final метод или класс становится невозможно переопределить (что в вашем понимании = невозможно или не нужно унаследовать). Если его невозможно переопределить, то невозможно создать проксю для навеса AOP, мокнуть, автоматически сделать lazy init/load, и т.п. Но, бесспорно, написать программу без наследования как и без ООП и даже без любого высокоуровневого ЯП определенно возможно. Для этого понадобится какая нибудь програмка для побайтного ввода и справочник Гука.Как в этой, так и в одной старой теме, ты пытаешься сказать, что 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 это не нарушение контракта? Я уверен что провернули все это в минорных версиях. Т.е. говнокодить начали значительно раньше чем вынесли в интерфейс и стали использовать еще один общий метод, но там уже претензий нет. Накосячили значительно раньше, а ошибка это следствие этого и следствие отстутствия тестов.Да нормально рефакторился