![]() |
|
Модераторы: Се ля ви |
![]()
|
|
| sergey_85 |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 445 Регистрация: 17.4.2007 Где: Россия, Челябинск Репутация: нет Всего: 1 |
Привет!
Есть ли здесь ошибка проектирования и главное - как её исправить? есть базовый класс BaseForm содержащий в себе набор базовых переменных, ссылка на БД, ссылка на конфигурацию и ссылка на скриптовую систему (Engine) Краткая суть: BaseForm - базовый класс, обеспечивает наследников базовой функциональность ScriptForm - наследник BaseForm, конкретный класс формы Engine - скриптовая система, в ней основная функциональность скриптовой сис-мы (к примеру загрузить форму по её ид, имени) ссылка на этот класс имеется в BaseForm.
Далее есть класс наследованный от BaseForm
И класс Engine - скриптовая система (юзается как ссылка (Engine engine) в BaseForm)
так вот класс Engine может иметь ссылки и создавать объекты классов, наследованных от BaseForm Но в свою очередь его ссылка содержиться в базовом классе BaseForm т.е. фактически базовый класс BaseForm может создать своих потомков через переменную engine, о которых ничего и не знает, отсюда получаются перекрестные ссылки. Я считаю это ошибкой проектирования, но не понимаю как ее исправить, думаю перенести переменную engine из BaseForm в конечные классы, типа ScriptForm, но тогда придется переопределять переменную engine в каждом новом классе! Это сообщение отредактировал(а) sergey_85 - 30.12.2009, 13:39 -------------------- A good design always pays off. |
||||||
|
|||||||
| deniva |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 24.5.2007 Репутация: 2 Всего: 2 |
А зачем BaseForm нужна ссылка на Engine?
|
|||
|
||||
| sergey_85 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 445 Регистрация: 17.4.2007 Где: Россия, Челябинск Репутация: нет Всего: 1 |
для того, чтобы обеспечить всех наследников от BaseForm функциональностью скриптовой системы.
Например я создам компонент - форма выбора элемента (таблица + кнопки нов. ред. удал.) при нажатии этих кнопок будет окрываться соответствующая форма редактирования, заданная в конфигурации
или например компонет выбора эл-та текстовое поле + кнопка при нажатии на кнопку через скрипт engine будет открыта нужная форма из конфигурации cfg Это сообщение отредактировал(а) sergey_85 - 30.12.2009, 14:18 -------------------- A good design always pays off. |
|||
|
||||
| deniva |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 24.5.2007 Репутация: 2 Всего: 2 |
Я думаю тебе надо аккуратно расписать ответственности классов.
То что одна форма вызывает другую - это не нормально. Сейчас у твоих классов *Form по крайне мере есть две ответственности: нарисовать себя + обработать действия пользователя. Надо бы "обработать действия пользователя" перенести в другое место. |
|||
|
||||
| sergey_85 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 445 Регистрация: 17.4.2007 Где: Россия, Челябинск Репутация: нет Всего: 1 |
т.е. на обработать действия пользователя" создать новый класс?
-------------------- A good design always pays off. |
|||
|
||||
| deniva |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 24.5.2007 Репутация: 2 Всего: 2 |
Сначала надо бы определиться за что отвечает каждый класс. Потому как я вижу дело не только в наличии engine в классе BaseForm. А про "обрабатывать действия пользователя" можно сделать так. Применить паттерн Command и при создании формы передавать экземпляр Command в конструкторе, как действие, которое надо выполнить по нажатию кнопки. Если несколько кнопок - передавать несколько экземпляров Command. Когда кнопка нажимается просто вызывать соответствующий метод (обычно do() или execute() ) у переданного Command-объекта, который в свою очередь знает о других формах и может их открыть, например. Тогда тебе никакой Emgine не будет нужен в *Form. |
|||
|
||||
| sergey_85 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 445 Регистрация: 17.4.2007 Где: Россия, Челябинск Репутация: нет Всего: 1 |
ок
-------------------- A good design always pays off. |
|||
|
||||
| ida |
|
|||
![]() замужем ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2277 Регистрация: 14.5.2002 Где: Санкт-Петербург Репутация: 6 Всего: 58 |
Я вот не очень понимаю, как можно диагностировать, есть ошибка проектирования или нет, не зная сути задачи.
deniva, ты так умеешь? Это сообщение отредактировал(а) ida - 30.12.2009, 22:32 |
|||
|
||||
| deniva |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 24.5.2007 Репутация: 2 Всего: 2 |
Есть ряд простых правил, которых надо придерживаться. В данном случае нарушено правило - SRP - The Single Responsibility Principle (Принцип персональной ответственности). Нарушение прямо следует из тех данных, что представлены. Я когда-то давно перечислил эти правила тут. Пока нет времени написать о них по подробнее, но если погуглить по названиям, то все станет ясно. ida, кстати тема для статьи |
|||
|
||||
![]()
|
| Правила форума "Системный анализ, проектирование и UML" | |
|
|
Форум "Системный анализ, проектирование и UML" предназначен для обсуждения вопросов, так или иначе связанных с этапами жизненного цикла автоматизированных (программных, информационных, автоматических) систем: • предпроектные обследования объектов автоматизации; • разработка концепции создания систем; • моделирование бизнес-процессов (в т.ч. на UML); • проектирование архитектуры систем; • управление проектами; • управление качеством; • CASE-средства; • реинжиниринг. Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Се ля ви. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Системный анализ, проектирование и UML | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |