有时,人们把功能拆分得很细,以便灵活地组合;有时,又把功能归拢成一大块,以便封装复杂性;还有的时候,会寻求一致的粒度,使类和操作保持相似的规模。这些做法都过于简单化,作为通用规则并不合适。但这些做法的动机则来自于一些基本的问题。
如果把模型或设计的所有元素放入一个单体结构而不进行拆分的时候,那么就会导致功能重复。此外,这个系统的外部接口也很难给出客户端关心的全部信息。由于把不同的概念混杂在一起,这些信息的含义也很难理解。
另一方面,把类和方法拆分开来又可能导致客户端无谓地复杂化,迫使客户端对象理解各个细碎的部分是如何组合在一起的。更糟的是,有些概念可能会完全丢失。铀原子的一半就不是铀了。当然,重要的不仅是孤立地考虑类和方法粒度的大小,而是在哪里以怎样的粒度运行才是恰当的。
因此:
把设计元素(操作、接口、类和聚合体)分解成内聚的单元。在此过程中,需要运用你对领域中这些重要划分的直觉。通过持续重构,观察容易变化的部分和保持稳定的部分的分界线,进而挖掘这些分界模式背后的概念轮廓。使模型与领域中那些稳固的方面相吻合,正是这些稳固的方面使模型成为一个持续有效的知识体系。
基于深层模型的柔性设计可以设计出一套简单的接口,这些接口可以以符合逻辑的方式组合在一起,并用统一语言进行合理的陈述,而且没有无关细节带来的干扰和维护负担。