热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

谈谈领域驱动设计的理解

领域驱动设计有感最近3年一直在供应链信息化领域的管理和架构,一方面惊讶于该领域业务知识的复杂,另一方面也惊讶于管理的复杂,特别是今年在做一个系统的架构时,学习了很多的东西。这几年,

领域驱动设计有感 最近3年一直在供应链信息化领域的管理和架构,一方面惊讶于该领域业务知识的复杂,另一方面也惊讶于管理的复杂,特别是今年在做一个系统的架构时,学习了很多的东西。这几年,几乎每年都要花2000+元在买书上。目前负责一个架构的团队有几十号人,一直在思考如何更好的做好的一个复杂的软件产品,因此,也有意识的学习一些知识。最近在看的有两本书《领域驱动设计》、《架构及未来》,本文简单的描述读《领域驱动设计》前面两部分的一些体验。

强烈推荐有志于架构师、CTO,走技术流的兄弟们也好好看一下这两本书。对于一个大型的团队,你不可能再亲力亲为,因而,这时候需要考虑的是如何为团队构建成熟的组织、流程、制度,确保团队可扩展性。阅读《领域驱动设计》的目的,是为系统分析团队探索一条比较有效的系统分析设计方法,希望将其变成团队可以遵循的标准规范,使团队形成更为高效的详细设计方法。 设计的目的是为了建模,通过模型实现更有效的沟通,确保领域专家、技术团队能够为需求达成一致的理解,并且,通过模型可以理解代码,保证代码的可理解性、可扩展性、可维护性。

领域驱动设计的一个重点就是领域建模。谈到领域建模,我们先谈谈领域。领域知识一般是用于描述有哪些角色使用系统完成什么任务。领域知识的描述语句就是“主谓宾”,比如关于订单领域知识的描述,大致是“用户通过商城可以搜索商品,将商品添加到购物车,然后下单付款等待收货。每一个订单由若干商品构成,在下单的时候,商品价格是确定的、优惠也是确定的。供货商会在不同的时期去更改商品的价格和优惠方式……”。这段领域知识的描述的每一个“主谓宾”句子,本质就是由名词(主语和宾语)和动词构成。因此,对领域知识的建模会有以下元素构成:

(1)关联:谓语一般用于关联主语和宾语,比如订单由若干商品(确切的讲,应该成为订单商品,订单商品与商品不同)构成。关联由:组合、聚合、关联、依赖四种类型,这里“订单由若干订单商品构成”,表明订单和订单商品是组合关系,即订单是订单商品组成并且订单商品不能单独存在。聚合是组合的弱化,聚合是弱化的整体和部分的关系,这里的部分可以单独存在。关联相对于组合与聚合会更弱一些,比如这里“用户下单付款等待收货”。用户和订单就是一种关联关系,订单属于用户,用户与订单的关系就是“下单”。依赖是在业务代码中,一个类使用到另一个类的功能,比如付款时,我们会依赖第三方接口来实现具体的付款。付款有不同的方式,我们会抽取为不同的支付接口,仅依赖于接口而不是实现。

(2)实体/值对象:领域知识的名称,会由实体(或称为领域实体)或者值对象来表示,动词则可能是领域实体的一个操作。实体与值对象的差别在于实体具有标识,值对象则没有。

(3)模块/系统:模块和系统用于组织领域知识的边界,确保软件系统的高内聚、低耦合。

(4)Service:一般表示一些可复用的功能,领域实体一般会依赖于服务。

我们通过以上元素,将领域知识,使用大家都能看懂的图形来构建出来,这就是建模。模型必须真实反映了领域知识,并且与代码相对应。对于复杂系统,领域模型会非常庞大,这样的模型图我相信没有任何人有兴趣细看,我们会陷入到细节中,然后不知所措。因此,更有效的建模,会使用分层、模块化、服务化,甚至按照子系统设计,传统的SOA架构也是解决软件复杂性的一种有效的方法。同理,在数据库设计时,一张庞大的ER图也是很恐怖的,模型必须进行分层,由顶向下,由High Level到Details Level。

这里,我们使用图形对“客户下单”领域知识进行了建模(模型图仅示例,不精确)。这个模型反应了客户、订单、商品、优惠折扣及历史价格的关系。

所有的领域实体,具有生命周期,我们通过以下模式来管理领域实体。

(1)聚合(Aggregate):在这里订单、订单商品(订单商品与商品折扣)、订单折扣是聚合关系,订单是这些部分的聚合根。我们使用聚合模式来将这些实体作为整体统一管理。聚合涉及的实体将一起存在、一起消亡,需要满足固定的商业规则。领域驱动设计只允许我们通过聚合根来访问,二不允许直接访问内部实体。这确保整个业务规则的完整性,具备更好的可维护性、可扩展性。

(2)Factory和Repository:Factory用于创建复杂的聚合根,Repository用于加载和保存聚合根到持久存储。 领域驱动设计提倡将系统分成UI层、应用层、领域层和基础设施层。通过这几个元素,我们整个设计就初步具备一定的标准规范了。在后续,我会进一步分享关于聚合、Factory、Repository模式的知识。 这本书可以让我们对设计有一种从朦胧到清晰的感觉,提供了更好的方法论,有助于解决软件的复杂性难题。


推荐阅读
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 数字账号安全与数据资产问题的研究及解决方案
    本文研究了数字账号安全与数据资产问题,并提出了解决方案。近期,大量QQ账号被盗事件引起了广泛关注。欺诈者对数字账号的价值认识超过了账号主人,因此他们不断攻击和盗用账号。然而,平台和账号主人对账号安全问题的态度不正确,只有用户自身意识到问题的严重性并采取行动,才能推动平台优先解决这些问题。本文旨在提醒用户关注账号安全,并呼吁平台承担起更多的责任。令牌云团队对此进行了长期深入的研究,并提出了相应的解决方案。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了将mysql从5.6.15升级到5.7.15的详细步骤,包括关闭访问、备份旧库、备份权限、配置文件备份、关闭旧数据库、安装二进制、替换配置文件以及启动新数据库等操作。 ... [详细]
author-avatar
SHARK
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有