一、概述
重构就是在不改变软件功能的前提下重新设计它。开发人员无需在着手开发之前做出详细的设计决策,只需要在开发过程中不断小幅调整设计即可,这不但能够保证软件原有的功能不变,还可使整个设计更加灵活易懂。
我们面临的真正挑战是找到深层次的模型,这个模型不但能够捕捉到领域专家的微妙的关注点,还可驱动切实可靠的设计。最终目的是抽象出一套能够捕捉到领域深层次含义的思想方法和模式。以这种方式设计出来的软件不但更加贴近领域专家的思维方式,而且能更好的满足用户的需求。
为达到这一目标,其实现可以分为几个过程,同时也需要应用某些设计原则和模式。其过程可分为重构突破——发现深层模型——柔性设计——应用设计原则和模式。
领域驱动设计中最令人兴奋的事件就是突破。有时,当我们拥有了Model-Driven Design和显式概念,就能够产生突破。这让我们有机会使软件更富表达力、更加多样化,甚至会使它变得超乎我们的想象。这可以为软件带来新特性,或者意味着我们可以用简单灵活的方式来表达更深层次的模型。尽管这种突破不会时常出现,但它们非常有价值,当我们有机会进行突破时,一定要懂得识别并抓住机会。
二、突破
重构的投入与回报并非呈线性关系。一般来说,持续重构让事物逐步变得有序。代码和模型的每一次精华都让开发人员有了更加清晰的认识。这使得理解上的突破成为可能。之后,一系列快速的改变得到了更符合用户需要并更加切合实际的模型。其功能性及说明性急速增强,而复杂性却随之消失。
这种突破不是某种技巧,而是一个事件。它的困难之处在于你需要判断发生了什么,然后决定如何处理。
重构的原则是始终小步前进,始终保持系统正常运转。但突破时往往需要重构深层模型需要修改大量的支持代码,在突破时系统几乎无法正常运转。与大部分重构相比,这种变化的回报更多,风险也更高。而且突破出现的时机可能很不合时宜,这时需冷静决策。不要试图去制造突破,在不断重构、精化中,突破事件自然而然会到来。
通常,在经过一次真正的突破并获得深层模型之后,所获得的新设计变得更加清晰简单,新的Ubiquitous Language也会增进沟通,于是又促成了下一次建模突破。
三、将隐式概念转变为显式概念
为得到深层次模型,需开发人员识别出设计中隐含的某个概念或是在讨论中受到启发而发现一个概念,此时会对领域模型和相应的代码进行许多转换,在模型中加入一个或多个对象或关系,从而将隐性概念显式地表达出来。
1、概念挖掘
通常概念挖掘可以通过以下几种方法:
- 倾听语言,倾听领域专家或用户的语言发现隐藏概念。
- 检查不足之处,设计中最不足的地方可能是最需挖掘之处。
- 思考矛盾之处,逻辑上不一至的地方可能隐含某种深奥规律。
- 查阅书籍,查阅书籍并与领域专家合作可能一开始就能形成深层的认识。
- 尝试,再尝试,在多个路线上做不同的尝试可能会找到新的隐式概念。
2、如何为那些不太明显的概念建模
面向对象范式会引导我们去寻找和创造特定类型的概念。所有事物及其操作行为是大部分对象模型的主要部分,如面向对象设计中涉及的“名词和动词”。但其他重要类别的概念也可以在模型中显式地表现出来。
A、显式的约束
约束是模型概念中非常重要的类别。它们通常是隐含的,将它们显式地表现出来可以极大地提高设计质量。
如果约束的存在掩盖了对象的基本职责,或者如果约束在领域中非常突出但在模型中却不明显,那么就可以将其提取到一个显式的对象中,甚至可以把它建模为一个对象和关系的集合。</