侯为萍,高建利,刘玉倩
(中国电子科技集团公司第四十五研究所,北京101601)
软件开发中,好的设计会给系统的维护、修改、扩展带来极大的方便。好的系统设计来源于对过去成功开发经验的借鉴,而设计模式的引入正是将其他项目开发中总结的经验和当前项目的实际开发情况相结合,它使开发人员可以更简单方便地复用成功的设计和体系结构,并且在软件分析和设计上具有更高的视角,避免过早地处理细节。文中在设计和开发光刻版清洗系统软件的基础上,对设计模式进行研究和运用,选择和应用恰当的设计模式来提高软件系统的可扩展性和可维护性。
设计模式最初产生于建筑行业,建筑行业的设计师意识到他们需要共享有关正确设计技术的想法,这样他们可以从分享经验和教训中获益。20世纪80年代后期,设计模式从建筑业进入计算机系统领域,面向对象原则逐渐得到普及,而设计模式成为培育新的面向对象追随者的最佳实践[1]。其中24 种模式被奉为经典模式,依据设计模式的目的, 可将设计模式分为三类:创建型模式、结构型模式、行为型模式。创建型模式和对象的创建过程有关,结构型模式用于处理类和对象的组合,行为型模式对类和对象怎样交互以及怎样分配职责进行描述。本文中所引用的模式都来自于其中。
一般而言,一个完整的设计模式由模式名称、问题、解决方案、效果4 个基本要素组成。在实际的系统设计开发中,没有一个设计模式是独立存在的,设计模式之间存在着相互支持、相互依赖的关系。理解设计模式及其相互间的关系, 有助于很好地解决应用某设计模式时可能出现的其它新问题[2]。
光刻版清洗系统主要用于完成4 英寸、5 英寸、6 英寸光刻版的全自动化清洗工作(具体功能划分见图1),提供相关的图形界面,具有工艺设置,设备状态显示,温度控制,日志管理,用户管理,报警记录,高级设置,工艺操作,设备关闭等功能。
图1 系统功能用例图
在做光刻版清洗系统软件设计时,由于用户需求的不明确性,导致很难界定软件开发的具体范围。这是一个很大的问题。如果软件设计没有足够的可扩展性,层次之间耦合性很强,那么一旦用户提出新的需求或是更改原来的需求,将有可能导致软件系统代码大范围内的修改,甚至是整体推倒重来,这不仅会带来人力、物力上的巨大浪费,而且还可能引起一些商业上的纠纷[3]。为了解决这个问题,可以借助于业内成功者的设计经验,在系统的设计中引入设计模式,它可以极大地提升系统的可扩展性,保障系统有效地应对用户需求的变化。此外,设计模式的引入,还会增强系统的可维护性,降低软件系统后期维护的成本。
单件(Singleton)模式是创建型模式中最常见的一种,它用来封装对象的创建,旨在保证一个类仅有一个实例,并提供一个访问它的全局访问点。单件模式的典型工作方式是:定义有一个特定的方法,这个方法被用于实例化需要的对象。当这个方法被调用时,它检查这个对象是否已经被实例化。如果对象已经被实例化,这个方法仅仅返回这个对象的一个引用;如果对象尚未实例化,这个方法将对象实例化并返回这个新的实例的引用。为了确保该方法是创建这个类型对象的唯一途径,需要将构造函数定义为保护(protected)或私有(private)类型[4]。
对于光刻版清洗系统,定义一个Main 类,它代表整个系统,是光刻版清洗系统软件中的主类,负责软件中各个类的协调。因此,其实例应该是唯一的。为了保证只有一个Main 的实例存在,使用单件模式,并提供一个访问它的全局访问点。如图2 所示,Main 类定义一个Instance 静态方法,以及一个静态属性,类型为Main 类的实例。在Instance 方法中创建Main 类的唯一实例。同时,把Main 类原有的构造函数定义为保护类型,这样保证了客户只能通过静态成员函数来创建Main 的实例。从实施效果看,这样做可以保证对唯一实例的受控访问,Main 类封装了自身的唯一实例,所以它可以严格地控制客户怎样以及何时访问它;同时,缩小名字空间,单件模式是对全局变量的一种改进,它避免了那些存储唯一实例的全局变量对名字空间所造成的污染。
图2 单件模式
光刻版清洗系统中有温控单元,为使温控器的选择具有更大的灵活性,引入了策略(Strategy)模式。在策略模式中定义了策略的输入和输出,而把策略的实现留给了各个类,这些类的不同实现方案来实现统一操作,他们提供了统一的接口,因而这些类可以相互替换。策略模式允许多种策略共存,而代码不会混乱。该模式的意图在于把可选的策略或方案封装在不同的类中,并在这些类中来实现同一个操作。本系统中把不同的温控器读写控制命令封装起来,并使它们可以相互替换,这样不但可以在不同的温控器中选择性价比最高的,而且在将来有更好的温控器出现时能够方便地对系统进行改进和扩展。实现Strategy 模式的类图如图3 所示。
图3 策略模式
将温控类中的通用方法提升到接口ITemp-Control 中,该接口在实现上是一个抽象基类,所有具体算法类都从该接口派生,ConcreteTemp-ControlA,ConcreteTempControlB, ConcreteTemp-ControlC 是针对不同的温控器编写的具体温控类,它们只是在实现ReadUnitTempData 等操作时存在不同。使用策略模式后,编程时不针对具体的温控类,而是针对接口ITempControl 进行。由于具体的算法类都是从ITempControl 接口派生的,根据多态机制,只要改变类名就可以完成温控器的更换,无需大量的代码更改。
光刻版清洗系统软件通过运动控制卡对电机进行控制,该运动控制卡既可以是插在PC 主板PCI 槽上的CAN 卡或者雷泰卡等,也可以是单独的控制器等其他硬件。每种硬件通常都有一个专有类对它进行操作,由于每种硬件都有其特有的操作方式,操作类的方法各不相同。假设CANMotion 类用于操作CAN 卡,LTMotion 类用于操作雷泰卡。当需要更换运动控制卡时要进行大量的代码替换,适配器模式为这种情况提供了解决方案。适配器(Adapter)模式的意图是将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。如图4 所示,IMotionInterface 是Main 类用于操作运动控制卡的接口。它定义了一些操作运动控制卡的通用方法:CardOpen 方法用于打开运动控制卡,CardInit 用于初始化运动控制卡,CardClose 用于关闭运动控制卡,MotorMove 用于控制电机运动等。这样,只要保证每种运动控制卡的操作类实现了IMotionInterface 接口,就可以在基本不改变原有代码的基础上完成硬件的更改和添加。
图4 适配器模式
文中详细描述了在光刻版清洗系统软件设计中,选择和使用设计模式的经验。目前,该软件系统已投入使用,并获得了用户的高度评价。应用设计模式,可以复用成功的解决方案,避免为普通、重复的问题再重新设计解决方案,使得该软件系统开发的效率和软件系统的质量都得到了极大的提升,并且使软件系统具有更好的可扩展性和可维护性。
[1] Erich Gamma,Richard Helm,Ralph Johnson,etal. 李英军,马晓星,蔡敏,等译. 设计模式-可复用面向对象软件的基础[M]. 北京:机械工业出版社,2000.
[2] 马曦,李蕾,吕遐东,等. 设计模式在对准数据采集处理系统中的应用[J]. 舰船电子工程,2009,180(6):149-152.
[3] 杨洲,王自强,周余,等. 设计模式在数据采集系统中的应用[J]. 微电子学与计算机,2008,25(2):107-110.
[4] 蔡文貌,王自强,都思丹. 设计模式在机器人控制系统中的应用[J]. 科学技 术与工程,2008,8(1):199-202.