代码的坏味道:“横向”编程

我已经不止一次的看到,有的人代码里有这样的函数

A.XXX
B.XXX
C.XXX

A.YYY
B.YYY
C.YYY

A.ZZZ
B.ZZZ
C.ZZZ

这个函数要处理A,B,C 3个对象,每个对象要进行XXX,YYY,ZZZ,3种处理。于是形成了上面的9个语句。读上面的代码是不容易理解的,因为A.XXX,B.xxxx往往是没有关系的。读者难以理解为什么放在一起。A.XXX A.YYY是有关系的,但是他们隔着很远的距离。直到A.ZZZ读者恍然大悟,原来代码的意图是这样。

这是很不好的设计。大概因为作者写代码的时候,发现ABC都需要做一件什么事情,写完后发现,还需要做另一件事情。这种走一步看一步的结果就导致上述的代码。我称之为横向编程,缺乏立体感,层次感。这会导致冗余代码增加,不容易修改。

最简单的修复的办法,就是函数:

f(Obj){
  Obj.XXX
  Obj.yyy
  Obj.zzz
}
f(A)
f(B)
f( C )

此外如果需要的话,使用template模式,

public class Tmp{
   O{
     XXX
     YYY
     ZZZ
   }
  void XXX
  void YYY
  void ZZZ
}

A extends Tmp;
B extends Tmp;
C extends Tmp;

总之层次化便于减少代码的冗余,便于理解方法之间的关系。

Technorati Tags: 重构,Template
posted @ 2013-04-07 23:21  永远是学生  阅读(479)  评论(0编辑  收藏  举报