简单设计来源于极限编程(ExtremeProgramming,简称XP)。XP是由KentBeck在1996年提出的,是一种软件工程方法学,是敏捷软件开发中最富有成效的几种方法学之一。XP存在四个核心实践:TDD(Test-Driven Development)、重构(Refactoring)、简单设计(Simple Design)、结对编程(Pair Programming)。
简单设计四原则:
1 通过所有测试(Passes its tests)
2 尽可能消除重复(Minimizes duplication)
3 尽可能清晰表达(Maximizes clarity)
4 更少的代码元素(Has fewer elememts)
以上四个原则的重要程度依次降低。
简单设计原则初看平淡无奇,然而慢慢品味,实则大道至简:
通过所有测试,即功能的正确性,意味着我们开发的功能必须满足客户的需求。该原则隐含设计人员与客户沟通的重要性,保证原始需求与代码的设计、实现一致。
尽可能地消除重复,是对代码质量提出的要求。可扩展性是软件质量的八大属性之一,而重复是万恶之源(root of all evils),重复严重影响代码的可扩展性。
尽可能地清晰表达,清晰表达的代码,可以增加代码的可维护性。在宏观层面上,可以通过统一语言(Ubiquitous Language,来源于《领域驱动设计:软件核心复杂性应对之道》),实现业务人员、架构人员、开发人员、测试人员之间的需求传递;在微观层面上,通过引入DSL(领域特点语言,Domain Specific Language),函数名称自注释,引入解释性变量等方法,实现更易于理解的代码。
更少的代码元素,如无必要,勿增元素。它告诫我们避免为了迎合未来可能不存在的变化,落入过度设计的陷阱。在满足客户需求的基础上,只要功能代码做到了最小重复和清晰表达,就要避免进一步拆分或提取类、方法和变量。
最后一句话非常重要,它明确指出了以上四个原则的优先级关系。首先,保证功能正确性;其次,减少代码重复;再次,提升代码可理解性。若已满足了这三点要求,就不必过度设计,新增代码元素。正如曾国藩所言“物来顺应,未来不迎,当时不杂,既往不恋”。