【问题标题】:How to separate model from gui?如何将模型与gui分开?
【发布时间】:2011-01-09 13:06:43
【问题描述】:

我希望这不是一件非常琐碎和显而易见的事情。
我正在从事一些类似的程序。在每个程序中,我都必须实施有关保存项目的未来。我带来了以下设计:

Project
 -- Program1Project
 -- Program2Project

基类项目:

class Project
{
 public:
   void NewProject();
   void SaveProejct();
   void OpenProject();
 protected:
  virtual void New();
  virtual void Save();
  virtual void 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 方法中。经过一番思考,我认为这不是一个好的解决方案,因为项目类是模型类,模型类不应该创建 GUI。所以,我在想,从第 1 行到第 5 行编写代码的最佳位置可能是在特定程序的保存/打开按钮事件处理程序中。但这意味着我将不得不为每个程序复制它。

所以问题是我应该如何将我的所有程序都相同的对话框的创建与不需要复制代码的项目的实际保存/打开分开?

【问题讨论】:

    标签: user-interface model business-logic


    【解决方案1】:

    GUI 应该引用模型,而不是模型引用 GUI,这几乎可以使模型的联系不受 GUI 的影响。真的没有办法让 GUI 完全不受模型的影响。在某些时候,即使实现隐藏在 GUI 之外,您也会有某种依赖。

    【讨论】:

    • +1:此外,我们通常在开始编写 GUI 之前对模型进行单元测试。这确保了模型独立于 GUI 存在。然后我们在模型完成并进行单元测试后添加 GUI。
    【解决方案2】:

    您可以创建一个单独的类,作为模型和视图之间的控制器。例如,控制器可以是项目的成员,在第 1 行您可以调用 this->viewController->showDialog(callBackForYes, callBackForNo, callBackForCancel)

    viewController 类可以直接回显 gui,或者为不同的 gui 组件使用视图类。

    【讨论】:

    • 但是模型不应该知道控制器,即控制器可以调用模型上的方法,但模型不能调用控制器上的方法。或者,我错了?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    相关资源
    最近更新 更多