程序逻辑应该驻留在gui对象类中还是在类外部?

时间:2011-02-21 23:13:07

标签: c++ user-interface design-patterns wxwidgets

我有一个关于如何构建与GUI对象相关的代码的问题。假设我有一个对话框,其中有一个列表控件,其中包含从数据库中获取的一组名称。用户可以编辑名称。逻辑是否驻留在该对话框类中,还是应该来自外部。为了说明我的意思,这里有一些伪代码,显示在对话框类之外处理逻辑时代码的结构:

NamesDialog : wxDialog
{
  Private:
    ..stuff..
  Public:
    ...
    SetNames(wxStringArray names);
    wxStringArray GetNames();
    ..stuff..
}

因此,该类的用户将执行以下操作:

wxStringArray names = DatabaseManager::Get()->GetNames();
names.Sort();
NamesDialogObject.SetNames(names);
NamesDialogObject.ShowModal();
wxStringArray modified_names = NamesDialogObject.GetNames();
AddToDatabase(modified_names); //or something like this.

另一方面,数据库逻辑可以驻留在内部 NamesDialog类本身。在show方法中,我可以在数据库中查询名称,并且当用户与控件交互时(在这种情况下为列表控件),可以从事件处理程序更新数据库。因此,NamesDialog类只有Show()方法,因为不需要使用SetNames或GetNames()等。

通常首选哪种方法?我没有太多的工作经验,所以我不确定哪种方法是正确的。有时,处理类中的所有内容会更容易,但访问与其交互的对象可能具有挑战性。通常可以通过让相关对象像上例中的数据库管理器那样是单例来实现。

3 个答案:

答案 0 :(得分:3)

尝试使用MVC尺寸。

答案 1 :(得分:2)

设计gui程序时几乎没有类似的方法:

好的,最后一个是开玩笑。

前两个是设计gui程序的首选方法。两者都很好,所以无论你选择哪一个都不会出错。 然后你应该完全单元测试你的逻辑,这应该是演示者和模型。

答案 2 :(得分:0)

通常,您倾向于将实际工作与GUI本身相关联。这有两个原因:

  • 通过去除相关动作,您可以重复使用它们。多个控件可以重复使用相同的操作(想想Save:CTRL + S,File> Save,File> Save As),它也可以由命令行/脚本触发。
  • GUI意味着响应,你不希望它被卡住,因为它正在向数据库传输内容,因此你想在另一个线程中执行“操作”。

编程的一般方式是通过消息传递/事件处理。 GUI发送和接收事件/消息,工作实际上由一个(或几个)后台线程执行。

典型的模型是MVC(模型 - 视图 - 控制器),但还有其他合适的替代方案,所以不要卡在上面。