范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

浅谈DDD

  DDD 最近几年越来越流行,大家都在聊这个话题,但是每个人对它的理解都不同,小汪哥这里根据之前在系统拆分、需求评估,以及遗留系统改造中的一点点经验,来浅浅的聊下自己对DDD的理解。从认知定义、作用、领域建模方法、实现方法论几个方面来聊聊。    认知定义
  DDD 是一种处理高度复杂领域的设计思想,它试图分离技术实现的复杂性,并围绕业务概念构建领域模型来控制业务的复杂性,以解决软件难以理解,难以演进的问题。
  DDD 不是架构,而是一种架构设计方法论,它通过边界划分将复杂业务领域简单化,帮我们设计出清晰的领域和应用边界,可以很容易地实现架构演进和微服务的落地。
  作用
  优势:    1、作为微服务的定义的指导思想。    2、理解业务的一种方法论,可以在接手遗留系统,以及遗留系统改造时快速理解业务。    3、解决领域知识被割裂肢解、代码的业务语义表达能力弱的问题。    4、控制系统复杂度,控制代码量。
  劣势  :    1、DDD不能解决大部分的性能优化问题,甚至大部分的场景,我们需要为性能优化去做反DDD设计。    2、DDD不能解决开发技术水平的问题。    3、DDD需要我们在领域建模花费很多的时间和精力,而且还可能导致付出和收益不成正比的情况。
  领域建模方法
  领域建模解决的问题
  领域建模的目的是统一大家的业务认知,让业务、开发、测试、产品在同一个频道上交流。其实要做到这一点是很难的,开发喜欢从技术层面去描述问题,产品习惯从业务层面描述问题,两个不在同一个频道怎么能好好沟通。在小团队这种优势表现不出来,在大团队中,沟通成本是很高的。
  领域建模,说的很简单,但是做好确实很难,一个复杂的需求不是建几个实体对象就能解决的。从全局看只在脑海中进行的建模实际上并不一定正确和稳定。因此我们需要找到正确的方法帮助对业务领域进行分析,得到建模结构,共享建模成果。值得庆幸的是,前辈及牛人已经总结了一些建模方法。
  常用的建模方法有:用  例分析法、四色建模法、事件风暴法  。这个我就不一一赘述了,网上有很多内容,或者  公众号回复【DDD】获取相关资料。
  实现方法论
  战略设计:
  战略设计主要从业务视角出发  ,建立业务领域模型,划分领域边界,建立通用语言的限界上下文,  限界上下文可以作为微服务设计的参考边界  。    各种域  :    核心域、支撑域和通用域的主要目标是:通过领域划分,区分不同子域在公司内的不同功能属性和重要性,从而公司可对不同子域采取不同的资源投入和建设策略,其关注度也会不一样。    统一语言:    统一语言提供了一种更好的协同方式的可能性。统一语言与其背后的领域模型赋予了研发人员通过重构定义业务的能力,  在业务方大多强势的环境中,难能可贵地建立了技术反馈业务的途径,降低了知识消化过程失败的风险。
  图片来源:《如何落地业务建模》   限界上下文:    限界上下文是微服务设计和拆分的主要依据。在领域模型中,如果不考虑技术异构、团队沟通等其它外部因素,一个限界上下文理论上就可以设计为一个微服务。    限界上下文的定义就是:用来封装通用语言和领域对象,提供上下文环境,保证在领域之内的一些术语、业务相关对象等(通用语言)有一个确切的含义,没有二义性。    正如电商领域的商品一样,商品在不同的阶段有不同的术语,在销售阶段是商品,而在运输阶段则变成了货物。同样的一个东西,由于业务领域的不同,赋予了这些术语不同的涵义和职责边界,这个边界就可能会成为未来微服务设计的边界。看到这,领域边界就是通过限界上下文来定义的。
  战术设计:
  战术设计则从技术视角出发  ,侧重于领域模型的技术实现,完成软件开发和架构落地,包括:聚合根、实体、值对象等代码逻辑及代码分层的设计和实现。主要讨论在一个服务内部,如何划分和组织代码。
  实体和值对象:
  实体和值对象:从领域模型的基础单元看系统设计实体和值对象是组成领域模型的基础单元。
  实体的代码形态
  在代码模型中,实体的表现形式是实体类,这个类包含了实体的属性和方法,通过这些方法实现实体自身的业务逻辑。在 DDD 里,这些实体类通常采用充血模型,与这个实体相关的所有业务逻辑都在实体类的方法中实现,跨多个实体的领域逻辑则在领域服务中实现。
  实体以 DO(领域对象)的形式存在,每个实体对象都有唯一的 ID。我们可以对一个实体对象进行多次修改,修改后的数据和原来的数据可能会大不相同。但是,由于它们拥有相同的 ID,它们依然是同一个实体。
  实体的数据库形态
  在领域模型映射到数据模型时,一个实体可能对应 0 个、1 个或者多个数据库持久化对象。大多数情况下实体与持久化对象是一对一。在某些场景中,有些实体只是暂驻静态内存的一个运行态实体,它不需要持久化。
  值对象
  值对象相对实体来说,会更加抽象一些。简单来说,值对象本质上就是一个集合。
  值对象的代码形态
  值对象在代码中有这样两种形态。如果值对象是单一属性,则直接定义为实体类的属性;如果值对象是属性集合,则把它设计为 Class 类,Class 将具有整体概念的多个属性归集到属性集合,这样的值对象没有 ID,会被实体整体引用。
  图片来源:《DDD 实战课》
  例如上图:
  人员实体原本包括:姓名、年龄、性别以及人员所在的省、市、县和街道等属性。这样显示地址相关的属性就很零碎了对不对?现在,我们可以将"省、市、县和街道等属性"拿出来构成一个"地址属性集合",这个集合就是值对象了。
  聚合和聚合根:
  领域模型内的实体和值对象就好比个体,而能让实体和值对象协同工作的组织就是聚合,它用来确保这些领域对象在实现共同的业务逻辑时,能保证数据的一致性。聚合就是由业务和逻辑紧密关联的实体和值对象组合而成的,聚合是数据修改和持久化的基本单元,每一个聚合对应一个仓储,实现数据的持久化。聚合有一个聚合根和上下文边界(一个聚合包含了多个实体对象和值对象,其中有一个实体对象做为聚合根。这些对象聚集在一起形成了一个比较完整独立的业务边界,称为上下文边界。),这个边界根据业务单一职责和高内聚原则,定义了聚合内部应该包含哪些实体和值对象,而聚合之间的边界是松耦合的。按照这种方式设计出来的微服务很自然就是"高内聚、低耦合"的。
  我们以保险的投保业务场景为例,看一下聚合的构建过程主要都包括哪些步骤:
  图片来源:《DDD 实战课》
  聚合根
  聚合根 leave 中有属性、值对象、关联实体和自身的业务行为。Leave 实体采用充血模型 ,有自己的业务行为,具体就是聚合根实体类的方法,如代码中的 getDuration 和 addHistoryApprovalInfo 等方法。
  聚合根引用实体和值对象,它可以组合聚合内的多个实体,在聚合根实体类方法中完成复杂的业务行为,这种复杂的业务行为也可以在聚合领域服务里实现。但为了职责和边界清晰,我建议聚合要根据自身的业务行为在实体类方法中实现,而涉及多个实体组合才能实现的业务能力由领域服务完成。下面是聚合根 leave 的实体类方法,它包含属性、对实体和值对象的引用以及自己的业务行为和方法。
  public class Leave {     String id;     Applicant applicant;     Approver approver;     LeaveType type;     Status status;     Date startTime;     Date endTime;     long duration;     int leaderMaxLevel; //审批领导的最高级别     ApprovalInfo currentApprovalInfo;     List historyApprovalInfos;        public long getDuration() {         return endTime.getTime() - startTime.getTime();     }       public Leave addHistoryApprovalInfo(ApprovalInfo approvalInfo) {         if (null == historyApprovalInfos)             historyApprovalInfos = new ArrayList<>();         this.historyApprovalInfos.add(approvalInfo);         return this;     }        public Leave create(){         this.setStatus(Status.APPROVING);         this.setStartTime(new Date());         return this; }   //其它方法 }
  DDD分层架构
  最后就是如何组织代码的问题,这个时候就需要要到DDD的分层架构。
  那么从之前的MVC三层架构如何演变成DDD的分层架构呢?
  DDD分层架构与MVC架构的映射关系:
  在《领域驱动设计——软件核心复杂性应对之道》书中也描述了各层的关系:
  不过小汪哥觉得,代码的组织方式可以根据团队的情况来调整,只要能符合领域驱动的思想即可。
  各个层级的作用可以参考之前的文章:领域驱动落地实战,这里就不在一一赘述了。   小结
  本文主要从DDD是什么,能干什么,不能干什么,怎么干(领域建模方法、实现方法论)几个方面来聊了一下领域驱动,当然,一千个人有一千种对领域驱动的理解。
  本文所参考的资料可以通过公众号  回复【DDD】获取  。

刘强东你为什么早不阳晚不阳偏偏现在阳?今天在网上看到京东创始人刘强东分享感染新冠的经历,并且特别提到家里有86岁老人被感染后不去医院康复的例子。东哥的视频归纳起来就是一句话感染新冠不可怕,最主要是不要去医院就医就没事儿福建人看过来!居家应这样科学消毒!转发!提醒身边人!来源央视新闻健康中国免责声明文章内容如涉及作品内容版权和其它问题,请在30日内与本公众号联系,我们将在第一时间删除内容。文章只提供参考并不构成任何投资及应用建议。葡萄牙出局早已被设定?佩佩发文质疑足联,球迷为C罗打抱不平在世界杯14的决赛中,葡萄牙竟然以01不敌摩洛哥无缘四强,继内马尔之后,C罗也回家了。这场比赛整体的观感还算不错,摩洛哥展现了自身强大的防守能力。从上半场的阵容来看,葡萄牙主帅依旧2023年,中国将完成制造业产业升级疫情三年,对于制造业来讲,其实并不如我们普通人感受到那样水深火热。恰恰相反,在代表新产业的制造门类中,绝大多数取得了相当大的进展。我们看到外贸撑起了中国经济的一片天,而在外贸商品中音频丨卡塔尔世界杯上的无障碍观赛室卡塔尔世界杯考虑到一些特殊球迷人群的需要,让他们也能在吵闹的球场安静地看球。像摩洛哥球迷亚辛沙布布,他从小在感官功能上发育不健全,不能面对喧闹的人群和明亮的灯光,这使得他已经35岁从4199跌至2399,2K屏骁龙8Gen15000mAh,从高端跌至中端市场小米13将以直屏问世,雷军称为回归直屏,从小米9之后,小米数字系列一直是曲面屏设计,小米13采用直屏设计,令人惊叹,有的用户喜欢曲面屏,有的用户喜欢直屏。如果大家喜欢直屏,可以不等雷军果然是个狠人,既然大家都知道我米就直接摊牌了果然是个狠人,雷军直接摊牌小米13系列远山蓝真机图!原定计划在12月1日开发布会上市的小米13系列,因为特殊原因临时延期发布会。但是由于前期时间关系,官方爆料信息太猛导致业内人士根为什么许多人二手iPhone首选XR,这四点原因是关键,比8P还要香对于很多人来说,手机是否全新并不重要,二手市场才是捡漏的宝库,曾经动辄五六千的顶级旗舰,如今也许不到两千即可到手,性价比可谓是相当之高了,尤其是二手iPhone,凭借着自身独特优势摩洛哥为什么能赢球?总结4点原因,天时地利人和都有了摩洛哥为什么能战胜葡萄牙,总结起来有以下四点,如果他们继续保持,下一场赢法国也不是不可能!第一,摩洛哥人识时务者为俊杰,他们知道瑞士是如何输掉比赛的,跟葡萄牙打对攻,只有死路一条!谁说涨价就一定难卖?小米13系列预售超60万台,原因有这几点每当聊起国产机,大家第一时间都会想到性价比,确实国产手机的配置一直都给的不错,价格也比较亲民,对大部分用户来说都是不错的选择,其中又以小米最为出名,是很多人心目中的性价比神机。但现柳传快我国芯片落后被卡脖子的真实原因(四)据悉,我国进入上个世纪八十年代,就已经正式停止了研制各种计算机芯片。别说计算机芯片了,就连计算机硬件都还没有完全搞明白都还没有完全弄清楚。各种计算机软件更是丈二和尚摸不着头脑,操作
136000万元!河南唯一!平煤神马究竟凭什么?作者任峰辉(一峰摄影)近日,2022中国企业碳中和贡献力50强榜单发布,中国平煤神马控股集团名列第39名,成为河南唯一上榜企业,位于平顶山的这家企业为何如此神气?已成为业界热议的话国家统计局8月份,社会消费品零售总额同比增长5。4国新办今天(16日)上午举行新闻发布会,国家统计局新闻发言人国民经济综合统计司司长付凌晖介绍,8月份,面对复杂严峻的国际环境和国内疫情散发多发极端高温天气等多重超预期考验,各地区各2023年银行招聘开始报名,六险二金待遇好,3类人录用几率大稳就业,保民生。2023年,毕业生人数预计将再创新高,社会各方纷纷响应国家号召,为更多毕业生提供就业机会,9月开始,各大银行吹响了秋招的号角,各地招聘公告一个接一个,机会多,待遇好林志颖受访称目前体重55公斤身体几乎已康复右手无力拿不起梳子搜狐娱乐讯据报道,近日林志颖接受采访,称其身体目前几乎都已康复,体重目前55公斤(跟Kimi一样),就是右手比较没有力气,连梳子和吹风机都拿不起来,只能先改当左撇子,需要将肌肉练回与孩子一起认真成长的第五天(shsuxiowshnwigushnwizdoku)事虽小勿擅为苟擅为子道亏擅为擅自做主,盲目行动。苟如果,若是。子道为人父母之道。释义即使很小的事情也不要自己做决定,要经过爸爸中国会清空美国国债吗?很多人都说,现在中美关系紧张,中国会不会清空美债?美国会不会冻结我们的美元资产??先了解下我们从哪里得到的外汇?我们本来不生产美元,为什么我们会有美元外汇?其关键就在于1我们和发达当一些国家,不可阻挡地走向衰退,中国发展前景如何?文子木一些国家,将不可阻挡地走向衰退。最近,世界银行行长戴维马尔帕斯在发布会中,提到这么一句话。虽然早在三年前,就有人预言过这一幕,但与事实越来越接近的时候,不禁让人背脊发凉。摊开深度商品房预售制是否会取消?海老师说预售制与中国经济前一段时间以恒大为代表的民企房地产企业暴雷所引发的交房停贷危机,使网上开始热议取消商品房预售制。海老师在北京头部房企工作10余年,属于非资深从业者,也来和大家聊聊这方面话题。无论现统计局内部驱动因素会推动中国经济持续健康发展中国青年报客户端北京9月16日电(中青报中青网见习记者赵丽梅)我国经济指数恢复态势是否可以持续?今天,在国新办新闻发布会上,国家统计局新闻发言人国民经济综合统计司司长付凌晖表示,从三岁看老是真的吗?中国脑健康日,一起来揭秘古人云,三岁看大,六岁看老,这并非全无道理。06岁阶段正是大脑发育的黄金期,大脑体积将在短时间内迅速增大,达到成人水平的80左右。06岁时期脑发育完善与否,是奠定性格和智力发展的生曼联11年老臣琼斯在训练场已无位置!让位新援,只能去二队更衣室但见新人笑,那闻旧人哭。效力曼联已经11年的菲尔琼斯,因为伤病缘故,夏季转会窗无缘离队,而留在红魔的英格兰铁卫处境尴尬,因为卡林顿训练场设备落后,更衣室位置不足,他失去了训练场更衣