若是你已经读过 Vaughn Vernon 和 Eric Evans 著做里的这些主题,你可能会很熟悉咱们讲的是什么,由于咱们大量借鉴了他们的定义和解释。领域驱动设计(DDD)是一种帮助咱们理解和构建软件模型设计的方法。它提供了战略和战术模型工具来帮助咱们设计高质量的软件从而达到咱们的业务目标。前端
本书的主要目标是向你展现领域驱动设计战略模式的 PHP 代码实例。若是你想了解更多战略模式和领域驱动设计的核心,你最好去读 Vaughn Vernon 的《领域驱动设计精简版》和 Eric Evans 的《领域驱动设计参考:定义和模式摘要》。
更重要的是,领域驱动设计不是关于技术的。相反的,它是关于围绕业务挖掘知识,用技术来提供商业价值的。只有当你有能力理解你公司的业务时,你才可能参与到软件模型的探索过程,从而获得一个通用语言(Ubiquitous Language)。程序员
软件不只仅是代码。若是你好好思考过这一点,代码绝非咱们所追求的最终目标。代码只不过是解决业务问题的手段。领域驱动设计强调要确保业务和软件使用同一语言。因此为何非要用不一样的语言来说述呢?只要打破其中壁垒,就再也不须要翻译或者繁琐的同步过程,信息也不会丢失。每一个人均可觉得探索业务领域作出贡献,而不只仅是程序员。最终所产出的软件就是公共语言的真实体现。web
领域驱动设计同时提供了战略和战术设计的框架 -- 战略设计精肯定位业务中最重要的领域,根据业务价值来进行开发;战术设计则经过久经考验构建块和模式来创建可工做的领域模型。数据库
领域驱动设计是交付软件的一种方法,它主要汇集三个核心要点:segmentfault
为了创建业务领域的共同语言,领域专家和软件开发人员须要一块儿工做。这里没有咱们与他们之分,这里只有咱们。开发软件是一种商业投资而不只是花销。为构建通用语言而做出的努力将帮助团队全部成员对领域有更深的认识。缓存
领域驱动设计指明业务方向背后的战略,而不只仅是技术层面。这有助于定义内部关系和早期预警反馈系统。在技术面,战略设计经过提供如何实现面向服务架构的动机来保护每一个业务服务。架构
领域驱动设计提供工具和构建块来持续交付软件。战术设计工具产出的软件,不只是正确,并且同时是易测试的和出错少的。框架
通用语言,以及第十二章整合限界上下文,是领域驱动设计最具威力的一部分。异步
就上下文而言
如今设想一个限界上下文就是一个系统内的概念边界,边界内的通用语言是有其特殊含义的,而边界外的上下文概念可能有不一样的含义。
那么,如何寻找,发现和捕获这些很是特别的语言呢,下面将列出几个要点:分布式
自从领域驱动设计诞生以来,改进构建通用语言进程的新技术层出不穷。其中最重要的也是现今使用最广泛的,就是事件风暴。
Alberto Brandolini 在一个博客帖子上介绍了事件风暴及其好处,他解释得比咱们简洁多了。事件风暴,就是一种快速发现复杂业务领域的研讨会形式:
若是你想对事件风暴了解更多,请查阅 Brandolini 的书 《Introducing EventStorming》。
领域驱动设计并非银弹,就像软件里的一切都依赖于上下文。做为一个经验法则,使用它可让你的领域模型简单化,毫不会增长复杂性。
若是你的应用仅仅是以数据为中心,用例也主要是在数据库行列上作 CRUD 操做,即增删改查,那么你并不须要领域驱动设计。你所须要的仅仅是在数据库之上作一个漂亮的前端。
若是你的应用少于 30 个用例,那最好使用像 Symfony
或者 Laravel
这样的框架来简单处理你的业务逻辑。
但是,若是你的应用超 30 个用例,你的系统可能走向一个可怕的大泥球。若是你知道你的系统肯定无疑会变得愈来愈复杂,那么你应该考虑用领域驱动设计来应对这些复杂度。
若是你并不理解你工做中那些领域,由于它们很陌生,以前也没有任何人给出解决方案,那么对你来讲应用领域驱动设计将变得很复杂。在这种状况下,你最须要与领域专家紧密工做来获得正确的模型。
应用领域驱动设计并不容易。它须要时间和努力来投入到业务领域,术语,文献中,而不是代码堆里。你须要领域专家承诺参与到整个进程当中。这须要一个开放的,友好的持续交流,来将他们的行话(spoken lauguage)转化为咱们的软件模型。另外咱们要努力避免使用技术思惟,而应该首先认真思考对象的行为和通用语言。
为了给出领域驱动设计战略这部分一个整体归纳,咱们将用 Jimmy Nilsson 的书《应用领域驱动设计与模式》中的一种方法,即考虑两个空间:问题空间和解空间。
在问题空间里,领域驱动设计用领域和子域来规划和规类公司想要解决的问题。在在线旅行社(OTA)这个例子当中,问题是关于处理像航班机票,酒店预订这样的事情。这样的领域就能够规划为不一样的子域,如价格,库存,用户管理等等。
在解空间里,领域驱动设计提供两种模式:限界上下文和上下文映射图。其目标是定义如何为全部已识别的子域提供一个实现,经过定义他们的交互和这些交互的细节。继续用 OTA 这个例子,每一个子域问题都将用一个限界上下文实现来解决。例如,一个由价格管理子域团队开发的自定义 web 应用,以及用户管理子域的一个现成解决方案。上下文映射图将展现每一个限界上下文是怎样与其它部分发生关联的。在上下文映射图内,咱们能够看到两个限界上下文间有什么关联形式(例如:客户-供应商,伙伴)。理想的方案是每一个子域由一个限界上下文实现,但实现不可能老是如此。就实现来讲,依照领域驱动设计你就最终以一个分布式架构结束。正如你已经知道的,分布式架构远比单体架构复杂,那么为何这个方法有意思,尤为是对大而复杂的公司来讲?这真的值得吗?是的,它值得!
分布式架构被证实能提升企业总体生产效率,由于它能为你的产品定义好边界,从而让专门的团队来开发。
若是你须要解决的领域问题不是很复杂,应用领域驱动设计的战略部分会增长没必要要的开销同时会拖慢你的研发速度。
若是你想了解更多关于领域驱动设计的战略部分,你应该去看看Vaughn Vernon的书《实现领域驱动设计》的前三章,或者Eric Evans的《领域驱动设计:软件核心复杂性应对之道》,两者对于这方面都有专门的讲解。
如今还有一些其余遵循领域驱动设计的相关运动正蓬勃发展,微服务和自包含系统就是很好的例子。James Lewis 和 Martin Fowler 在 Microservices Resource Guide 里是这样定义微服务:
微服务架构风格是把单个应用的开发分解为一个个小的服务的方法,每一个服务都有本身独立的进程和轻量的通讯机制,一般是用 HTTP 资源的 API。这些服务都是围绕其业务能力构建,可独立部署自动升级,去中心管理。服务能够用不一样的程序语言编写,使用不一样的数据存储技术。
若是你想了解更多关于微服务的内容,他们的指导就是一个良好的开端。微服务是怎样与领域驱动设计发生关系的?按照 Sam Newman 《微服务设计》 一书中的解释,微服务就是领域驱动设计的限界上下文的实现。
除了微服务,另一个相关的趋势就是自包含系统(SCS),依据自包含系统官网的解释:
自包含系统是关注将功能分离至许多独立系统的一种架构,由这些独立系统相互协做来提供一个完整的逻辑系统。这能够避免单体系统不断成长致使最后变得不可维护的问题。纵观过去的几年里,咱们看到许多中型和大型项目受益于此。这个思路是把一个大型系统分解为一些更小的自包含系统,依照下列肯定的规则(官网上一样有阐明自包含系统 的七个特征):
与你的同事讨论例如分布式架构的利弊。考虑用不一样语言,部署过程,责任心等等。
在这一章里你将学到:
实现领域驱动设计须要努力。若是它很简单,那每一个人均可以写出高质量代码了。准备好了,由于你立刻就要开始学习怎么写这些代码了,在读的过程当中,你将能够完美地描述清晰你公司现有的业务。享受这段旅程吧!