首页 > 代码库 > C++ wxFormBuilder进阶:通过类继承实现UI和处理逻辑的解偶

C++ wxFormBuilder进阶:通过类继承实现UI和处理逻辑的解偶

 

通过 wxFormBuilder 设计了应用程序的界面,并且可以运行了。

但是这款应用程序仅仅停留在可以运行的阶段,从设计、维护的角度分析,还存在众多缺陷。
在本文中,会结合 wxFormBuilder 工具,谈一谈如何使这款应用更加易于维护。
本文中主要阐述一个问题:如何将 GUI 设计和业务逻辑设计剥离。wxFormBuilder 提供了非常强大的自动生成代码的功能,这也是我们选择 wxFormBuilder 的主要原因。但是使用过后,会发现如果在通过 wxFormBuilder 设计完 UI 之后,后期 UI 如果稍有变化,那么就必须重新合并 UI 部分和我们定制的业务逻辑代码。
针对这种情况,面向对象思想中,通过“类继承”可以非常容易的避免这种问题带来的麻烦。首先看下图:

 

image

在上面的 UML 中我们要设计一个查找窗口(FindDialog),其中包含了两个类:FindDialogBase 与 FindDialog,并且后者继承于前者。在设计的过程中,FindDialogBase 类完全由 wxFormBuilder 设计并自动生成代码。FindDialog 在继承之后,除了显示查找窗口外,还有一个额外的需求:
能够记录下用户所有的查找记录。
下面对这个需求进行一下简单的分析:
1、每次用户点击查找进行所有的时候,将用户输入的内容进行记录;
2、当用户关闭查找窗口,或者点击“Quit”结束查找的时候,将记录的条目固化到硬盘上;
3、下次用户调出查找窗口的时候,从硬盘上读取上次保存的条目,并初始化到查找输入框的下拉选单中。
通过以上的分析,自然可以看到,在子类 FindDialog 中需要一个保存用户输入条目的变量,并且需要在初始化(构造)和退出之时加载和保存此变量的值到硬盘上。
实现类继承的代码如下:

class FindDialog ( FindDialogBase ):     ‘‘‘     Implement the Find Dialog;     ‘‘‘     def __init__ (self, parent, filename = HIST_FILENAME):         FindDialogBase.__init__(self, parent)         # The history filenane;         self.HistFilename = filename         # The find history;         self.FindHistory = []         # Disable the **Find** Button;         self.m_btnFind.Enable(False)         # Initialize the find history;         self.__InitFindHistory()         # Initialize the String Combo List;         self.__InitFindComboBox()         # Set window focus;         self.m_cmbString.SetFocus()

 

这样通过类的继承,就将 UI 与业务处理逻辑进行了剥离,实现了解偶。比如,在用户的时候过程中,还会不断提出新的需求,比如:
1、增加复选框,用于指定是否大小写敏感;
2、对输入内容进行过滤;
3、向前搜索,向后搜索;
4、……
用户的需求会一直不断变化,唯有实现了 UI 和处理逻辑解偶,才能更加从容的应对变化。

C++ wxFormBuilder进阶:通过类继承实现UI和处理逻辑的解偶