首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

系统架构设计师:软件架构的演化和维护--软件架构可维护性度量实践

架构可维护性评估针对架构组件图进行度量,评估高层次上的架构复杂程度,待评估的Web读写系统的组件图如图10-20所示。将该图导出为XML文件并输入架构评估系统MS AES,解析出可维护性度量所需的数据,根据可维护性的6个子度量指标的计算公式进行计算。

从待评估系统的组件图中解析出的评估所需数据如表10-3所示。L、totalN 和 totalE 分别表示组件图数目、组件图中所有外部组件及其相连的边的数目(不包括组件内部的子组件以及子组件之间的连接边)。然后针对每个组件,我们获取该组件的内部组件数目S、依赖出边数目E、依赖入边数目X、使用接口数目R和提供接口数目W。由于组件ClientApplication具有子组件,需要获取其内部组件的依赖关系形成的邻接矩阵来度量该模块的内聚度。此处subl 和 sub2之间只有接口关系,没有依赖关系,因而其邻接矩阵是一个2X2的零矩阵。

然后根据可维护性的6个子度量指标的度量公式,利用解析得到的架构评估数据分别进行度量。其中圈复杂度(CCN)度量整个架构的独立执行路径的条数,该结果值即为待评估架构的最终度量结果;而对于扇入扇出度(FFC)、模块间耦合度(CBO)、模块的响应(RFC)、紧内聚度(TCC)、松内聚度(LCC)这5个度量指标,它们针对每个组件进行度量,则待评估架构的最终度量结果为所有组件结果的平均值。我们以组件Client Application为例分析各个子度量指标的计算方法。

待评估系统中其他组件的度量方法与Client Application相同。但是由于其他组件均没有子组件,使得P(S)的计算结果为0,TCC和LCC的计算公式中分母为0。此时无法计算该组件模块的内聚度,以“not applied”表示。当一个组件没有子组件时,我们认为该组件的内聚度最小。

在依次计算出每个模块的相关指标度量结果后,除CCN外,其余架构可维护性度量指标的最终结果为各个模块的度量结果的平均值,如表10-4所示。值得注意的是,我们只对组件图中的外部模块进行度量,即度量架构中的所有最高层模块,而其余模块均作为内部子模块,用来度量高层模块的内聚度。

根据表10-4所示的Web读写系统的度量结果,我们分别对架构可维护性的6个度量指标进行分析:图10-21~图10-23分别显示基于Web读写系统的各个组件的FFC、CBO、RFC度量结果,并按照结果值从高到低排序。

1)圈复杂度(CCN)由于在组件图中组件是独立的,每个组件代表一个系统或子系统中的封装单位,封装了完整的事务处理行为,组件图能够通过组件之间的控制依赖关系来体现整个系统的组成结构。对架构的组件图进行圈复杂度的度量,可以对整个系统的复杂程度做出初步评估,在设计早期发现问题和做出调整,并预测待评估系统的测试复杂度,及早规避风险,提高软件质量。圈复杂度高的程序往往是最容易出现错误的程序,实践表明程序规模以CCN<10为宜。

2)扇入扇出度(FFC)基于Web读写系统的各个组件的FFC度量值按照从高到低显示在图10-21中。扇入是指直接调用该模块的上级模块的个数,扇出指该模块直接调用的下级模块的个数。本文中用扇入扇出度综合评估组件主动调用以及被调用的频率。扇入扇出度越大,表明该组件与其他组件间的接口关联或依赖关联越多。从图10-20和图10-21中可以发现,RSApplication、WebApplication及MainInterface的关联关系最多,FFC度量值最大,而User、DB等组件与其他组件关联较少,FFC度量值也较小,验证了度量模型和结果的一致性。

3)模块间耦合度(CBO)基于Web读写系统的各个组件的CBO度量值按照从高到低显示在图10-22中。模块间耦合度CBO度量模块与其他模块交五互的频繁程度。CBO越大的模块,越容易受到其他模块中修改和错误的影响,因而可维护性越差,风险越高。一般来说,组件与其他组件的依赖关系及接口越多,该组件的耦合度越大。从图10-20和图10-22中可以发现,RSApplication.WebApplication等关联关系较多的组件,其CB O度量值也较大;反之,User、DB等与其他组件关联较少的组件,其CB0度量值也较小。

4)模块的响应(RFC)基于Web读写系统的各个组件的RFC度量值按照从高到低显示在图10-23中。RFC度量组件执行所需的功能的数量,包括接口提供的功能、依赖的其他模块提供的功能以及子模块提供的功能。从图10-20和图10-23中观察,ClientApplication包含子模块,Mainlnterface对其他组件的依赖较多,因而它们的RF C度量值较大;而DB、RemoteDB、LocalDB等没有对其他模块的依赖和调用,且不包含子模块,因而其RFC度量值为0。

5)模块间内聚度T(和LCC由于只有组件ClientApplication具有子模块,因而对该组件进行度量,并将该组件的度量值作为待评估系统的最终结果。好的架构设计应该遵循“高内聚-低耦合”原则,提高模块的独立性,降低模块间接口调用的复杂性。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OQnbWQKusf8PpO6krnqIm9HQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券