Russian Qt Forum

Qt => Общие вопросы => Тема начата: ddipp от Сентябрь 08, 2009, 20:02



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


Название: Re: Структура объектов в программе
Отправлено: Авварон от Сентябрь 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 класс не живет без другого, как к примеру модель и данные этой модели), а должны предоставлять интерфейсы для взаимодействия (сигналы/слоты). Кроме того, сигналы/слоты по возможности должны быть простых типов, а не пользовательских (иначе опять же получается жесткая связь)
Однако же, если классы не преполагается использовать поодиночке, то желательно выстроить иерархию - кто из классов главный, а кто подчиненный. И минимизировать доступ из подчиненного к главному


Название: Re: Структура объектов в программе
Отправлено: ddipp от Сентябрь 08, 2009, 20:44
Возникла мысль сделать над всем этим еще один класс чтоб управлять всей этой кухней, но получится лишь еще одна сущность, не решающая проблему.
Попробую писать, по ходу буду решать позникающие проблемы.

Спасибо за пример сигналов


Название: Re: Структура объектов в программе
Отправлено: Авварон от Сентябрь 08, 2009, 21:35
можешь попробовать описать задачу вкратце? просто общими словами сложно говорить в данном случае:)
класс-контролер конечно выход, но его можно встроить в класс-гуевину к примеру


Название: Re: Структура объектов в программе
Отправлено: lit-uriy от Сентябрь 08, 2009, 23:26
ddipp, если у тебя программа только с GUI, то сделай класс главного окна приложения главным в программе, в нём создавай объекты других классов и соеденяй сигналы со слотами.

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


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

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


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


Название: Re: Структура объектов в программе
Отправлено: Steven_Orko от Сентябрь 10, 2009, 12:46
Есть и другой подход. Сначала просто писать "как получится".
Так появился Windows...


Название: Re: Структура объектов в программе
Отправлено: Igors от Сентябрь 10, 2009, 13:56
Есть и другой подход. Сначала просто писать "как получится".
Так появился Windows...
Никогда не любил Вындоуз, но вынужден признать: он имеет в 10 раз меньше проблем с совместимостью "от версии к версии" чем Mac OS(X)


Название: Re: Структура объектов в программе
Отправлено: Vexator от Сентябрь 11, 2009, 07:27
Скажу сразу, что только всего лишь  трех классов тебе явно будет недостаточно.
может и хватить ) для простой бух проги этого вполне хватит :)