1建立域模型
明确组件的需求和限制后,可以进行组件的顶层设计——建立域模型。域模型要确定系统中涉及的主要概念性对象。这个阶段,不关注组件内部细节,只关注组件与其他部件的交互关系。在这个过程中最重要的思想方法是抽象[1]。经过前面的需求分析,不难得出图2设计:
2优化域模型
软件设计的一条公认的准则是追求软件模块的“高内聚,低耦合”。换句话来表述更容易理解:模块设计追求清晰的概念,单一的功能[2]。考虑到我们仿真系统的支撑网络是以太网(平台支持以太网、互联网、反射内存网等),可以设计一个通用的从设备引擎类派生,完成与平台的交互任务,利用以太网通信代理完成与GPS设备的交互。如此一来,设备引擎类也实现了重用。(图3)
3详细设计
限于篇幅,不可能展现详细设计的全过程。在此阶段,如果将对象模型划分成静态模型(实体模型)和动态模型[2],将有助于产生良好的设计。静态模型负责保存信息,不具有行为能力。动态模型负责按照一定的规律改变静态模型中信息的状态。这样划分有三个优点:第一:静态模型有利于信息交换;第二:对象职责清晰。第三:静态模型的实现更灵活。在本例中,发送给GPS设备的命令、GPS设备返回的状态和位置数据以及组件发布和订购的属性都属于静态模型。以太网通信代理、GPS引擎、设备引擎、命令发生器、数据解析器等属于动态模型。(图4)
4实现的要点
组件采用面向对象设计方法,编程工具为VisualC++编程语言和MFC类库。MFC类库提供了Windows程序的一种实现框架和丰富的编程资源,也施加了许多约束。我在框架的约束下进一步优化了设计,试举两例:合理利用消息传递隐藏GPS引擎类的实现细节。为了最大限度的重用以太网通信代理,不应在以太网通信代理的代码实现中涉及GPS引擎类的实现细节。理想情况下,以太网通信代理应该不知道它在为哪种特定的组件做代理。因此,不在以太网通信代理的实现中直接调用GPS引擎的操作函数,转而采用消息传递。当从网络收到GPS数据和状态时,有相应的消息从以太网通信代理发送给GPS引擎,后者响应这些消息以完成发布更新属性、数据解析等工作。通信代理无需知道GPS引擎的消息响应函数以及具体的处理过程。如果今后GPS组件需要修改时,通信代理的代码可以保持不变。仔细考虑指针类型。C和C++语言编程中由于指针使用不当引发的各种程序问题数不胜数,因此需要仔细考虑指针的使用。以太网通信代理类需要在不同的组件中重用,直接在以太网通信代理类中包含GPS引擎类的指针是不合适的,取而代之是包含一个CWnd类的指针。在运行时,该指针指向GPS引擎类的对象实例,这样的做法限制了在以太网通信代理类中使用指针调用GPS引擎类的操作函数,尽量减少了以太网通信代理与GPS引擎类的耦合。相反,GPS引擎类只在GPS组件中使用,因此可以在GPS引擎类的实现中直接包含以太网通信代理类的指针,以方便直接调用以太网通信代理的接口函数。
5结论
研究组件框架设计模式的初衷是通过发现可重用类,简化后续组件的设计和编码工作。在此过程中,我发现可重用性分析在软件设计和实现中起到重要的指导作用,如果将可重用性分析贯穿从域模型建立到编码实现的全过程,产生优秀设计的可能性会增加许多。甚至可以说只有经过可重用性分析的设计才可能成为优秀的设计[3]。在设计中,我追求每个类应该具有“清晰的概念,单一的功能”,这是“高内聚,低耦合”的通俗理解。当然复合的类比如GPS引擎类功能实际上比较复杂,但是它将这些复杂的功能尽可能的分派给它的部件类来完成,从这个意义上,它也符合“清晰的概念,单一的功能”的标准。
作者:李航
相关专题:薄景山 我国中小企业融资现状