软件设计、DDD概念及落地时的一些零碎思考和记录
DDD理解
DDD体现的是对现实的充分尊重。
1.尊重业务现实,领域专家、领域语言等概念
2.尊重团队现实
3.尊重变化
Application
- 对某一业务线的整体掌控,流程组装,进度管理,存储时机掌控。
- 依赖外部模块的业务环节实现;
- 尽量满足UI需求;
- 落地:uow提交;
Domain
- 业务线视作水平线的话,此处应在垂直方向上切分各业务线,重新整合抽象,处理具体的业务环节、业务步骤。
- 划分范围、确定职责,需要多维度多视角的考虑抽象;
- 粒度尽量小。
- 本质上是对业务逻辑处理过程的纯化,能用的技术手段实质上是受限的;
- 不要考虑业务逻辑跨项目跨产品的通用性,这是以后的事;
- 缓存和仓储需要注意,有必要的话分开;
- 落地:尽量少的执行 存储,最好没有;
在内存中处理逻辑;
尽量使用private set;
尽量避免锁与线程操作;
注意时间、时刻及引用的问题;
存储、查询
- 存储的重要性仅次于Domain。
- 存储的隔离有两种,一种仅隔离不同的数据库,一种连ORM也隔离开;
- 大多数情况下不需要隔离ORM,技术选型确定后,使用时不必有过多顾虑;
- 如果使用EFCore这种ORM,DbSet和DbContext可以进入Domain;
- 查询与存储关联非常紧密同时距离用户很近(两个地狱),技术手段可以放宽,存储过程、Db函数,lua脚本之类都可以考虑;
- Domain可以对查询进行一些适配,或优化(后期);
- 快照时机,快照性能;
- 实时、非实时查询;
- 复杂报表需要自行适配业务数据;
命令、事件、消息。。。
- 总线队列比较容易被接受;
- 事件可以分阶段落地;
- 就算是日志也要养成记录快照的习惯;
标识
- 避免自增Id;
- 分布式id,大部分时候可以使用CombineGuid(唯一、基本有序、随机、提前生成);
- 进行事件快照时可以使用同一id,不同事件类型进行处理。
- 通常会发生变化的对象需要一个标识。
实体与值对象
- 实体属性会产生变化用于描述记录业务生命期内的各种事件,实体本身及引用的实体都会变化,实体间的关系通常使用引用来表达;
- 值对象本身是偏概念的东西,用过函数语言的会比较容易理解,在c#中与之类似的有元组、匿名类和提案里的record;
- 这里最重要的是思想的引入而非手段。
- 值对象本身表达的是部分属性的快照副本,类似于实体拥有的所有属性上的一段切片,是某个时刻下的一小段副本,所以不需要标识也只能是只读的;
- 属于使用者/调用者关注的东西,如果没有人关注它,通常没有必要单纯为表达某个概念而增加,容易造成概念混乱;
- 实体的变化会使逻辑处理产生隐患,尤其是涉及到引用类型时,这时引入值对象的快照副本概念就会很自然,比如使用一些变量取出属性值,或者一个匿名类用于方法内部,或者在方法的参数上仅提供值类型的参数,总之“逻辑算法仅能处理当前时刻的对象状态” 这一层概念必须明确表达。
- 实体的逻辑处理通常会导致实体自身属性的变化,业务上对实体属性的变化通常很敏感,有时不能仅提供一个结果给需求方,这时我们就需要增加一些属性记录下结果产生的原因。
- 值对象不在于我们定义的类型结构,而是要帮助技术人员建立起值的概念,快照副本及当前时刻是关键点,这种概念的建立非常有助于理解业务事件;
------------------------------------------------------------------上面是值对象值的部分,下面是对象部分(结构,属性包); - 有时候我们的逻辑中会有“我不关心是什么类型的实体,我只关心是否符合某种结构(属性包,形状)”,也就是实体在不同视角下的形状,关注点产生了变化。
- 一般在一些横切式的模块或者分析类的模块中有应用。
- 字典、配置类使用实体,更新原状态,插入新记录。
后台
系统后台:监控,分布式管理。。。;
- 管理后台不可直接引用Domain自行组装业务流(使用接口);
- 管理后台的需求必须与业务线需求一同交给Domain处理;
手工操作功能没有小事;
安全权限
贯穿始终;
团队
- 沟通、信任 “敬汝代码而惕之”,
软件设计、DDD概念及落地时的一些零碎思考和记录的更多相关文章
- 软件设计、DDD概念及落地时的一些零碎思考和记录2
主要是项目中一些落地经验和记录 技术人员.开发人员 大部分程序员真的不善于沟通,经常会显得很保守: 他们技术上的困惑.误解乃至郁闷都很难直接的表达清楚: 他们对自己的错误"印象"很 ...
- DDD学习笔录——领域驱动设计DDD概念总结
- 领域驱动设计(DDD)
领域驱动设计(DDD)实现之路 2004年,当Eric Evans的那本<领域驱动设计——软件核心复杂性应对之道>(后文简称<领域驱动设计>)出版时,我还在念高中,接触到领域驱 ...
- 战术设计DDD
可落地的DDD(5)-战术设计 摘要 本篇是DDD的战术篇,也就是关于领域事件.领域对象.聚合根.实体.值对象的讨论.也是DDD系列的完结篇.这一部分在我们团队争论最多的,也有很多月经贴,比如对资 ...
- 关于领域驱动设计 DDD(Domain-Driven Design)
以下旨在 理解DDD. 1. 什么是领域? 妈妈好是做母婴新零售的产品,应该属于电商平台,那么电商平台就是一个领域. 同一个领域的系统都有相同的核心业务. eg: 电商领域都有:商品浏览.购物 ...
- 分享我对领域驱动设计(DDD)的学习成果
本文内容提要: 1. 领域驱动设计之领域模型 2. 为什么建立一个领域模型是重要的 3. 领域通用语言(Ubiquitous Language) 4.将领域模型转换为代码实现的最佳实践 5. 领域建模 ...
- 领域驱动设计(DDD:Domain-Driven Design)
领域驱动设计(DDD:Domain-Driven Design) Eric Evans的"Domain-Driven Design领域驱动设计"简称DDD,Evans DDD是一套 ...
- 我对领域驱动设计(DDD)的学习成果
领域驱动设计之领域模型 2004年Eric Evans发表Domain-Driven Design – Tackling Complexity in the Heart of Software (领域 ...
- python 全栈开发,Day116(可迭代对象,type创建动态类,偏函数,面向对象的封装,获取外键数据,组合搜索,领域驱动设计(DDD))
昨日内容回顾 1. 三个类 ChangeList,封装列表页面需要的所有数据. StarkConfig,生成URL和视图对应关系 + 默认配置 AdminSite,用于保存 数据库类 和 处理该类的对 ...
随机推荐
- 微信小程序< 1 > ~ Hello 微信小程序
简介 微信小程序,最近声音比较大,开始慢慢学习一下这个小东西,从安装开发工具开始吧,不会JS,学起来会不会很吃力呢? 注册账号 参考官方网站 开发工具 1.微信Web开发工具 2.官方下载地址,针对自 ...
- TensorFlow数据读取方式:Dataset API
英文详细版参考:https://www.cnblogs.com/jins-note/p/10243716.html Dataset API是TensorFlow 1.3版本中引入的一个新的模块,主要服 ...
- ISDBT中CC的处理疑问
一个针对日本的数字电视应用(ISDBT)里字幕处理有一些问题,规范文档庞大又复杂,读起来还觉得语焉不详.接手遗留项目尝试处理字幕显示的问题,边读spec边看代码,先猜测.试图理解既有逻辑,再分析问题产 ...
- vue与原生混合开发
前段时间,做了一个混合开发的项目,主要是以vue框架开发h5页面,使用cordova作为中间沟通桥梁,实现了h5与安卓.iOS的混合开发,由于从事iOS开发,h5也是刚接触不久,很多深入原理还不太清楚 ...
- Flex自动回收导致监听不到ModuleEvent.READY事件
Flex中可以动态载入模块,以达到延迟加载,减小主程序体积的效果.通常可以使用如下代码: var iminfo:IModuleInfo = ModuleManager.getModule(" ...
- EL表达式和标签
1.什么是EL expression language 表达式语言 特点: 语言简单,使用方便 .${表达式}. 提供自动类型转换的功能 如果返回结果为null时 String -- ”” Numbe ...
- mysql的几个知识点
常用命令 原则:能用可视化工具的尽量使用工具,命令行仅限于问题排查. mysql -u ACCOUNT -pPWD -h IP -P port [-D database] //连接数据库 show d ...
- LeetCode题解之 Merge k Sorted Lists
1.题目描述 2.问题分析 使用合并两个链表的方法,逐次合并,效率较低.可以考虑同时合并K个链表. 3.代码 ListNode* mergeKLists(vector<ListNode*> ...
- Nginx服务器报 "Too Many Open Files"
近日服务器上的运行的一个站点经常性出现500错误.查了下服务器负载,负载正常.而后查询了下nginx记录的站点运行错误日志,发现提示Too many open files.因为站点静态文件居多,而且h ...
- Azure 实例元数据服务
Azure 实例元数据服务提供有关可用于管理和配置虚拟机的正在运行的虚拟机实例的信息. 这包括 SKU.网络配置和即将发生的维护事件等信息. 若要详细了解可用信息类型,请参阅元数据类别. Azure ...