Модераторы: Се ля ви
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перекрестные ссылки, ошибка пректирования, как исправить объектную модель? 
:(
    Опции темы
sergey_85
Дата 30.12.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



Привет! 

Есть ли здесь ошибка проектирования и главное - как её исправить?

есть базовый класс BaseForm содержащий в себе набор базовых переменных, ссылка на БД, ссылка на конфигурацию и  ссылка на скриптовую систему (Engine)

Краткая суть:
BaseForm - базовый класс, обеспечивает наследников базовой функциональность
ScriptForm - наследник BaseForm, конкретный класс формы
Engine - скриптовая система, в ней основная функциональность скриптовой сис-мы (к примеру загрузить форму по её ид, имени)
ссылка на этот класс имеется в BaseForm.

Код

class BaseForm
{
private:
SqlDataBase db;
Cfg cfg;
Engine engine
};


Далее есть класс наследованный от BaseForm
Код

class ScriptForm: public BaseForm
{

};


И класс Engine - скриптовая система (юзается как ссылка (Engine engine) в BaseForm)
Код

class Engine
{
public:
void openForm(String formName)
{ 
   ScriptForm frm = new ScriptForm();
   frm->Show();
}
};


так вот класс Engine может иметь ссылки и создавать объекты классов, наследованных от BaseForm
Но в свою очередь его ссылка содержиться в базовом классе BaseForm т.е. фактически базовый класс BaseForm может создать своих потомков через переменную engine, о которых ничего и не знает, отсюда получаются перекрестные ссылки.

Я считаю это ошибкой проектирования, но не понимаю как ее исправить, думаю перенести переменную engine из BaseForm в конечные классы, типа ScriptForm, но тогда придется переопределять переменную engine в каждом новом классе!


Это сообщение отредактировал(а) sergey_85 - 30.12.2009, 13:39


--------------------
A good design always pays off.
PM MAIL   Вверх
deniva
Дата 30.12.2009, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.5.2007

Репутация: 2
Всего: 2



А зачем BaseForm нужна ссылка на Engine?
PM MAIL   Вверх
sergey_85
Дата 30.12.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



для того, чтобы обеспечить всех наследников от BaseForm функциональностью скриптовой системы.
Например я создам компонент - форма выбора элемента (таблица + кнопки нов. ред. удал.) при нажатии этих кнопок будет окрываться соответствующая форма редактирования, заданная в конфигурации

Код

class SelectCatalogueForm : public BaseForm
{

void openEditor()
{
 engine->openForm("имя_формы_редактир.");
}
};



или например компонет выбора эл-та текстовое поле + кнопка
при нажатии на кнопку через скрипт engine будет открыта нужная форма из конфигурации cfg

Это сообщение отредактировал(а) sergey_85 - 30.12.2009, 14:18


--------------------
A good design always pays off.
PM MAIL   Вверх
deniva
Дата 30.12.2009, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.5.2007

Репутация: 2
Всего: 2



Я думаю тебе надо аккуратно расписать ответственности классов.

То что одна форма вызывает другую - это не нормально.

Сейчас у твоих классов *Form по крайне мере есть две ответственности: нарисовать себя + обработать действия пользователя.

Надо бы "обработать действия пользователя" перенести в другое место.
PM MAIL   Вверх
sergey_85
Дата 30.12.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



т.е. на обработать действия пользователя" создать новый класс?


--------------------
A good design always pays off.
PM MAIL   Вверх
deniva
Дата 30.12.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.5.2007

Репутация: 2
Всего: 2



Цитата(sergey_85 @ 30.12.2009,  14:37)
т.е. на обработать действия пользователя" создать новый класс?

Сначала надо бы определиться за что отвечает каждый класс. Потому как я вижу дело не только в наличии engine в классе BaseForm.

А про "обрабатывать действия пользователя" можно сделать так.
Применить паттерн Command и при создании формы передавать экземпляр Command в конструкторе, как действие, которое надо выполнить по нажатию кнопки. Если несколько кнопок - передавать несколько экземпляров Command.

Когда кнопка нажимается просто вызывать соответствующий метод (обычно do() или execute() ) у переданного Command-объекта, который в свою очередь знает о других формах и может их открыть, например.

Тогда тебе никакой Emgine не будет нужен в *Form.
PM MAIL   Вверх
sergey_85
Дата 30.12.2009, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



ок


--------------------
A good design always pays off.
PM MAIL   Вверх
ida
Дата 30.12.2009, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


замужем
****


Профиль
Группа: Завсегдатай
Сообщений: 2277
Регистрация: 14.5.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 58



Я вот не очень понимаю, как можно диагностировать, есть ошибка проектирования или нет, не зная сути задачи.

deniva, ты так умеешь? smile

Это сообщение отредактировал(а) ida - 30.12.2009, 22:32
PM WWW   Вверх
deniva
Дата 30.12.2009, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 24.5.2007

Репутация: 2
Всего: 2



Цитата(ida @ 30.12.2009,  22:32)
Я вот не очень понимаю, как можно диагностировать, есть ошибка проектирования или нет, не зная сути задачи.

deniva, ты так умеешь? smile

Есть ряд простых правил, которых надо придерживаться.
В данном случае нарушено правило - SRP - The Single Responsibility Principle (Принцип персональной ответственности).
Нарушение прямо следует из тех данных, что представлены.

Я когда-то давно перечислил эти правила тут. Пока нет времени написать о них по подробнее, но если погуглить по названиям, то все станет ясно.

ida, кстати тема для статьиsmile сейчас запишу...

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Системный анализ, проектирование и UML"
Се ля ви

Форум "Системный анализ, проектирование и UML" предназначен для обсуждения вопросов, так или иначе связанных с этапами жизненного цикла автоматизированных (программных, информационных, автоматических) систем:

• предпроектные обследования объектов автоматизации;

• разработка концепции создания систем;

• моделирование бизнес-процессов (в т.ч. на UML);

• проектирование архитектуры систем;

• управление проектами;

• управление качеством;

• CASE-средства;

• реинжиниринг.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Се ля ви.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Системный анализ, проектирование и UML | Следующая тема »


 




[ Время генерации скрипта: 0.0478 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.