计算机应用
COMPUTER APPLICATIONS
1999年 第19卷 第6期 Vol.19 No.6 1999



一种软件结构复杂度度量模型及其自动实现
王小明
　　摘　要　本文对软件结构中扇入/扇出对软件复杂度的影响进行分析,研究探讨了一种基于扇入/扇出的软件结构复杂度度量模型，给出了自动实现算法。该模型在结构化、软构件和基于组件的系统设计分析中具有较高的应用价值。
　　关键词　扇入，扇出，软件复杂度，模型
A MODEL OF MEASURING SOFTWARE STRUCTURE
COMPLEXITY AND ITS AUTO-REALIZATION
Wang Xiaoming
Computer Center,Gansu College of Economic Management， Gansu.Lanzhou，730070
　　Abstract　This paper analyzes the influence of fan-in and fan-out to software complexity in a software structure, and makes a study of some software structure complexity model, based on fan-in and fan-out，gives an automatic algorithm. the models have higher application value.
　　Keywords　Fan-in，Fan-out，Software complexity，Model
1　软件结构复杂度度量
　　在设计计算机大型软件的时候，无论是采用结构化方法还是面向对象技术，为了降低研究与设计的复杂度，总是采取“分而治之”的策略，即将要研究的大系统划分为多个规模适中的子系统，再通过对各子系统的研究设计、子系统集成，从而构成一个大型的软件系统。各子系统之间通过控制流与数据流相关联。在一定程度上，软件系统的复杂度取决于各子系统之间的控制流与数据流的复杂程度。从软件设计的角度来看，这种控制流与数据流即是模块间的扇入与扇出。软件结构复杂度是指模块结构的复杂度和整个软件系统结构的复杂度。结构复杂度度量主要是对软件中的控制流和数据流以及模块间的接口复杂程度等进行度量。经典的结构复杂度度量方法常用模块的扇入/扇出数量来度量模块的复杂度。一个模块的扇入指进入该模块的控制流与数据流之和，一个模块的扇出指该模块输出的控制流与数据流之和。软件结构的复杂度可表示为对应模块或子系统的扇入与扇出乘积的平方。一个模块应追求高扇入，使得该模块具有较高的可重用性；追求低扇出(扇出数小于8)，使得模块间藕合度较低。结构复杂度度量力求反映模块内部结构的复杂度以及模块间接口的复杂度，进而反映整个软件系统的结构复杂度。但是这种方法将扇入/扇出，模块间循环调用与顺序调用，分枝调用，逐层调用与隔层调用，不同深度的调用，等等，对模块(系统)的复杂度影响同等对待，按照系统科学和软件工程理论，这并不完全合理。本文在研究结构化系统设计与程序设计的基础上，将扇入/扇出对模块的复杂度影响分别讨论，给出了基于扇入/扇出的模块和系统结构复杂度定量度量的数学模型。使用这些模型可以在软件系统模块结构设计完成之后，对系统结构与模块的复杂程度作出定量度量，以便在祥细设计开始之前对复杂度过高的模块重新划分；对复杂度不合理的系统结构进行重新构建；对不同的系统结构方案进行复杂度比较，从中选择最优方案。
2　软件结构复杂度建模
2.1　软件工程若干准则
　　文献［2］［4］［5］［6］［7］中有关系统结构和模块复杂度理论可归纳如下：
　　准则1：结构化程序(系统)总是可以层次化的。
　　准则2：任一程序中，分枝结构比序列结构复杂；循环结构比分枝结构复杂。
　　准则3：任一程序中，隔层调用比逐层调用复杂；模块间自底向上调用(构成循环结构)比自顶向下调用复杂。
　　准则4：系统模块越多系统越复杂；中间层模块越多系统越复杂；模块层数越多系统越复杂。
　　准则5： 嵌套深度越大，程序越复杂；越靠近入口或出口的模块，复杂度越低。
2.2　若干概念
　　为了将扇入/扇出对模块(系统)结构复杂度的影响分开来讨论，以建立新的结构复杂度度量模型，引入如下几个概念。
　　扇出：指一个模块直接控制(调用)的模块数目。扇入：指直接调用该模块的模块数目。
　　模块总数(m)：系统中模块总个数。
　　深度层号：指软件结构从入口到出口各层次的顺序编号。
　　对称层号：当系统模块总层数n为奇数时，自顶(入口)向下(出口)各层对称层号依次为1，2，…，,…,2，1；当n为偶数时，自顶(入口)向下(出口)各层对称层号依次为1,2,…,,,…,2,1。
　　第j层对称层权值(yj):
2.3　数学建模
　　依据2.1系统结构复杂度准则1-5，在研究大量实际系统模块扇入/扇出对模块(系统)结构复杂度影响的基础上发现， 一个模块的扇出不仅影响其自身的结构复杂度，更重要的是影响系统其他模块结构的复杂度(接口复杂度)，并使其本身的结构复杂度按2的指数增长。一个模块的扇入影响其本身的结构复杂度，并使其本身的结构复杂度按e(e=2.71828)的指数增长。模块的结构复杂度函数依赖于系统总模块数、系统深度、模块在系统中所处位置、扇入/扇出来源与去向等。对于某一模块，只要有一个扇入或扇出复杂度较高，那么该模块仍然复杂度较高。
　　定义1:　由m个子模块构成的软件系统P,其子模块的结构复杂度定义为：
　　模块j的扇入复杂度:
Rj=m×hj×e｜j 模块深度层号-扇入i起点深度层号-1｜　　　　　　　　　　　(1)　
　　（q为j模块扇入总数, 1≤j≤m，m为模块总数，以下同）
　　模块j的扇出复杂度：
Cj=m×hj×2｜j 模块深度层号-扇入i终点深度层号+1｜　　　　　　　　　　　(2)　
　　（p为j模块扇出总数）
　　模块j的总复杂度:
　　　　　　　　　　　　　　(3)　
　　系统模块的平均复杂度：
　　　　　　　　　　　　　　(4)　
　　模块j的总复杂度相对于系统模块的平均复杂度的偏差：
　　　　　　　　　　　　　　　(5)　
　　依据软件工程理论，一个软件系统最优，不是某几个模块最优，而应该是所有模块优度均衡，从而使系统最优。所以，可根据系统乘法原理［7］定义软件系统的结构复杂度。
　　定义2:　由m个子模块构成的软件系统P,各模块的结构复杂度为Fj,则软件系统的结构复杂度为:
Z=Fj　　　　　　　　　　　　　　　　　(6)　
　　实践表明，当Kj≤-1时，该模块可能规模偏小，需同其它模块合并;当Kj≥1时，该模块可能规模偏大，需要进行再分解或调整控制流，使各结点复杂度达到基本的均衡，从而使整个系统结构复杂度达到较低水平。
3　结构复杂度度量的自动实现
　　定义3： 系统中模块所在层深度编号构成的行向量定义为：X=［x1,x2,x3,…,xm］。
　　定义4： 系统中模块集合S=(p1,p2,p3,…,pm),扇入矩阵Am×m定义为:
　　
　　事实上，扇入矩阵和扇出矩阵互为转置矩阵，即扇出矩阵Bm×m=Am×mT令矩阵Nm×m为：
　　
　　令矩阵Wm×m为：
　　
　　其中，e=2.71828
　　定义5： 系统中模块的对称层权值(y1,y2,y3,…,ym)构成的对角矩阵Hm×m定义为:
　　hij=yi；当j≠i时，hij=0
　　令对角矩阵Wm×m为：
　　dii=m×nij
　　当j≠i时，dij=0
　　则，模块的扇入复杂度对角矩阵
　　Rm×m为：R=D×H同理，令对角矩阵Gm×m为：
　　gii=m×wij；当j≠i时，gij=0
　　模块的扇出复杂度对角矩阵Cm×m为：C=G×H
　　系统模块的总复杂度对角矩阵Fm×m为：
　　
当j≠i时，fij=0
　　系统模块的平均复杂度：
　　系统模块的平均复杂度偏差对角矩阵Km×m为：;当j≠i时，kij=0
　　软件系统的结构复杂度：Z=Fii
4　结束语
　　(1)基于扇入/扇出的软件结构复杂度定量度量方法使用简单方便，在繁杂的程序设计开始之前就能对系统各模块以及整个系统的结构复杂度进行有效的度量分析，从而对不同的系统设计方案进行比较，评价，选优;对不合理的模块和控制流进行重新划分和调整，使系统复杂度达到整体上的优化。
　　(2)基于上述数学模型的自动实现使用了矩阵方法，只要给出系统模块的扇入矩阵或扇出矩阵,模块深度层编号，对称层权值，使用任一种计算机语言即可实现软件系统和模块的结构复杂度自动计算。笔者构造了100多种不同规模的软件系统结构模型，并对实际使用中的10种大型管理信息系统使用C语言实现该算法，对系统模块和系统结构复杂度进行了自动度量分析；对同一系统的不同系统结构方案进行了度量分析比较,其结果比较理想。
注：本项目受正林集团技术创新基金资助(No.980530)。
作者简介：王小明　副教授。主要研究方向：软件工程、管理信息系统、数据库的教学和研究。
作者单位：甘肃省经济管理学院计算机中心　甘肃.兰州(730070)
参考文献
［1］　Tom DeMarco.Structured Analysis and System Specification.Yourdon inc,1979
［2］　Roger S. Pressman, Software Engineering:A practitioner′s Approach,McGraw-HillBook Company,1982
［3］　Elism B. & Susan U. Object-Oriented Methodologies and Systems, 1994
［4］　Hausi A.M.&Rounald J.N.,The 17th IWCASE,1995
［5］　张海藩.软件工程导论.北京:清华大学出版社,1998
［6］　汤　庸.软件工程方法学及应用.北京:中国三峡出版社,1998
［7］　孙　凌.计算机信息系统分析与设计.武汉:武汉大学出版社,1994
［8］　杨士尧.系统科学导论.北京:农业出版社,1986
收稿日期:1999-03-09(修改稿)
