You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
领域驱动设计的概念是2004年Evic Evans在他的著作《Domain-Driven Design : Tackling Complexity in the Heart of Software》(中文译名:领域驱动设计:软件核心复杂性应对之道)中提出的,软件系统从来都不是凭空而来,而是以软件的形式解决特定的问题。当我们面临现实世界的复杂问题时,如何以软件的形式落地?领域驱动设计是一套方法论,指导我们将复杂问题进行拆分、拆分出各个子系统间的关联以及是如何运转的,帮助我们解决大型的复杂系统在落地中遇到的问题。
Evic Evans在著作中将软件系统的设计分为2个部分:战略设计和战术设计。在战略设计层面提出了域、子域、限界上下文等重要概念;在战术设计层面提出了实体、值对象、领域服务、领域事件、聚合、工厂、资源库等重要概念。
什么是领域驱动设计(DDD)
领域驱动设计的概念是2004年Evic Evans在他的著作《Domain-Driven Design : Tackling Complexity in the Heart of Software》(中文译名:领域驱动设计:软件核心复杂性应对之道)中提出的,软件系统从来都不是凭空而来,而是以软件的形式解决特定的问题。当我们面临现实世界的复杂问题时,如何以软件的形式落地?领域驱动设计是一套方法论,指导我们将复杂问题进行拆分、拆分出各个子系统间的关联以及是如何运转的,帮助我们解决大型的复杂系统在落地中遇到的问题。
Evic Evans在著作中将软件系统的设计分为2个部分:战略设计和战术设计。在战略设计层面提出了域、子域、限界上下文等重要概念;在战术设计层面提出了实体、值对象、领域服务、领域事件、聚合、工厂、资源库等重要概念。
领域驱动设计打破了原来我们面向数据库设计模型(model)的开发模式,我们自开始学习编程,接受的第一个编程思维就是面向数据库模型开发,通常我们做一个项目或者开始一个工程都是先设计好数据库Schemal,然后根据schemal进行划分边界,同个schemal的通常都归类到同一个相同service里面。
但是设计领域首先需要打破schemal建模,不要被面向数据库建模禁锢住了,必须认识到数据库只是我们领域驱动设计中的一层就是基础设施层,领域建模关心的并不是单一的某个层,而是整个系统层面的设计,领域的划分是一个整体,原来的schemal仅仅是个部分。
领域驱动设计的应用
领域驱动设计更重要是要理解清楚系统的边界,边界与边界之间划分好子域,子域可以再划分多个子子域,限界上下文本质上也是一种子子域,那么在业务分解时一个业务模块到底是领域、子域还是子子域?
业务划分粒度的粗细并没有统一的标准,还是要根据业务需要、开发资源、技术实力等因素综合考量。例如微服务拆分过细反而会增加开发、部署和维护的复杂度,但是拆分过粗可能会导致大量业务高度耦合,开发部署起来是挺快的,但是缺失可维护性和可扩展性,这需要根据实际情况做出权衡。
领域与数据
域的边界划分最终还是要回到数据层面,领域对象也是一个数据对象,数据对象即体现了领域对象,高内聚,松耦合,必须就要对数据的边界谨慎划分,清晰合理的数据对象可以让边界更加清晰,保障数据对象清晰,那么就需要确定哪些是域内的数据,保证域内数据不外泄,域内对象不强依赖域外数据对象。
领域对象在包含值对象的同时也保留了值对象的业务含义,而数据对象可以使用更加松散的结构保存值对象,简化数据库设计。值对象在数据对象中可以用松散的数据结构进行存储,而值对象在领域对象中需要保留其业务含义 。
数据抽象
领域必然会有抽象,抽象即是寻找相同的东西,然后通过各个业务领域的各自实现不同的东西。比如泛型就是一种抽象,这个抽象是无关数据,仅仅是模型一致,然后在具体实现的不同在各自领域内实现。
工程理论总是要落地的,落地也是需要一些步骤和方法的,一般在工程实现的时候都是遵循一下大的领域划分。
严格按照DDD思想设计的好处是
1、防止层次混乱,严格隔离分层
2、业务与技术分离
3、落地单元测试
4、职责分离
5、基础设施可任意更换
Golang项目工程化实践中落地
项目工程化实践中,很多时候我们并没有很严格根据理论实现,结合golang 语言面向接口编程的特点,我们可以用多个角度进行领域风暴。比如一个积分商城系统,通常为以下方式,
1、时标对象
时标对象具有两个特点:第一是事实不可变性,记录了过去某个时间点或时间段内发生的事实。第二是责任可追溯性,记录了关注的信息。
首先需要登录,然后发起兑换,兑换完后需要查看兑换,查看兑换的时候是可以取消兑换或者是确认兑换。
2、描述对象
描述对象主要是确认每个对象需要做什么,记录对象的事实。
3、角色对象
角色对象是描述对象事实的参与者
4、领域事件
当业务系统发生一件事情时,如果本领域或其它领域有后续动作跟进,那么我们把这件事情称为领域事件,这个事件需要被感知。
5、领域划分
从上图我们基本可以确认有俩个通用域(登录,查看记录),三个核心域(发起兑换、取消、确认),三个核心主要就是数据对象有积分、商品、兑换记录。
6、项目搭建
domain(entries) :领域层
1、redeemEntries
2、cancelEntries
3、comfirmEntries
application(service):应用层
1、redeemService
2、cancelService
3、comfirmService
Infrastructure(dao): 基础设施层
1、model
2、dao
api(controller):用户接口层
对外提供接口服务
The text was updated successfully, but these errors were encountered: