领域驱动设计建模思考与实践

领域驱动设计 -- 领域驱动建模与面向对象建模的差异(一) 前阵子我们基于DDD的方式对产品中台的业务进行了重构,经过这些天水与火的煎熬后,我从实战的事件讲一讲我对DDD的理解以领域驱动建模与面向对象建模的区别。本质上来讲DDD与面向对象的本质区别在于DDD是构建在面向对象的基础之上的,即便DDD采用面向对象建模范式,领域驱动设计的建模仍与面向对象建模存在较大差异,原因在于领域驱动设计引入了限界上下文(Bounded Context)与聚合(Aggregate),使得建模的风景变得迥然不同。二者为领域模型引入了边界的约束,使得建模者不能随心所欲地建模... 阅读详情
    软件的核心是为用户解决领域相关的问题的能力,其他特性都要服务于这个基本目的。领域驱动设计告诉我们如何做好业务层,并以领域驱动设计思想来选择合适的框架,通过关注领域模型而不是技术来创建更好的软件。领域模型是通过逐步演化学习得来的,这当中体现了对相关领域知识的提炼归纳,是无法复制抄袭的,是整套软件最具价值的部分。软件设计的目的是研究如何使用计算机来解决实际(领域)问题,而不是去研究数据应该如何保存更合理。数据模型主要用于描述领域模型对象的持久化方式,应该是先有领域模型才有数据模型,领域模型通过某种映射而产生相应的数据模型。什么是模型?模型是简化、是对现实世界的解释,把与解决问题相关的方面抽象出来忽略无关的细节,它是用于解决信息超载问题的工具。模型是一种知识形式,对知识进行有目的地简化和有目的地结构化,建模不是对事物的模拟,而更像是在制作电影--出于某种目的而概括地反映现实。

    领域驱动设计中领域模型 = 数据结构 + 操作方法(仅仅只有Set、Get属性值的方法称作贫血模型,加入了自身行为方法后称作充血模型),这样才有了一个富有生命力的完整的对象,数据则是领域模型的血液。在DDD倡导的充血模型的开发模式下,对象不仅仅只是一个记录事实结果的工具,而是一个个活生生的能够拥有自己个体行为以及能够和其他对象交互的交互行为对象。此时,对象不仅可以记录事实结果,而且表示事实发生的原因,即对象之间的相互交互协作,即这个事实结果是通过怎样的事实产生的,领域内发出的事件一定是告诉别人我发生了什么而不是请帮我做什么。因此,基于DDD思想的对象不仅可以表示事实的结果,还能表示事实本身,对象交互指软件领域模型中各个具有一定客观性的对象之间的交互。
    那么相比传统编程建模方式,领域驱动建模有什么不同呢?
    传统的编程方式下首先思考的是数据,将数据从对象的行为当中分离出来,然后根据数据去建模建立成数据库表等。
在领域驱动设计当中,首先关键考虑的是统一语言,并把统一语言用在代码当中思考我们的模型能够做什么?然后逐步地暴露出其行为,再根据行为联系到数据。有了行为才有数据而不是通过数据去倒推行为。在此基础上自然就产生出了关注分离,有了CQRS架构(命令与查询职责分离)。在写操作中我们考虑由哪些功能函数会改变系统哪些状态,而读操作中我们考虑在什么地方为用户展现什么样的视图。所以强调考虑业务过程而不是数据。
    在计算机科学当中,最难的两件事情是命名和缓存失效,在DDD的实践当中,这两件事情都将会遇到。
    命名体现了领域模型的提炼过程,即聚合的边界划分:找到内聚性强的结构然后以该结构为边界对系统进行划分,当聚合体的名称确定后聚合内部的实体与值对象的名称自然也能确定了。命名问题指的是逻辑一致性问题,只有发现事物内在的逻辑一致性时才能给该事物起名。在DDD当中一个聚合边界内实现严格的一致性,聚合体之间实现最终一致性的更新。
    缓存失效则涉及实体状态的变化,现代计算机工业采取有态和无态的划分方式,这意味需要分析找出聚合当中的可变状态与不可变状态分开进行处理。缓存冗余失效谈的是复制一致性的问题,在分布式环境当中如何取得可用性、分区容错性和一致性的平衡需要考虑。
    当命名好领域模型进入计算机代码实施时,领域模型对象是生存在计算机的In-memory cache当中。领域模型对象的状态是经常会被事件改变的,自然不可避免会遭遇状态在缓存当中失效即更新问题,更新之后的缓存失效又将导致数据的一致性等问题。当一个复杂系统解决了命名和缓存失效问题才意味着系统走向成熟稳定,将具有良好的可扩展性和可维护性。
