为了使项目能够随着开发工作的进行加速前进,而不会由于它自己的老化停滞不前,设计必须要让人们乐于使用,而且易于作出修改。这就是柔性设计。
柔性设计是针对深层建模的补充。一旦我们挖掘出隐式概念,并把他们显示的表达出来之后,就有了原料。通过迭代循环,我们就可以把这些材料打造成有用的形式:建立的模型能够简单而清晰的捕获主要关注点;其设计可以让客户开发人员真正使用这个模型。在设计和代码的开发过程中,我们将获得新的理解,并通过这些理解改善模型概念。
1,释意接口(Ietention-Revealing-Interface)
主要解决沟通问题,强调要面向接口设计,而且接口及参数的命名一定要表达出意思来,这样调用者不会迷糊。还是那句话,写出人能看懂的代码。
-
可以把关系和规则表述出来,但不要说明规则如何实施的。
-
可以把事件和动作表述出来,但不要描述他们是如何执行的。
-
可以给出方程式,但不要给出解方程式的数学方法。
-
可以提出问题,但不要给出获取答案的方法。
2,无副作用方法(Side-Effect-Free Function)
此模式强调对一些值对象的操作一定不要产生副作用。值对象所有操作应该是无副作用的函数。
宽泛地把操作分为两大类别:命令和查询。
-
查询是从系统获取信息,查询方式可能只是简单地访问变量中的数据,也可能是用这些数据执行计算。
-
命令(也称为修改)是修改系统的操作(举一个简单的例子:设置变量)
返回结果而不产生副作用的操作称为函数。一个函数可以多次调用,每次调用都返回相同的值。尽可能把程序的逻辑放到函数中,严格地把命令隔离到不返回领域信息的,非常简单的操作中。
3,断言(Assertion)
此模式强调对“释意接口(Ietention-Revealing-Interface)”和“无副作用方法(Side-Effect-Free Function)”编写单元测试,以保证接口和函数无歧义。
4,概念轮廓(Conceptual Contour)
此模式强调把相关的操作,接口,类和聚合放在一起,使其更内聚,使其内部更加稳定。
5,独立类(Standalone Class)
此模式强调低耦合,把其他所有无关概念提取到对象之外,使其对象更加独立和理解。
相互依赖使模型和设计变得难以理解,测试和维护。而且互相依赖很容易越积越多。
Module和Aggregate的目的是为了限制相互依赖的关系网。
尽力把最复杂的计算提取到Standalone Class(独立类)中,实现此目的的一种方法是从存在大量依赖的类中将Value Object 建模出来。
6,闭合操作(Closure Of Operation)
闭合操作指方法的返回值和参数类型相同。
正如对整数的加减运算只会产生整数一样,如果模型中操作的返回值和参数是同一种类型的话,就可以不引入新的概念而描述这个操作。
大部分闭合操作都应该到Value Object 中去。
7,声明式设计
最好的声明式设计能够使开发人员不必去做那些单调乏味的工作,同时又完全不限制他们的设计自由。例如持久化和对象映射。
写在最后:
软件的最终目的是为用户服务。但首先它必须为开发人员服务。
参考:《领域驱动设计》 Eric Evans [美]