《The Pragmatic Programmer》定义重复的4种 类型。
Imposed duplication (强加的重复):开发者觉得他们无可选择—环境似乎要求重复。
Inadvertent duplication(无意的重复):开发者没有意识到他们在重复信息。
Impatient duplication(无耐性的重复):开发者偷懒,他们重复,因为那样似乎更容易。
Inter-developer duplication(开发者之间的重复):同一团队(或不同团队)的几个人重复了相同的信息。
强加的重复:就是强加给我们的重复,比如我们代码中常常需要注释头文件,注释方法等等,为了解决这个问题,于是一些Addin诞生了比如VBCommenter、CodeTemplateNET。
无意的重复:比如我们设计的数据库中不知不觉会有信息冗余,这是无意的重复,还可能和设计中的错误有关。解决方法:改进设计,适时重构。
无耐性的重复:需要写一个与你以前写过的一个相似的方法,有时迫于时间压力,你会受到诱惑,去copy原来的代码,并做出一些改动。而不是去修改原来的方法,使它更通用。好了,如果业务变了,记住你就得修改两个地方,你又怎么能记得住呢,即使你记得住,你要你的继任者怎么能记得住?解决方法:记住欲速则不达,不要偷懒。
开发者之间的重复:比如我们有一个项目有三个模块需要根据你选择的模版初始化计算对象以便计算工资,照道理业务方法都是一样的,但是却写了三套方法,整个功能集无意中被重复,这些重复在几个月或几年终不会被发现,从而导致维护问题(不知道现在维护问题是不是已经出来了)。解决方法:鼓励开发者之间的主动交流,代码复查。
一次并且只有一次实现策略:只在一个地方实现一条规则,如果你的程序中有一条做某件事的规则,只实现它一次。通常这使得程序中方法数量大大增加,但只会造成极小的额外开销,却消除了重复(模块中方法的数量或许可以从侧面反映出这个程序员的水平噢!)。
重复是有害的,使我觉得软件开发就像是体力劳动。体力劳动可以减肥,我一个同学也是做软件开发,我不知道他是否是做软件开发这种“体力劳动”,两年下来,居然从原先的170斤下降到120斤,而且身材特好,令人羡慕,但是体力劳动的维护成本是很高的。脑力劳动可以让我们觉得因为设计所以出色。不重复,从体力劳动的噩梦中解放出来,这也是《Design Pattern》隐含的思想之一。
参考文献《The Progmatic Programmer》、《Design Pattern Explained》