简单设计
XP团队总是尽可能把设计做得简单和富有表现力(expressive)。此外,他们只关注本轮迭代中计划完成的用户故事,不担心将来的事情。相反,他们在一次次迭代中演进系统设计,让当前系统实现的用户故事保持最优的设计。
这意味着XP团队不大可能从基础设施开始工作,他们不会优先选择数据库或者中间件,而是选择以尽可能简单的方式实现第一批用户故事。只有当某个用户故事迫切依赖基础设施时,才会考虑引入。
下面有三条XP咒语(mantra)可以用来指导开发人员。
1.首先考虑可行的、最简单的方案
XP团队总是尽可能寻找针对当前用户故事的最简单的设计。在实现当前用户故事时,如果可以用平面文件(7),就不去用数据库或者EJB(企业级Java Bean);如果能用简单的套接字连接,就不去用ORB(对象请求代理)(8)或者RMI(远程方法调用)。多线程能不用就不用。团队尽量考虑用最简单的方法来实现当前的用户故事。然后,挑一种能实际得到且尽可能简单的解决方案。
2.其实将来也用不着
你说得都对,但我们知道总有一天需要数据库,总有一天需要ORB,也总有一天得去支持多用户。所以,我们现在就得为这些东西预留位置,是吧?
如果在确切需要基础设施之前拒绝引入会怎么样呢?XP团队会对此认真考虑。他们开始时假设不需要那些基础设施。只有当有证据或者至少有十分明显的迹象表明现在引入这些基础设施比继续等待更加划算时,团队才会引入基础设施。
3.有且只有一次
不能容忍重复的代码。只要发现重复的代码,他们就会来个“消消乐”。
导致代码重复的因素有很多,最明显的是用鼠标选中一段代码后到处粘贴。一旦发现重复的代码,XP程序员就会定义一个函数或基类来消除重复的代码。有时,两个或多个算法非常相似,但又有些微妙的差别,XP程序员会把它们变成函数或者运用模板方法(参见第14章的)。无论源头在哪里,只要发现重复,就要消除。
消除重复最好的方法是抽象。毕竟,如果两种事物相似,必定可以通过某种抽象来进行统一。消除重复的行为会迫使团队提炼出许多的抽象并进一步减少代码中的耦合。