领域驱动设计——领域的整体设计

一、整体设计

在前面基本了解了领域驱动的一些内容和MDD模型,那么领域设计从整体上如何把握呢?一个良好的模型是和程序设计紧密结合在一起的。也就是反复提到的模型的全软件生命周期的应用。那么,领域的整体设计就是一个很重要的问题,请一定要明白,它不是什么面向对象设计更不是什么设计模式的一种。
设计一个优秀的领域模型是一门艺术。它需要不断的对模型的各个元素进行抽象和系统化,特别是其与传统的关注业务点分离的设计会让模型更具有通用性。通过不断的迭代模型反复进行验证,则更益于创建出一个好的模型。

二、领域层

在软件设计中,其实最麻烦的是业务层,业务层是变化最快最大的。除去沟通上的成本导致的返工,真实的业务变化其实是占最大部分的。一开始对业务的不明确,业务的不同部门不同的理解,都可能导致业务需求的更改。
所以在实际的设计中,把业务抽象成领域,把领域相关单独成立一个层,将其从其它层中独立出来,这样,就可以将领域层与其它层分离,使层之间的设计界限分明。易于扩展;同时,根据实际的业务变化,利用层来不断满足相关需求。从设计上达到降低耦合,实现高内聚,减少无效的通信并提高程序的性能。
领域层则是领域模型以及所有与其直接相 关的设计元素的表现,它由业务逻辑的设计和实现组成。在MDD中,领域层的软件构造反映出了模型概念。

三、领域的分离

1、分层
在一个需求设计拿到手以后,第一件事是干什么?可能有的人会说,当然是划分模块啊。也有的人会说是抽象接口啊。如此等等。其实拿到设计后的第一件事,是判断需不需要设计。有些比较简单的功能和相对单一的功能,在需求时间有限制的情况下,设计不设计其实意义不大。有过实践经验的往往明白,一些小的功能,除非在特定的情况下(比如说学习或者说练手),设计根本没有任何意义,除了多增加工作量没有什么具体的内容。
那如果确定了这个设计需要设计一下,那么首要的任务是什么呢?分层。在计算机的世界里有一句名言,如果一个功能实现比较麻烦,就加一层(任何软件工程遇到的问题都可以通过增加一个中间层来解决)。那么设计分层和后面的加一层有什么区别呢?区别就在于主动和被动。开始设计时就分层,是主动的一种精神,扩展性、弹性等都可以提前思考,虽然不能解决万物,但可以有备而去;而后者则是在遇到问题后,想办法解决,不好的解决的就绕一下,加一层。一个是形而上,一个是形而下。不过,具体问题具体分析,孰优孰劣,还真不好说。
分层,就是把相关相同功能,业务逻辑相近,容易划分切片的相关部分逐次分开。就有如洋葱一层一层的。各层间通过接口、消息或者其它方式来完成交互。在传统的软件设计中,一般会分为UI层,业务层,服务层,数据层和持久层等。
在领域设计中,也可以通过分层抽象出专门的领域层。

2、the smart ui的反模式
智能用户界面,就是切割业务功能,集成到UI中迅速完成相关功能。此设计方式与领域设计完全不搭界,应用了the smart ui就无法再使用领域设计和领域模型了。所以,正所为兵法,反其道而用之,可以称此为反smart ui模式。

3、BOUNDED CONTEXT和ANTICORRUPTION LAYER
限界上下文:
The context of a model used in an example in this book is that particular example section and any later discussion of it. The model context is whatever set of conditions must apply in order to be able to say that the terms in a model have a specific meaning.
实际的意思是说,设计业务逻辑要有一个闭合的集合,这个集合的范围的确定,就是BOUNDED CONTEXT。正如如何区分一个人属于哪个国家,不是看他是长着一张哪国的脸,而是看他的国籍。至于如何确定个合理的、最小的Bound从而形成Conext这就要看设计者的功力和水平了。

防腐层:
DDD(Eric Evans)中引入的模式, 用于隔离两个系统, 允许两个系统之间在不知道对方领域知识的情况下进行集成。主要进行的是两个系统之间的model(模型)或者协议的转换, 并且最终目的是为了系统使用者的方便而不是系统提供者的方便, 进一步解释就是ACL尽量把系统提供者的模型转换为系统使用者的模型(而不引入中间第三者模型)。

4、其它
其它的应用还有很多,但哪种更适合于在领域层展开应用,就得看具体的情况了。

四、总结

学习和使用领域设计,是一个不断发展的过程。无论是对人还是对设计的对象,甚至设计本身。领域设计也提出了不断迭代不断完善的过程。所以在分析和说明领域设计时,真的是有一种战战兢兢的感觉,但还得往前走。话说回来,中台的概念其实就是想把领域进一步的抽象,结果是什么勿庸讳言。
走都没有走好,就想跑,跑是啥都不明白,就瞎跑,跌跟斗是必然的。思想错了,一切都必然会错。

你可能感兴趣的:(架构设计,软件工程)