java技术专家 【DDD(领域驱动设计)思想解读及优秀实践 06】|领域建模实践(下):领域建模还有什么其他技巧? 阅读详情

相关推荐

点餐系统数据库设计--SQL Server

友情链接 1、学生成绩管理系统数据库设计–MySQL 学生成绩管理系统数据库设计–MySQL 2、医疗信息管理系统数据库–MySQL 医疗信息管理系统数据库–MySQL 3、邮件管理数据库设计–MySQL 邮件管理数据库设计–MySQL 4、SQL Server医疗信息管理系统数据库【英文版-源码】–(Medical Management System Database) SQL Server医疗信息管理系统数据库【英文版-源码】–(Medical Management System Database) 5

若如初见 8万+

领域建模的方法

一、领域建模的好处 DDD最大的好处是:接触到需求第一步就是考虑领域模型,而不是将其切割成数据和行为,然后数据用数据库实现,行为使用服务实现,最后造成需求的首肢分离。DDD让你首先考虑的是业务语言,而不是数据。DDD强调业务抽象和面向对象编程,而不是过程式业务逻辑实现。重点不同导致编程世界观不同。面向对象 封装:Account的相关操作都封装在Account Entity上,提高了内聚性和可重用性。 多态:采用策略模式的OverdraftPolicy(多态的典型应用)提高了代码的可扩展性。 二、如何进行

maoyeqiu的专栏 4084

泛微OA与金蝶云星空审批流程对接实战:从报销单到采购合同的完整指南

本文详细介绍了泛微OA与金蝶云星空审批流程的深度集成方案,涵盖从报销单到采购合同的完整对接指南。通过API层面的无缝连接,实现流程自动化、数据同源和权限联动,显著提升企业业务效率。文章还提供了环境配置、数据映射、接口安全等实用技巧,助力企业轻松完成系统对接。

weixin_29268637的博客 245

浅谈领域驱动设计

DDD(Domain Driven Design)其实是一种设计思维方式,它所要解决的问题,是传统软件设计方法中产生的沟通歧义导致的问题。DDD让开发者和熟悉业务的人一起工作让大家在系统开发过程中逐渐变成领域专家。DDD适用于业务场景复杂而且需要长期维护的系统。在使用DDD时,我们应该采用最简单的方式对复杂领域进行建模,而不是使问题变得更加复杂。在实施DDD时,设计就是代码,代码就是设计。...

zhh763984017的博客 1486

变压器铁心100Hz振动噪声的COMSOL磁致伸缩仿真全流程

磁致伸缩是铁磁材料在磁场作用下发生尺寸变化的现象,也是变压器铁心振动与噪声产生的根本原因。由于应变与磁通密度近似成平方关系,50Hz电网激励下铁心振动基频为100Hz。借助COMSOL多物理场仿真,可将磁场计算结果映射为结构应力和变形,完成“电磁—结构”单向耦合分析。该技术广泛应用于变压器振动噪声预测、结构优化及故障诊断等工程场景。本文从磁致伸缩物理机理出发,系统梳理了材料参数、等效建模、边界条件设置和结果校核等关键步骤,帮助工程师掌握从磁致伸缩到结构变形的完整仿真链路,解决实际工程对标难题。

weixin_33796177的博客 312

告别玄学调试:用STM32CubeMX和逻辑分析仪搞定DP83848的RMII与SMI接口

本文详细介绍了如何使用STM32CubeMX和逻辑分析仪调试DP83848的RMII与SMI接口,帮助开发者超越表象,直接观察底层通信波形。通过实战案例和高级调试技巧,解决常见问题如时钟偏移、信号完整性等,提升网络接口的稳定性和可靠性。

weixin_30752699的博客 299

领域驱动设计(DDD, Domain-Driven Design)工具可以帮助开发者在半导体设备管理与智能优化平台等复杂项目中进行领域建模、协作和代码生成,提升开发效率并确保模型与业务需求一致

领域驱动设计(DDD, Domain-Driven Design)工具可以帮助开发者在半导体设备管理与智能优化平台等复杂项目中进行领域建模、协作和代码生成,提升开发效率并确保模型与业务需求一致。ContextMapper 是一个开源的DDD建模工具,支持用DSL(领域特定语言)定义限界上下文、聚合等,并生成UML图。ContextMapper(建模)+ Miro(协作)+ JHipster(代码生成)+ SonarQube(分析)。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 923

