【问题标题】:Should the program logic reside inside the gui object class or be external to the class?程序逻辑应该驻留在 gui 对象类内部还是在该类外部?
【发布时间】:2011-07-01 15:17:39
【问题描述】:

我有一个关于如何构建与 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() 等。

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

【问题讨论】:

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


    【解决方案1】:

    试试MVC 的大小。

    【讨论】:

      【解决方案2】:

      在设计 gui 程序时,类似的方法很少:

      好吧,最后一个是笑话。

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

      【讨论】:

        【解决方案3】:

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

        • 通过解相关操作,您可以重复使用它们。多个控件可以重复使用相同的操作(想想保存:CTRL+S、文件>保存、文件>另存为),也可以由命令行/脚本触发。
        • GUI 旨在响应,您不希望它卡住,因为它正在向/从数据库传输某些内容,因此您希望在另一个线程中执行“操作”。

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

        典型的模型是MVC(Model-View-Controller),但还有其他合适的替代方案,所以不要卡在它上面。

        【讨论】:

          猜你喜欢
          • 2014-10-28
          • 1970-01-01
          • 1970-01-01
          • 2011-08-06
          • 2021-01-05
          • 2018-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多