领域模型(domain model)是对领域内的概念类或现实世界中对象的可视化表示。领域模型也称为概念模型、领域对象模型和分析对象模型。
——《UML和模式应用》
我们在日常开发中,经常针对一些功能点争论“这个功能不应该我改,应该是你那边改”,最终被妥协改了之后都改不明白为什么这个功能要在自己这边改。区别于传统的架构设计,领域驱动设计(DDD)也许在这个时候能帮助你做到清晰的划分。
什么是DDD
领域驱动设计最初由Eric Evans提出,但是多年以来一直停留在理念阶段,真正能实现并且落地的项目和公司少之又少,而进来阿里内部其实在大力推行DDD的理念,它主要可以帮助我们解决传统单体式集中架构难以快速响应业务需求落地的问题,并且针对中台和微服务盛行的场景做出指导。
DDD为我们提供的是架构设计的方法论,既面向技术也面向业务,从业务的角度来把握设计方案。
DDD的作用
统一思想:统一项目各方业务、产品、开发对问题的认知,而不是开发和产品统一,业务又和产品统一从而产生分歧。
明确分工:域模型需要明确定义来解决方方面面的问题,而针对这些问题则形成了团队分钟的理解。
反映变化:需求是不断变化的,因此我们的模型也是在不断的变化的。领域模型则可以真实的反映这些变化。
边界分离:领域模型与数据模型分离,用领域模型来界定哪些需求在什么地方实现,保持结构清晰。
DDD的概念
实体
有唯一标志的核心领域对象,且这个标志在整个软件生命周期中都不会发生变化。这个概念和我们平时软件模型中和数据库打交道的Model实例比较接近,唯一不同的是DDD中这些实体会包含与该实体相关的业务逻辑,它是操作行为的载体。
值对象
依附于实体存在,通过对象属性来识别的对象,它将一些相关的实体属性打包在一起处理,形成一个新的对象。
举个栗子:比如用户实体,包含用户名、密码、年龄、地址,地址又包含省市区等属性,而将省市区这些属性打包成一个属性集合就是值对象。
聚合
实体和值对象表现的是个体的能力,而我们的业务逻辑往往很复杂,依赖个体是无法完成的,这时候就需要多个实体和值对象一起协同工作,而这个协同的组织就是聚合。聚合是数据修改和持久化的基本单元,同一个聚合内要保证事务的一致性,所以在设计的时候要保证聚合的设计拆分到最小化以保证效率和性能。
聚合根
也叫做根实体,一个特殊的实体,它是聚合的管理者,代表聚合的入口,抓住聚合根可以抓住整个聚合。
领域服务
有些领域的操作是一些动词,并不能简单的把他们归类到某个实体或者值对象中。这样的行为从领域中识别出来之后应该将它声明成一个服务,它的作用仅仅是为领域提供相应的功能。
领域事件
在特定的领域由用户动作触发,表示发生在过去的事件。比如充值成功、充值失败的事件。
四种模式
失血模型
模型中只有简单的get set方法,是对一个实体最简单的封装,其他所有的业务行为由服务类来完成。
@Data
@ToString
publicclassUser{
privateLongid;
privateStringusername;
privateStringpassword;
privateIntegerstatus;
privateDatecreatedAt;
privateDateupdatedAt;
privateIntegerisDeleted;
}
publicclassUserService{
publicbooleanisActive(Useruser){
returnuser.getStatus().equals(StatusEnum.ACTIVE.getCode());
}
}
贫血模型
在失血模型基础之上聚合了业务领域行为,领域对象的状态变化停留在内存层面,不关心数据持久化。
@Data
@ToString
publicclassUser{
privateLongid;
privateStringusername;
privateStringpassword;
privateIntegerstatus;
privateDatecreatedAt;
privateDateupdatedAt;
privateIntegerisDeleted;
publicbooleanisActive(Useruser){
returnuser.getStatus().equals(StatusEnum.ACTIVE.getCode());
}
publicvoidsetUsername(Stringusername){
returnusername.trim();
}
}
充血模型
在贫血模型基础上,负责数据的持久化。
@Data
@ToString
publicclassUser{
privateLongid;
privateStringusername;
privateStringpassword;
privateIntegerstatus;
privateDatecreatedAt;
privateDateupdatedAt;
privateIntegerisDeleted;
privateUserRepositoryuserRepository;
publicbooleanisActive(Useruser){
returnuser.getStatus().equals(StatusEnum.ACTIVE.getCode());
}
publicvoidsetUsername(Stringusername){
this.username=username.trim();
userRepository.update(user);
}
}
胀血模型
service都不需要,所有的业务逻辑、数据存储都放到一个类中。
对于DDD来说,失血和胀血都是不合适的,失血太轻量没有聚合,胀血那是初学者才这样写代码。那么充血模型和贫血模型该怎么选择?充血模型依赖repository接口,与数据存储紧密相关,有破坏程序稳定性的风险。
建模方法
用例分析法
用例分析法是领域建模最简单可行的方式。大致可以分为获取用例、收集实体、添加关联、添加属性、模型精化几个步骤。
获取用例:提取领域规则描述
收集实体:定位实体,
添加关联:两个实体间用动词关联起来
添加属性:获取实体属性
模型精化:可选的步骤,可以用UML的泛华和组合来表达模型间的关系,同时可以做子领域的划分
四色建模法
四色建模法源于《Java Modeling In Color With UML》,它是一种模型的分析和设计方法,通过把所有模型分为四种类型,帮助模型做到清晰、可追溯。
简单来说,四色关注的是某个人的角色在某个地点的角色用某个东西的角色做了某件事情。
事件风暴法
事件风暴法类似头脑风暴,简单来说就是谁在何时基于什么做了什么,产生了什么,影响了什么事情。
架构分层
区别于左图传统架构的分层,一般DDD分层会有一些变化。
Application:包含事件注册、业务逻辑等
Domain:聚合、实体、值对象
InfraStructure:基础设施封装、数据库访问等
总结
DDD是一套完善的方法论,他能帮助我们合理的对系统进行架构设计,同时,好的模板应该是在不断的适应变化,而DDD也能帮助我们更快速更方便的支撑业务的发展。
标签: DDD最近更新
- 最新:宁夏首条高铁5G网络全线开通2023-01-09
- 5项数字化转型国家标准正式立项2023-01-09
- 漯河联通“六抓六促”推广党建负责人工作法2023-01-09
- 【速看料】泰安移动开展“四个一”抓实抓牢节前廉洁教育2023-01-09
- 我国大数据产业规模达1.3万亿元复合增长率超30%2023-01-09
- 宿州移动警企联动“重拳打猫”再添战果2023-01-09
- 焦点热议:中国联通故障中心平台及网络智能运维机器人系统获“优秀级”认证2023-01-09
- 浙江联通实现省内重点城市“一市一池”全覆盖|焦点快看2023-01-09
- 苹果服软!iPhone 15曝光:全系标配USB-C、灵动岛 Pro版还有钛合金2023-01-09
- 每日观察!未来要取代iPhone!苹果AR/VR头戴设备将春季发布:原型机已发放2023-01-09
- 快看:“天灾加人祸”,特斯拉的好日子到头了?2023-01-09
- 【全球热闻】支付宝2023年“集五福”来了 网友:两块钱的大项目2023-01-09
- 全球今头条!马斯克承诺成空谈!推特被裁员工仅获1个月工资补偿2023-01-09
- 微软Xbox老大斯宾塞盛赞索尼:无障碍手柄是对PS生态很好的补充2023-01-09
- 每日资讯:暴雪网易复合几乎不可能:不会降低标准 正和新代理谈的火热2023-01-09
- 苹果砍单“链条”受过 “果链”上市公司另寻出路2023-01-09
- 天天热资讯!紫辉创投郑刚再呛罗永浩:多次退出锤子科技股东群,用新公司股权要挟投资人放弃基本权利2023-01-07
- 投资人炮轰罗永浩“势利眼”,曾参与锤子科技两轮融资,称其是中国乔布斯|全球通讯2023-01-07
- 天天观点:罗永浩发文回应投资人郑刚2023-01-07
- 罗永浩回应郑刚炮轰:锤子每年都开股东会,新公司已给老股东股权补偿2023-01-07
- 蚂蚁集团股东上层结构调整、马云不再为实控人,继续强化与阿里的隔离_全球新要闻2023-01-07
- 二叠纪大灭绝期间紫外线辐射增加?化石花粉粒中“防晒霜”添证据|全球快资讯2023-01-07
- 湖北西部秭归盆地首次发现侏罗纪中期恐龙足迹化石-环球讯息2023-01-07
- 观察:蚂蚁集团大动作!马云退出实控人位置,股东投票权进一步分散,拟引入第五名独董2023-01-07
- 罗永浩回应投资人“炮轰”:郑刚对我的评论毫无事实基础-环球快报2023-01-07
- 网传马云现身曼谷:吃路边摊看泰拳比赛 还上阵打了一通2023-01-07
- 投资人郑刚炮轰罗永浩 全球快看2023-01-07
- 全球实时:蚂蚁强化与阿里隔离 马云股份表决权变了2023-01-07
- 刚刚,蚂蚁集团发布重要公告!_环球快播2023-01-07
- 锤子手机投资人、紫辉创投创始人郑刚深夜炮轰罗永浩:不懂感恩2023-01-07