Шаблон mixin и Open Close принцип

grigori

( ͡° ͜ʖ ͡°)
Команда форума
1) Как на UML отображать эти отношения? Как зависимость от того каждого конкретного класса? Или как композицию объектов поведения?
как композицию - поведение реализуется как декорация, только без выделенного декоратора
2) Вот тот набор поведений, определенный внутри behaviors() - это место как раз подверженное большим изменениям, и есть же принцип ООП - "Инкапсулировать то что меняется" ,но тут оно жестко хардкодиться в этом же классе
да

3) Что с методом Open Closed, нарушен же? Должны мол быть закрыты для модификации, но тут видно что для изменения дополнит. поведения класса ArticleSettings надо менять именно его код , метод behaviors().
да, специально нарушен, клепать простые сайты так удобнее

4) Если в 3) ответ положительный, то что если в системе убрать жесткую зависимость от ArticleSettings, так что вместо нее всегда можно подставить подкласс, а в подклассе уже переопределять behaviors(), таким образом можно поправить ситуацию?
для начала определи что конкретно тебе мешает, тогда понятно будет как исправлять.
чем конкретно тебе в твоей задаче мешает хардкод имен поведений?

«Behavior нужен, потому что так требует Yii. А так не нужен, конечно».
они создавались задолго до появления трейтов и замыканий в php, щас бы их не делали
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Учитывая, что мы в теории, конечно, можно заявить, что monkeypatching, как техника проектирования - спорная, но в том или ином виде заходит во все языки. В Java сделали целый AOP на этом.
В yii поведения пришли из ROR на волне бешеного роста популярности идеологии "херак-херак, и в продакшн" через кодогенерацию, миксины и колбеки.
 
Последнее редактирование:

MiksIr

miksir@home:~$
1) Просто интересно, не стану же я на UML диаграмме, ромбик и линию тащить просто к классу Behavior, когда налицо зависимости от кучи классов
А что за класс Behavior? Если ты про конкретные реализации - то к каждому классу, конечно. Выглядит ужасно, куча зависимостей? Задумайся о том, а может ты просто сам класс криво спроектировал начав с нарушения SRP.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
@MiksIr, скорее всего он обвешал страницу плагинами, как в друпале
 

ivanov77

Новичок
@MiksIr, скорее всего он обвешал страницу плагинами, как в друпале
Да, для этого примера, типа того, но поведения вообще много где работают функционально как паттерн Observer.

Сейчас рефакторю свою систему, к которой вернулся после перерыва, и эта проблемка была у меня на карандаше, т.к. код модулей, в вендоре, неменяемый и эти модели , с жесткими наборами поведений, стали тогда проблемкой, т.к. к ним была жесткая привязка, тогда я через classMap помоему подхакнул, но осадочек остался...
 

ivanov77

Новичок
для начала определи что конкретно тебе мешает, тогда понятно будет как исправлять.
чем конкретно тебе в твоей задаче мешает хардкод имен поведений?
не просто имен. А переопределить класс какого то поведения на его наследника, или вообще поменять набор.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
@ivanov77, так у тебя проблемы нет, это абстрактная гонка за идеалом в вакууме?
 

WMix

герр M:)ller
Партнер клуба
он просто путает классы и обьекты, на диаграмме классов я ничего кроме наследования и перегрузки метода не увидел. метод behaviors возвращает обычный массив. вероятнее всего существует ассоциация с этим методом из другого класса которая изображается не ромбиком а линией или стрелкой
 

ivanov77

Новичок
@ivanov77, так у тебя проблемы нет, это абстрактная гонка за идеалом в вакууме?
Я уточнял те вопросы, правильно ли я понимаю OCP, вы ответили на вопросы положительно, спасибо, что развеяли сомнения.
Также никто не увидел проблемы в пункте 5), раз не светит ярко значит окей, так и сделаю, через Template Method и решу задачу.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
ООП - не библия, его нельзя понимать и толковать. ООП - это методология использования бетона. Yii - это марка реальных бетонных блоков. Как сделаешь - так и будет светить. Будут вопросы по материалам или инструментам для реального дома - обращайся :)
 
Последнее редактирование:
Сверху