Как отделить модель от графического интерфейса? - PullRequest
1 голос
/ 26 января 2010

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

Project
 -- Program1Project
 -- Program2Project

Базовый класс проекта:

class Project
{
 public:
   void NewProject();
   void SaveProejct();
   void OpenProject();
 protected:
  virtual void New();
  virtual void Save();
  virtual void Open();
};

Виртуальные функции переопределяются в производных классах, потому что только конкретная программа знает, как (какие объекты сохранить на диск) реально сохранить проект.

Также часть сохранения нового или открытия проекта показывает диалоговое окно SaveAs / Open, из которого пользователь выбирает, где сохранить / открыть проект. Например, NewProject () реализован в терминах метода New:

void Project::NewProject()
{
  1. // Show dialog for whether to save existing project
  2. // check whether the project was already saved
  3. // if yes, only overwrite the existing project
  4. // if no, show SaveAs Dialog
  5. // ...
  6. this->New();
}  

Строки с 1 по 5 - это код, который нужен всем моим программам, т. Е. Последовательность и порядок создания диалогов и проверки одинаковы.

Я думал о том, следует ли размещать реальный код, который создает диалоги, в методах Project :: New и Project :: Open. Подумав, я решил, что это не очень хорошее решение, потому что класс Project является классом модели, а класс модели не должен создавать GUI. Итак, я подумал, что, возможно, лучшее место для написания кода из строки 1 в строку 5 - это обработчики событий кнопок «Сохранить / Открыть» конкретной программы. Но это означает, что мне придется дублировать его для каждой программы.

Итак, вопрос в том, как мне отделить создание диалогов, которые будут одинаковыми для всех моих программ, от фактического сохранения / открытия проектов таким образом, чтобы не требовалось дублирование кода?

Ответы [ 2 ]

4 голосов
/ 26 января 2010

Графический интерфейс должен ссылаться на модель, а не модель на графический интерфейс, и это в значительной степени сохраняет связь модели без графического интерфейса.Там действительно нет способа сохранить графический интерфейс полностью свободным от модели.В какой-то момент у вас будет какая-то зависимость, даже если реализация скрыта от GUI.

1 голос
/ 26 января 2010

Вы можете создать отдельный класс, который действует как контроллер между моделью и представлениями. Например, контроллер может быть частью проекта, а в строке 1 вы можете позвонить this->viewController->showDialog(callBackForYes, callBackForNo, callBackForCancel)

Класс viewController может напрямую выводить графический интерфейс или использовать классы представления для различных компонентов графического интерфейса.

...