文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

很少有程序员愿意去写一个结构糟糕的代码。

他们并不是坐下来,拿出《糟糕代码设计模式》的书籍,然后小心细致的写出糟糕的代码,相反,糟糕的代码常常出现于程序员不自知时。

Figure 2: Two Java package structutes

图1: 两个JAVA包的结构: 一个是设计良好的,一个就差了不少

那么,为什么这个很难呢?

源代码有很多属性和不同的类型。

其中一个属性,就是一个程序中公共接口数目。程序员可以很轻松的控制这个属性:把一个私有接口变成公共接口那么公共接口数目就增加了1。对,就这么简单,从某种意义上说,这是一个线性属性,小的变化会产生小的影响。

第 1 段(可获 1.46 积分)

代码结构也是一个源代码的属性,但是从方法a()中调用方法b()不仅仅影响这两个方法,所有依赖于a()的方法以及所有b()所依赖的方法,都形成了新的传递依赖关系。

更重要的是,JAVA的结构关系有三个层次:方法,类,和包。方法之间的传递依赖不仅影响着方法这个级别的结构,如果包含方法的类没有这个依赖,而他们的方法有这个依赖,那这个传递依赖关系会被设置到类级别的结构之间,同样的对于包之间也如此。因此,代码就够就不是一个线性的属性了,这意味着,一个小的变化会引发大的变化。

第 2 段(可获 1.19 积分)

这种非线性特性使得写一个结构设计整齐的代码是很难的。

如果我们能够忘掉这个庞大的总体结构,仅仅通过专注于某个小的线性特性上,从而能够神奇的最终写出结构整齐的代码那就太棒了。

然而,并不存在这种线性特性。

但是却存在隐藏的线索。

因为,源代码的属性是客观存在的,我们可以对它进行测量。我当然可以统计一个程序里公共接口的数量,以及有多少个其他的线性属性。我们也可以通过结构乱序——一个随着代码结构衰退而上升的百分比测量值,来测量一个程序的糟糕程度。如果我们测量的是好多个程序,那么我们可以测量结构乱序和其他属性之间的数学相关性。

 

第 3 段(可获 1.5 积分)

对于一个特定的线性属性与整体程序结构来说,微弱的相关性意味着没有任何关系。然而,很强的相关性则意味着如果对该线性属性加以精心管理的话,会使整体结构变得非常良好。

例如,如果结构紊乱性与公开方法的数目100%相关的话,那么我们可能会建议最小化公开的方法的个数从而将结构紊乱性降到最低,从而使用一个简单的线性的属性来控制一个复杂的非线性的属性。

让我们来试试吧。

第 4 段(可获 1.01 积分)

让我们从38个Java系统(1)里拿出四百万行代码来,放到一个代码分析器里,从而得到关于几十个结构化属性的相关性。表1展示了它们之间存在最强的结构性紊乱的相关性(2) (完整的矩阵:方法)。

 方法
平均的循环依赖0.620.210.58
平均的错乱0.750.390.02
平均深度0.660.710.89
平均影响集0.590.350.42
平均被影响集0.560.350.42
平均中间数0.70.23-0.1
平均的传递依赖0.560.240.35
平均的传递依赖的长度0.640.240.42
第 5 段(可获 1.41 积分)


表格1:结构性紊乱与其他属性的相关性

只有一个属性在所有的三个维度上都与结构性紊乱强烈相关,即深度

一个方法(类或包)的深度正好是它一个传递依赖中的位置。在图1中左边,方法a() 的深度是0,b()的是1, c() 的是2,等等。这些深度总和为21。然而在右边, a() 的深度仍然是0,而所有其他方法—都是由 a() 直接调用的—它们的深度都是1, 使得右边结构的总的深度仅仅为6。

Example: Original method drawLine()

图1:左边的深度传递依赖,而右边的则浅度依赖。

第 6 段(可获 1.48 积分)

由此可见,总的深度与结构性紊乱正相关。你的代码深度越深,则可能会更加的紊乱。如果你想管理你的程序的结构性紊乱,请避免深度依赖(3)。

其中一种办法是使用一个协调员 (旭日sunburst) 的方法,它负责去调用其他方法来完成复杂的工作,而协调员则起到排序的作用。然后将这种模式应用到类和包级别上。

总结

之前的一篇文章里介绍了代码结构的四种循证原则,在那里,证明相关性虽然微弱却是不可忽略的。

第 7 段(可获 1.15 积分)

这篇文章加入了第五种原则,"管理深度",但是要以一种更强的相关性来管理,这样循证的结构性原则的列表现在就变成了:

  1. 管理大小(Size)
  2. 管理方法的响(Impact)集
  3. 管理绝对的潜在(Potential)耦合
  4. 管理传递(Transitive)依赖
  5. 管理深度(Depth)

缩写为:SIPTD。

(不可否认,这并不是一个容易记住的缩写。)

第 8 段(可获 0.58 积分)

文章评论