Course Code: dddtwo
Duration: 14 hours
Course Outline:

课程描述:

需求分析人员不了解软件设计,无法进行软件设计人员经常会曲解需求内容,这是软件开发中容易出现的第一带来。它带来的后果是设计不断变化,设计的软件不满足客户需求。

需求分析虽然在文字表达上看起来明白无误,设计人员却无法正确识别地域领域模型,从而无法实施有效的软件设计,这是软件开发中容易出现的第二个替代。它带来的后果是设计质量糟糕,开发的代码不具有良好的出色性,增加了软件的开发与维护成本。

系统的业务需求复杂多变,设计人员却总是喜欢从实现角度以及数据库建模思考业务问题,这是软件开发中容易出现的第三种原因。它会导致开发的系统过于复杂,且可扩展性差,无法有效应对需求发生的变化。

本次培训的内容-领域驱动设计正好是解决这三个常见替代的最佳药方。

培训对象:

  1. 产品经理,产品人员,开发人员,测试人员

培训特色:

  1. 充分了解案例分析与实践,提倡动手实验,而非单纯以讲授性质的培训;通过真实案例的演练,熟悉开发过程与设计方法;
  2. 采用最新的领域驱动设计思想与方法,并辅以可视化的设计手段,以工作坊的形式实施培训,如何更好地理解领域驱动设计;
  3. 编码与设计,二者不可偏废。没有优秀的个人设计能力,团队就会成为无根之木,无法保证软件的高质量。必须帮助团队的每个人都能熟练运用领域驱动的分析与设计能力,才能保证生产力的高效;

学时:

2天12学时(1小时 / 学时)

课程安排:

DDD领域驱动设计
时间 

第一单元

领域建模的方法

1、领域建模与设计的关系

优秀的软件系统与好的软件设计息息相关,但最关键的还是在于对需求的理解。如果不能正确的理解软件需求,那么再好的设计也不能设计出好的软件。正确的做事情固然重要,更重要的是要做正确的事。然而,需求到设计存在巨大的鸿沟,因为需求是站在业务角度来考虑,而设计往往会站在实现角度。领域建模就是为这二者搭建一个沟通与转换的桥梁。

第二单元

领域驱动设计的分析

1、限界上下文

若要进行领域建模,并将业务需求逐步演化为架构设计,则需要引入DDD(领域驱动设计)的战略设计作为指导。场景图与限界上下文可以很好地结合,帮助架构师很好地识别各个子领域的概念边界与设计边界。如此则可以运用“分而治之”的思 想识别出整个系统的业务逻辑边界与物理边界。

演练:识别电子商务系统的限界上下文

2、领域模型

通过限界上下文,可以帮助我们分析系统的领域模型,包括系统的核心领域与子领域。确定系统的核心领域与子领域可以帮助架构师合理分配资源(包括时间资源与人力资源)。而对子领域的进一步识别,可以帮助架构师更好地识别可重用资源, 包括可重用的功能模块,确定技术栈,决定构建还是购买的架构战略。

3、上下文映射图

本部分内容会讲解限界上下文之间主要存在的组织模式与集成模式,这其中包括防腐层,开放服务调用等。利用上下文映射图,有助于识别上下文之间的关系,思考处于上下文内领域模型之间的通信方式,从而帮助架构师驱动出最终的应用逻辑架构。

演练:OTA机票预订系统

第三单元

领域驱动设计的实战

1、领域驱动设计的专用术语

领域驱动设计的一个特点是针对领域层,提出了统一的设计术语,包括关联、实体、值对象、聚合、服务、模块。注意区分它与传统业务层设计在概念上的区别。甄别这些概念之间的区别,有利于我们正确地运用领域驱动设计。

整体而言,领域驱动设计的这些术语涵盖了领域对象的整个生命周期,包括领域对象从创建、存储、重建、归档、修改到删除的整个生命周期。

2、实体与值对象

这两个概念都是领域对象的体现,二者的主要区别在于对“标识”的运用。本部分的内容深入展开对实体标识的讨论,揭示实体的本质特征,挖掘实体的关键行为。通过识别角色与职责对实现进行分析。

本部分内容还将通过深入讲解值对象的特征帮助我们分辨值对象与实体,使得我们可以在领域驱动设计中有效地运用实体与值对象。本部分内容还包括持久化值对象,以及领域驱动设计与ORM之间的关系。

3、领域服务

通过讲解什么是领域服务,什么不是领域服务理清领域服务的概念,并讲解如何建模领域服务。讨论领域服务和面向接口设计思想。

4、领域事件

事件驱动架构的主要对象即为领域事件,我们要分清在何时以及为什么要使用领域事件,并对领域事件进行建模。通过讲解发布者-订阅者模式讲解如何在领域模型和限界上下文中发布领域事件。同时,针对事件进行存储的Event Source也与CQRS架构风格直接相关。

5、模块

模块化设计是优良架构的保障,同时也是软件复用最重要的单元。领域驱动设计将模块视为与对象相等的一等公民,这使得整个设计在微观层面符合面向对象的思想,同时也能够为宏观层面的架构设计提供有力地支持。本部分将结合限界上下文讲解基本的模块设计原则与设计模式。

6、聚合

聚合是领域驱动设计最为重要的领域概念。本部分内容将深入探讨聚合的设计原则,并辨别在聚合设计中可能出现的坏味道,并提出针对性的解决方案。这些原则和方案包括:在一致性边界之内建模真正的不变量,设计小的聚合,通过唯一标识引用其他聚合,在边界外满足最终一致性。

7、工厂和资源库

工厂和资源库都是管理领域对象(实体、值对象和服务)生命周期的对象。工厂主要针对内存中对象从无到有的创建过程,与设计模式的工厂模式基本相似。

6、

资源库则分为面向集合的资源库与面向持久化的资源库。本部分内容将重点讲解与资源库直接相关的技术细节,包括如何选择资源库的方式,如何针对聚合持久化资源库,如何管理事务,以及分辨资源库与数据访问对象(DAO)之间的异同。

8、应用层设计

作为为UI提供的应用服务,其目的在于管理和协调领域对象,并为领域对象提供横切关注点的内容。好的应用服务设计不应该承担任何与领域逻辑有关的职责。应用层是架构层面的外观与适配器模式的体现。它可以提高软件系统架构的可用性与简单性,也能够更好地与面向服务架构或RESTful架构风格结合。

9、DDD实践

用DDD重构中台业务模型

使用DDD设计微服务代码模型

 第四单元

案例实战

DDD建模案例:

房屋租赁产品案例实战