失效链接处理 |
领域驱动设计精简版 PDF 下载
本站整理下载:
相关截图:
主要内容:
何为领域驱动设计
软件开发通常被用于将真实世界中已经存在的流程自动化,或者为真实的业务问题提供解
决方案。需要自动化的业务流程或者真实世界的问题,就是软件的领域。从一开始,我们就必
须明白软件起源于其领域,并且与其领域密切相关。
软件是由代码最终构成的。我们可能会被代码所诱惑,在它上面花费了太多的时间,因此
将软件看作是简单的对象或者方法。
我们可以以汽车制造来做类比。参与汽车制造的工人会专门负责汽车的某个部件,但这样
做的后果是工人们通常对整体的汽车制造流程缺乏了解。他们可能将汽车视为一大堆需要固定
在一起的零件的集合体,但一辆汽车的意义远不只于此。一辆好车起源于一个好的创意,开始
于认真制定的规格说明,然后再交付给设计。经历若干道设计工序,花费上几个月甚至几年时
间去设计、修改、精化直至达到完美、能够完全反映出最初的愿景。设计的过程也不全然是在
纸上进行的。设计工作的很大一部分包括了建造汽车的模型(doing models of the car)、并且在
特定条件下对它进行测试,以验证该模型是否能工作。设计会根据测试的结果做出修改。汽车
最终被交付到生产线上,在那里,所有的部件已经就绪,然后被组装到一起。
软件开发也是一样。我们不能直接坐下来敲代码。当然在开发价值不大的软件时,也可以
这样做,但我们不能用这种方法开发复杂的软件。
为了创建一个好软件,你必须知道这个软件究竟是什么。在你充分了解金融业务是什么之
前,你是做不出一个好的银行业软件系统的,你必须理解银行业的领域。
没有丰富的领域知识能做出复杂的银行业业务软件吗?没门。答案永远是否定的。那么谁
了解银行业业务?软件架构师吗?不,他只是在使用银行来保护他的财产安全,并且确保需要
钱的时候能够取出来;软件分析师吗?也不是,他只懂得在已获取到所有材料的情况下,对一
个给定的主题进行分析;软件开发人员?别难为他了。那么还有谁?当然是银行的从业者了。
银行业务系统被银行的内部人员和专家所熟知。他们知道所有的细节、所有的困难、所有可能
出现的问题、所有的业务规则。这些就是我们永远的起始点: 领域。
在启动一个软件项目时,我们应该关注软件涉及的领域。软件的最终目的是增进一个特定
的领域。为了达到这个目的,软件需要跟要它服务的领域和谐相处,否则,它就会给领域引入
束缚,引起故障、造成破坏甚至导致很大的混乱。
理解你的领域
3
我们怎样才能让软件和领域和谐相处呢?最佳方式是让软件成为领域的一个映射。软件需
要包含领域里重要的核心概念和元素,并精确实现它们之间的关系。也就是说,软件需要对领
域进行建模。
对银行业业务不了解的人,应该能够通过阅读该领域模型相关的代码学习到大量知识。这
是必不可少的。随着时间的推移,没有深深扎根于领域的软件将无法很好地应对变化。
所以我们从领域开始着手。接下来要做什么呢?领域是真实世界中某些事物,不要企图能
轻而易举地捕获它们,以为敲几下键盘就能出来代码。我们需要为该领域创建一个抽象。当我
们跟领域专家交流时,我们会学到很多领域知识,但这些未加工的知识难以被转换成软件构造,
除非我们为它建造一个抽象——在脑海中的一个蓝图。开始时,这个蓝图总是不完整的,但随
着时间的推移,经过不断的努力,我们会让它越来越好,让它看上去越来越清晰。这个抽象是
什么?它是一个模型,一个关于领域的模型。按照 Eric Evans 的观点,领域模型不是一幅具体
的图,它是那幅图想要去传达的那个思想。它也不是一个领域专家头脑中的知识,而是一个经
过严格组织并进行选择性抽象的知识。一幅图能够描绘和传达一个模型,同样,经过精心编写
的代码和一段英语句子都能达到这个目的。
模型是我们对目标领域的内部展现方式,它是非常必须的,会贯穿设计和开发的全过程。
在设计过程中,我们会记住并大量引用模型中的内容。我们周遭的世界中有着太多的内容等待
着我们的大脑去处理。甚至一个特定的领域所包含的内容都远远超出了人脑一次可以处理的范
围。我们需要组织信息,将其系统化,把它分割成小一点的信息块,将这些信息块分类放到逻
辑模块中,每次只处理其中的一个逻辑模块。我们需要忽略领域中的很多部分,因为领域包含
了如此之多的信息,不能一下子放到一个模型中。而且,它们当中的很多部分我们也不必去考
虑。这对它自身而言也是一个挑战:要保留哪些内容放弃哪些内容呢?这些取舍是设计和软件
创建过程的一部分。银行业软件肯定会跟踪客户的住址,但它决不会关心客户的眼睛是什么颜
色的。这是个很明显的例子,但其他的例子可能不会如此明显。
模型是软件设计中最基本的部分。我们需要它,是因为能够用它来处理复杂问题。我们对
领域的所有的思考过程被汇总到这个模型中。这样甚好,但它必须要脱离开我们的头脑,如果
它始终停留在我们的头脑中,其实并不会有多大的作用,不是吗?我们需要就这个模型跟领域
专家进行交流,跟相关的设计人员进行交流,跟开发人员进行交流。模型是软件的根本,但我
们需要找到一些方法来表达它,与其他人交流这个模型。在这个过程中我们并不是孤立的,所
以我们需要彼此共享知识和信息,而且我们需要把它做得更好、更精确、更完整,没有二义性。
要做到这点有多种方式。一种方式是图形化的:图形、用例、绘画、图片等。另一种方式是文
字描述,我们会写下我们对领域的愿景。还有一种方式是使用语言,我们能够也应该创建一种
语言,来对与领域相关的特定问题进行交流。在以后的章节中我们会详细讲解它们,但要点就
是, 我们需要用模型来交流
|