函数或过程可以认为是最基本的复用单元,每个函数具有一定的输入和输出,这样在处理相同或相似逻辑的时候,使用同一个函数,传递相同或不同的参数,就达到了复用的目的。
面向对象中的继承关系也可以看作是复用,加入多个实体具有相同或相似的方法和数据成员,就可以提取出来放到他们的父类中,这种方式近乎于人类思维中的分类。
一些数据表示和作用于其上的算法,比如链表,堆栈,数组,二叉树,矩阵,等等,在代码中经常用到,模板类的出现解决了这个问题。
AOP是最近几年出现的新事物,因为有人注意到了项目开发中经常要在代码中安插些业务逻辑以外的东西,比如日志,安全控制等,Interception可以帮我们简化这样的工作,也使我们很容易使用别人或自己的经验。
除了这些,在我们的开发中仍然很普遍的存在着知识和经验的重复,Don't Repeat Yourself, Andrew Hunt 和 David Thomas这样说,但是软件开发不是一个人的事情,一个项目经常牵扯到几十个人,上百人,甚至上千人,对于程序员来说,他所能做的只是在自己的代码中尽量避免重复,同样一个feature,需求,架构,设计,代码,还有注释,几乎都存在着重复的知识,当然重复并不完全是坏事,比如可以避免由于一个人人经验上的不足或者对问题认识得不清楚而增加以后的工作量,大家都在寻找一个平衡点,就像在RUP和XP直接寻找平衡一样。
技术的进步可以在一定程度上减少重复,减少重复工作量,减少因重复而引起的交流问题。可以在代码和文档直接保持更好的一致性,比如Executable UML;也可以在不同语言之间建立桥梁,避免同一问题在不同语言上的相同实现,比如CORBA。
领域语言和MDA则朝着更为理想化的方向努力,不知道什么时候才能达到这样的开发效果,也许突然有一天,老板决定购买一套新的MDA软件而解雇一大群软件工程师。不用再争论程序员能不能做到35岁,因为现在二十岁的小伙子到了35岁的时候会发现,他的软件开发的工作还是编码么?