Russian Qt Forum
Ноябрь 26, 2024, 06:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Структура объектов в программе  (Прочитано 8683 раз)
ddipp
Гость
« : Сентябрь 08, 2009, 20:02 »

Раньше я писал только на функциональных языках, а теперь решил попробовать ООП с C++/QT.
Для обучения себя решил написать небольшую программку для учета личных финансов и сразу возникли вопросы по структуре объектов.
Заранее извиняюсь за терминологию.
Определил три сущности:
  • gui - класс, отвечающий за отрисовку окна приложения, отображение данных
  • sql - класс, ответственный за хранение, извлечение и первичную обработку данных
  • calculating - класс в котором будет реализована вся математика и составление отчетов. Этот класс будет находиться между двумя предыдущими
Пока примерно так, но в голове пока не отражается взаимодействие между ними. Ведь нужны будут связи между классами. Например при наступлении какого-либо события в классе gui запускается что-либо в классе calculating и наоборот. Если связи односторонние, то все понятно, а вот когда все объекты (при моей структуре) должны давать друг другу различные сигналы, то на что это указывает? На кривую иерархию классов или так и надо?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Сентябрь 08, 2009, 20:23 »

если классы взаимодействуют через сигналы/слоты (ну и функции), то все ок. Если же идет прямое обращение из 2х классов друг к другу (то есть они не могут порознь существовать), то имеет смысл сделать 1 класс.
Ну пример -
Код:
 class Window 
{
  public slots:
    void setValue(int);
 signals:
    void buttonClicked();
}

class Handler
{
  signals:
     void valueChanged(int);
  public slots:
     update();
}
Если ты соединяешь buttonClicked() с update(), а valueChanged(int) с setValue(int), то это нормальная зависимость
А если ты делаешь
Код:
 class Window 
{
   Handler * handler;
   void f() { ...handler->setValue(10);... }
   void setValue(int);
}

class Handler
{
  Window * window;
  void setValue(int value) { ...window->spinBox->setValue(value);... }
}
то есть из Handler управляешь состоянием класса Window (фактически тут также связаны циферка в окне и значение в Handler), то это плохой код.
Вообще надо смотреть более конкретно, однако общая рекомендация - классы не должны знать друг о друге (исключение - когда 1 класс не живет без другого, как к примеру модель и данные этой модели), а должны предоставлять интерфейсы для взаимодействия (сигналы/слоты). Кроме того, сигналы/слоты по возможности должны быть простых типов, а не пользовательских (иначе опять же получается жесткая связь)
Однако же, если классы не преполагается использовать поодиночке, то желательно выстроить иерархию - кто из классов главный, а кто подчиненный. И минимизировать доступ из подчиненного к главному
Записан
ddipp
Гость
« Ответ #2 : Сентябрь 08, 2009, 20:44 »

Возникла мысль сделать над всем этим еще один класс чтоб управлять всей этой кухней, но получится лишь еще одна сущность, не решающая проблему.
Попробую писать, по ходу буду решать позникающие проблемы.

Спасибо за пример сигналов
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Сентябрь 08, 2009, 21:35 »

можешь попробовать описать задачу вкратце? просто общими словами сложно говорить в данном случае:)
класс-контролер конечно выход, но его можно встроить в класс-гуевину к примеру
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Сентябрь 08, 2009, 23:26 »

ddipp, если у тебя программа только с GUI, то сделай класс главного окна приложения главным в программе, в нём создавай объекты других классов и соеденяй сигналы со слотами.

Подавляющее большенство программ на Qt так и устроены, это ты можешь увидеть в примерах и дамках, которые  идут вместе с Qt.
Записан

Юра.
Steven_Orko
Гость
« Ответ #5 : Сентябрь 09, 2009, 12:34 »

Раньше я писал только на функциональных языках, а теперь решил попробовать ООП с C++/QT.
Для обучения себя решил написать небольшую программку для учета личных финансов и сразу возникли вопросы по структуре объектов.
Заранее извиняюсь за терминологию.

Для начала, прежде, чем писать программу, сделай системный анализ постановки задачи. Выдели основные сущности, их методы, цели и решаемые задачи. Сделай декомпозицию основной задачи на более простые, эти в свою очередь еще на более простые, и т.д. Уровень декомпозиции выбирается всегда по-разному. Начни с проектирования математического обеспечения, а уже потом переходи к лингвистическому.
Qt - это всего лишь инструмент. )))))
Скажу сразу, что только всего лишь  трех классов тебе явно будет недостаточно.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Сентябрь 09, 2009, 12:43 »

Для начала, прежде, чем писать программу, сделай системный анализ постановки задачи. Выдели основные сущности, их методы, цели и решаемые задачи. Сделай декомпозицию основной задачи на более простые, эти в свою очередь еще на более простые, и т.д. Уровень декомпозиции выбирается всегда по-разному. Начни с проектирования математического обеспечения, а уже потом переходи к лингвистическому.
Qt - это всего лишь инструмент. )))))
Скажу сразу, что только всего лишь  трех классов тебе явно будет недостаточно.
Есть и другой подход. Сначала просто писать "как получится".
Цитировать
ddipp, если у тебя программа только с GUI, то сделай класс главного окна приложения главным в программе, в нём создавай объекты других классов и соеденяй сигналы со слотами.
Ведь это ничем не плохо. Если задача невелика - то и проблем не возникнет. А вот когда возникнут проблемы - перепроектировать. Это не так уж страшно и имеет плюс что проблемы будут реальные, "от жизни", вначале никто не предусмотрит всего.
Записан
Steven_Orko
Гость
« Ответ #7 : Сентябрь 10, 2009, 12:46 »

Есть и другой подход. Сначала просто писать "как получится".
Так появился Windows...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Сентябрь 10, 2009, 13:56 »

Есть и другой подход. Сначала просто писать "как получится".
Так появился Windows...
Никогда не любил Вындоуз, но вынужден признать: он имеет в 10 раз меньше проблем с совместимостью "от версии к версии" чем Mac OS(X)
Записан
Vexator
Гость
« Ответ #9 : Сентябрь 11, 2009, 07:27 »

Скажу сразу, что только всего лишь  трех классов тебе явно будет недостаточно.
может и хватить ) для простой бух проги этого вполне хватит Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.057 секунд. Запросов: 23.