重复的方式以及如何消除重复
有意识重复(懒惰的重复)
问题:A处的代码和B处的代码很相似,但是又不完全相同。
原因:开发人员的懒惰或技能不足,进行的是拷贝式的开发。
方案:引入模板方法模式或回调机制(函数指针、委托和接口)。
模板方法模式
1 public abstract class TemplateClass 2 { 3 public void Do() 4 { 5 DoCommonStep1(); 6 DoCustomStep2(); 7 DoCommonStep3(); 8 } 9 10 private void DoCommonStep1(){} 11 protect abstract void DoCustomStep2(){} 12 private void DoCommonStep3(){} 13 }
回调机制
1 public class TaskClass 2 { 3 public void Do(Action callback) 4 { 5 DoCommonStep1(); 6 callback(); 7 DoCommonStep3(); 8 } 9 }
无意识的重复(重复自己)
问题:A处的代码和B处的代码虽然不相似,但是完成的任务很相似(知识重复了)。
原因:技能不足、缺少知识库、缺少深入的思考。
方案:提升自己的技能;整理自己的知识库;多锻炼自己的抽象思维能,有些问题看似不一样,但是从技术上进行抽象会发现它们有很多一致性,如:树的遍历和展示。
无意识的重复(重复他人)
问题:A处的代码和B处的代码虽然不相似,但是完成的任务很相似(知识重复了)。
原因:缺乏沟通、缺乏机制。
方案:多沟通,在内部多沟通,在社区多沟通;建立良好的沟通和复用机制,在体制和文化上鼓励复用。
职责过多的方法
问题:A方法完成任务T1和T2,B方法完成任务T2和T3,没有将T2提取为独立的方法。
原因:懒惰。
方案:提取公共子方法。
职责过多的继承体系
问题:A类完成任务M和N,A的子类A1完成任务M1和N1,A的子类A2完成任务M1和N2,M1出现了重复。
原因:职责过多。
方案:引入策略模式或桥模式。
1 public class A 2 { 3 public void N(){} 4 5 public void M() 6 { 7 this.策略.M(); 8 } 9 }
显而易见的注释
问题:程序中遍布各种无用的注释。
原因:强迫症。
方案:引入具备解释性的变量或子方法。
界面、领域和数据库中知识的重复
问题:添加一个数据库字段,需要修改领域模型和界面。
原因:技术能力。
方案:引入元数据驱动开发,采用代码生成器或元编程。
文档中知识的重复
问题:文档中的知识不匹配代码中的知识。
原因:流程和制度问题。
方案:目前没有想到好的思路(待续)。
分类: Design Principle