用户行为数据分析 User Behavior Data from Taobao for Recommendation

一、提出问题 二、理解数据 数据来源 阿里云天池数据集:(https://tianchi.aliyun.com/dataset/dataDetail?dataId=649) 本文选取的数据集为UserBehavior.csv,共有5242880条数据。数据的具体类别如下表所示: 用户行为种类有四种,如下表所示 对于数据维度的说明如下: 在本文选取的2017年11月25日到2017年12月3日的时间范围内,不重复的用户数量为10202,不重复的商品ID数为412369,不重复的商品类目ID数为5859,

cccxxxqq的博客 5206

领域建模的思想和方法(转)

转自:http://blog.youkuaiyun.com/zhaome/archive/2010/01/07/5154193.aspx 领域模型是作为设计软件对象的启发来源,也是后续工件的必须输入。 领域模型是说明问题域里(对建模者来说)有意义的领域类,它是面向对象分序的时候要创建的最重要的工作(必须说明,用例虽然也是一个重要的分析工作,但它并不是面向对象的,它是强调的概念的过程视图)。 一、领...

weixin_30216561的博客 666

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之EcuM模块配置详解(上)

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之EcuM模块配置详解(上)

weixin_42412049的博客 1015

【Matlab】如何使用Simulink进行电池建模和SOC预估

“通过Simulink电池建模进行SOC预估,其实挺容易!” 1 声明 本文只描述一般性电池建模方法,文中出现的电池相关数据来自一些论文或者外文文献,对数据的真实性不做任何保证。 本文参考了不少国内高校的硕士论文和外文文献,所以本篇文章只作为学术性交流,未经...

wanff1204的博客 2万+

DDD领域驱动详解

DDD领域模型

明豆的博客 522

借助AI高效写出结构严谨、内容专业的课题申报书:10大核心模块拆解(附实用提示词)

在很多老师和科研人员眼中,写一份高质量的课题申报,确实是一件非常困难的事。难就难在不只是要说清楚写了什么研究内容,还要体现申报书的可行性和创新性。七哥除了自己写课题,也经常指导会员同仁使用高级学术版搞定课题的申报工作,摸索出了一套行之有效的借助AI申报课题的技巧,在这篇文章中,我将给大家点明课题申报书的10大核心模块的写作技巧,还会给大家一些提示词模板供大家参考,如果你也正准备申报课题,那么这篇文章一定不要错过!特别说明的是,提示词的使用并不是一蹴而就的,是专业思考的延伸和AI化专业表达,过程中需要多次的调

智能AI让学术科研更容易 441

DDD领域驱动设计基本理论知识总结

领域驱动设计之领域模型 为什么建立一个领域模型是重要的 领域通用语言(UBIQUITOUS LANGUAGE) 将领域模型转换为代码实现的最佳实践 领域建模时思考问题的角度 领域驱动设计的经典分层架构 用户界面/展现层 应用层 领域层 基础设施层 领域驱动设计过程中使用的模式 所有模式的总揽图 关联的设计 实体(Entity) 值对象(Value Object) 领域

Tony_Wong的专栏 916

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

《软件方法》强化自测题-业务建模(3)

以餐馆为研究对象,以下图形正确的有几个?

rolt的专栏 328

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

关于领域驱动设计(DDD)的理论知识

摘自:http://www.msaspx.com/?soft/thread-1890-1-4 最近一直在学习领域驱动设计(DDD)的理论知识,从网上搜集了一些个人认为比较有价值的东西,贴出来和大家分享一下: 我一直觉得不要盲目相信权威,比如不能一谈起领域驱动设计,就一定认为国外的那个Eric Evans写的那本书中的一些概念就一定是正确的,认为领域驱动设计就一定是聚合,聚合根,实体,值对象...

dwzhang2009的博客 200

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

DDD领域驱动设计基本理论知识总结(转)

领域驱动设计之领域模型 为什么建立一个领域模型是重要的 领域通用语言(UBIQUITOUS LANGUAGE) 将领域模型转换为代码实现的最佳实践 领域建模时思考问题的角度 领域驱动设计的经典分层架构 用户界面/展现层 应用层 领域层 基础设施层 领域驱动设计过程中使用的模式 所有模式的总揽图 关联的设计 实体(Entity) 值对象(Value Object)...

weixin_30697239的博客 153

或许是领域建模的真相

我们一提及领域建模,就好像回到了石器时代。然而这个谜题至今还未解决,就好像穴居人的生存方式,我们只能猜测、推测以及演绎,却不能真实复现。 Martin Fowler的《分析模式》总结了诸多领域分析模式,Eric Evans开创了领域驱动设计的办法,至于还要老的CRC方法,用例驱动,ICONIX方法以及稍新一些的四色建模法,都在尝试领域模型的建构,结果仍然差强人意。 这个问题或许是Mission I...

weixin_30439031的博客 99

DDD从入门到实践

DDD从入门到实践用领域驱动设计方法(简称DDD),保障在快节奏、多人协作的项目迭代中,维持系统的可维护性、可拓展性、高内聚低耦合和稳定性。作者首先剖解相关概念原理,之后代入亲身参与的微信团队实际项目、围绕DDD方法进行优化实操。DDD 全称 Domain-Driven Design,中文叫领域驱动设计,是一套应对复杂软件...

weixin_31659249的博客 206

领域驱动设计之领域模型

百度搜索:ddd领域驱动设计 原文地址:http://www.cnblogs.com/netfocus/archive/2011/10/10/2204949.html 领域驱动设计之领域模型 加一个导航,关于如何设计聚合的详细思考,见这篇文章。 2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity in the Heart ...

weixin_30411997的博客 77

什么是DDD(领域驱动设计)? #优快云博文精选# #IT#

大家好,小C将继续与你们见面,带来精选的优快云博文~ 又到周一啦,上周的系统化学习专栏已经结束,我们总共一起学习了20篇文章,这周将开启全新专栏《放假不停学,全栈工程师养成记》 在这里,你将收获: 将系统化学习理论运用于实践,系统学习IT技术 学习内容涵盖数据库、软件测试、主流框架、领域驱动设计和第三方生态等,离全栈工程师更近一步 精心整理的优快云技术大咖博文,假期学习实现弯道超车 假期余额已经严重不足,我们又将开启新的学习征程!接下来两天一起学习“领域驱动设计”,经过春节假期的“弯道超车”,

优快云高校俱乐部官方博客 936

分享我对领域驱动设计(DDD)的学习成果

本文内容提要:   1.领域驱动设计之领域模型   2.为什么建立一个领域模型是重要的   3.领域通用语言(Ubiquitous Language)   4.将领域模型转换为代码实现的最佳实践   5.领域建模时思考问题的角度   6.领域驱动设计的标准分层架构   7.领域驱动设计过程中使用的模式     关联的设计     实体(Entity)值对象(Value Objec...

u014712365的博客 110

领域驱动设计基本理论知识总结

主要内容: 1. 领域驱动设计之领域模型 2. 为什么建立一个领域模型是重要的 3. 领域通用语言(UBIQUITOUS LANGUAGE) 4. 将领域模型转换为代码实现的最佳实践 5. 领域建模时思考问题的角度 6. 领域驱动设计的经典分层架构 7. 领域驱动设计过程中使用的模式 8. 设计领域模型的一般步骤 9. 在分层架构中其他层如何与领

传说今天不多说 764

资深架构师谈 DDD 兴起,解决难题与实现步骤

- 前言 -DDD为什么能火起来?我们先不讨论DDD的定义, 先梳理一下DDD火起来的背景, 根据我学习的套路, 永远是为什么为先,再是解决什么问题,是什么东西, 最后如...

farway000的博客 239

【DDD 6】领域驱动设计实践 —— 业务建模战术

【DDD】领域驱动设计实践 —— 业务建模战术 目录 【DDD】领域驱动设计实践 —— 业务建模战术 1. 用一句话描述业务场景 2. 小步快跑,不断迭代 3. 短而高效的讨论很重要 4. 将你的建模思考过程写下来 5. 先从复杂的业务case开始建模 6. 用业务术语代替技术术语   正文   本文结合团队在COMMUNITY(社区服务系统)业务建模过程中的实践经验,总...

zhuiqiuuuu的博客 541

【DDD】领域驱动设计实践 —— 业务建模战术

【DDD】领域驱动设计实践 —— 业务建模战术 原文:【DDD】领域驱动设计实践 —— 业务建模战术  本文结合团队在COMMUNITY(社区服务系统)业务建模过程中的实践经验,总结得到一些DDD业务建模的小招数,不一定是完美的,但是对我们团队来说很有效用,希望能帮到其他人。后面会陆续将项目中业务建模的一些经典例子放上来,分享给大家。   C...

weixin_30367873的博客 113
上一篇: MySQL优化实战
下一篇: 关于秒传文件技术的一些问题
EricGogh
博客等级 码龄19年 24粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值