张森森
(桂林航天工业学院 计算机科学与工程学院,广西 桂林 541000)
随着软件工程技术的成熟与发展,采用工程化的方法进行软件开发已成必然。在进行面向对象方法学开发时,软件设计起到了至关重要的作用,只有好的设计才能保证编码阶段不会产生错误。因此,对大型的软件进行开发,必须按照不同的主题来进行对象模型的设计。这样即可以降低设计阶段错误的引入,也能减少后期编码阶段的难度[1]。目前,常规的主题划分方法,一般先由高级的软件开发人员根据前期得到的类图来进行划分,然后由具体的项目负责人员对项目逐步进行深入了解后,再进行进一步的修改。所采用的技术大都是按着问题域来进行主题的确认,而此方法未将功能或者是对象之间的耦合性作为参考的标准。
一般在研究问题时得到的原始类图中,类之间的相互连接因为有数据的传送,仅仅按着问题域进行划分并不是很好的选择。由于前期设计阶段得到的结果对后期的实现会产生深远的影响。因此,在进行类图主题划分时,也应该将得到的类之间的数据传送考虑进去。如果类图中存在两个类之间有密集的数据交流,但并不在同一个问题域中,也应该在实际的设计阶段将其放到同一个主题中。那么依据什么来进行这些类的移动,如何将这些放到一个合适的主题中,是一个优秀设计的关键。
软件重构应用于软件开发的各个阶段,主要目的是为了优化软件的结构,提高软件的可读性。在软件开发过程中占据的地位也是越来越大,例如软件开发的预防性维护阶段,主要采用的软件重构技术来进行。软件重构最主要的意义在于软件重构前后软件的功能不会发生改变,仅仅改变软件的内部结构。在类图主题划分阶段应用过程中,必须保证软件重构前后类图的整体设计不会发生改变,即系统对外显示的功能不会发生改变[2-3]。
权重计算法是为了解决上述问题,优化类图主题而提出的。权重计算的原理是根据类图中类的相互依赖关系,确定一个数值,定量得到某个类与对应主题以及相关主题之间的依赖关系[4]。如图1 所示:类A 按问题域划分到a 主题中,类B 按问题域划分到b 主题中,A 与B 之间有数据交流给其定值为1。假设b 主题中还有C、D 两个类,C、D 都与类A 有数据交流。但是主题a 中的其它类与类A 并没有据交流,可以粗略的认为主题a 与类A 的权重值为1,主题b 与类A 的权重值为3,在不影响软件整体功能的前提下,可以认为将类A 移动到主题b 中能够减少主题之间的依赖性,提高软件的质量,以及优化软件的结构。
图1 权重图形化Fig.1 Weight graphing
研究对象自动取款机(ATM)系统,银行拟开发一个对应的ATM 系统。按照对应的软件工程开发步骤先得到所需的类,建立相应的关联,然后按照主题划分为3 个常见的主题,即总行、分行、ATM,如图2 所示。总行主要包含总行类与ATM 类;分行主要包含分行类、分行计算机类、柜员终端类等等;ATM主要包含ATM 类、远程事务类以及银行卡类以及储户相关类等。
图2 ATM 系统常见的主题图Fig.2 Common themes of ATM systems
根据原始类图此类相关的信息,将里面的类进行抽象化得到图3。图3 具体记录了ATM 系统中各个类之间的关联。此类连接主要分为二种情况,一是每个主题内部自身类之间的连接。如:在主题分行中,分行类用来保管账户,所以分行类与账户类之间具有具体的连接,分行类与柜员类、分行类与分行计算机类、柜员类与柜员事务类等都属于这类的关系。通过相应的分析,也可以得到主题总行以及主题ATM 的内部各个类之间相应的连接情况。另一种连接方式则是各个不同主题之间类的连接。如:在图3 中,主题ATM 中的现金兑换卡能够访问主题分行中的账户,则需要在代表现金兑换卡类与代表储户类的抽象化的类之间建立相应的连接。同样在图3 中也可以找到很多类似此类的连接,如主题分行计算机类与主题总行中的中央计算机类等等。为了能够利用软件重构的权重计算法来进行研究,本文粗略的将各个有关联类之间的关联数据定量为1。在进行研究时,研究的对象应该是那些与其他主题具有直接关联的类,也就是能够满足第二种条件的类。
图3 ATM 权重图Fig.3 ATM weight diagram
在研究的ATM 系统中,中央计算机类、账户类、分行类、远程事务类、现金卡类、储户类都是满足第二种条件的类。因此,这些类作为全部的观察对象,因为需要得到原先主题以及可能需要移动主题之间的关系,因此还需要得到这些类第一种方法的值,具体的数据分析见表1。表1 中记录的信息主要包括需要研究的这些类与相应主题之间的权重数据。对表1 分析可见,中央计算机类、分行类、储户类与其它主题类的交流权重值等于与其对应主题的交流权重值,远程事务、现金卡类与其它主题类的交流权重值小于与其对应主题的交流权重值。因此,这些类在原主体中应保持不变。分析账户类明显看出,此类在分行主题中的权重值要小于ATM 主题中的权重值,因此可以进行移动。
表1 各类在不同主题分布表Tab.1 The categories are distributed in different topics
通过利用权重计算法能够定量的分析出主题间需要移动的类,保证了主题结构的清晰度,减少了主题之间的耦合性,确保在后期代码编写过程中软件的稳定性,减少了代码书写量,缩短了开发的时间,优化了软件的结构。在实际开发大型软件过程中已有很多的可视化工具能够帮助人们迅速找到类,以及各个类之间的关联值。而开发者需要做的,就是利用这些关联去得到需要进行比较的类,然后根据权重值来判断类是否需要移动。对软件重构来说,还有一点至关重要,就是主题之间类移动前后必须要保证软件对外的功能没有发生变化。由于本例中要移动的账户类设计较小,可以通过简单的结构分析得到结论,保证软件重构。但在大型的软件开发时,特别对于那些结构复杂的软件,在利用权重进行分析时必须要进行软件重构分析,必要时需要进行相应的测试,来保证软件重构前后软件的功能不会发生变化。在实际的运用过程中,没有必要去统计原有主题或者目标主题中的权重值,可以引进一个新的变量Q。Q 代表的是某个类在主题之间移动之后权重值的差值,引进这个变量就可以直接通过其的正负值来得到需要移动的类。通过上诉分析可知,Q 值为正时需要进行此类的移动,这在进行一些大型的软件开发过程中能够节省时间减少操作步骤。
本文虽然应用于一个小型的ATM 系统开发,但软件开发的步骤以及原则结构都非常的详尽,将此技术应用于主题间类的移动,能够明显的改善原始类图中主题的结构帮助,对整个软件开发过程都具有深远的影响。但是此项技术应用范围比较局限,没有得到更多的验证,仅仅本文中的例子是远远不够的,希望今后能够在更多的软件开发过程中得到运用。