使用“一千英尺高”(译注1)的视图
作者:埃里克·多伦伯格
架构师都希望了解正在开发的软件质量如何。软件质量的外在表现是满足客户的需求,其内表现则比较隐蔽,包括设计是否清晰,是否容易理解、维护和扩展。如果被人追问质量的定义是什么,我们通常只能敷衍道“只要看到,我就知道”,可是我们怎么才能看到质量呢?
在架构图里,系统是由若干个小方框组成的,方框之间的连线代表着各种含义;依赖关系、数据流、共享资源(例如总线)等。这种图好比从飞机上俯瞰地面风景,我们称为“三万英尺高”(译注2)的视图。另一种典型的视图是源代码,好比站在地面上看大地。两种视图都无法充分展现软件的质量:前者太抽象,而后者细节太多,以致我们看不清整个架构。很显然,我们需要一个介于两者之间的视图——“一千英尺高”的视图。
“一千英尺高”的视图提供的信息来自恰当的层次,囊括了大量数据和多种度量标准(multipe metrics),例如方法数(method count)、类扇出数(class fan out)(译注3)和圈复杂度(cyclomatic complexity)(译注4)。具体的视图与特定的质量性密切相关,例如可视化的依赖关系图、在类的级别上显示多种度量标淮的柱状图,以及复杂的、关联多个输入值的复合标准视图(polymetric view)。
纯粹靠手工绘制这些视图,关且保持它们与软件同步是不现实的,我们可以借助工具直接根据源代码创建视图。虽然有专门绘制图(例如设计结构矩阵)的商业工具包,但是利用提取数据的小工具,加上通用的绘图工具包,也可以非常容易地绘制出想要的视图。举一个简单的例子,可以将Checkstyle(译注5)的输出结果(一组针对类和方法的度量标准及结果)导入电子表格工具,然后生成图表。Checkstyle的输出结果还可以使用InfoViz(译注6)工具箱绘制成树状图。GraphViz(译注7)则是绘制复杂依赖关系图的理想工具。
一旦我们绘制出合适的视图,判断软件质量就更客观了。借助视图,可以将开发中的软件和若干相似的系统进行比较。对比软件的不同版本可以显示变化的趋势,对比不同子系统的视图可以发现异常之处。既使只有一张图表,我们也可以依靠技巧发现其中的模式和美学规律。对称性良好的树状结构很有可能代表着合理的类层次结构,比例协调的框图可能是合理分配类大小的表现。许多时候,外表和内在是一致的。
译注1:一千英尺≈305米。
译注2:三万英尺≈10000米。
译注3:类扇出数(class fan out)。扇出数(fan out)原是半导体电路中的概念,用于表示输入逻辑门可驱动同类型输入逻辑门的数量。类扇出数则是用来描述类之间的耦合度的一种代码质量,其数值表示一个类依赖的其他类的个数。
译注4:圈复杂度(cyclomatic complexity),又称为条件复杂度(conditional complexity),它通过测量源代码中的线性无关路径数来衡量程序的复杂度。
译注5:Checkstyle是一款检查代码规范的软件。
译注6:InfoViz是一款将数据表转换成可视图形的工具。
译注7:GraphViz是一款显示结构化信息的图形工具。