热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DDD子域与有界上下文的关系

假设有一个农业机械零件的批发商。他们建立了一个B2B网上商店,供经销商和机器维修公司订购。在他们无处不在的统一语言与术语中,订单代表了这个自动化流程:它使客户能够挑选产品,应用正确



假设有一个农业机械零件的批发商。他们建立了一个 B2B 网上商店,供经销商和机器维修公司订购。在他们无处不在的统一语言与术语中,订单代表了这个自动化流程:它使客户能够挑选产品,应用正确的折扣,并将其推送到 送货。
如果这个批发商与竞争对手合并:他们是老牌企业,拥有稳固的客户群和庞大的目录。后者也有一个订购系统,但它更传统:客户打电话,客户经理输入订单,应用任意折扣,然后将其推送到送货。
合并后的公司仍然只有一个 Sales销售 子域,但它现在有两个 Sales Bounded Contexts销售上下文。它们两个模型中都有像 Order 和 Discount 这样的概念,这些概念的含义基本相同。两个批发商的员工就订单或折扣达成一致。但是他们有不同的使用流程,他们在表单中输入不同的信息,并且有不同的业务规则。
在技​​术意义上,差异体现在对象设计、方法、工作流、应用折扣的逻辑、数据库表示和一些统一语言与术语中。不过,它运行得更深入:对于软件设计人员来说,要在任一有界上下文中都富有成效,他们必须了解这两种模型之间的许多区别:有界上下文代表可理解边界。( 上下文为王 )
在一个完美设计的系统中,我们理想的有界上下文通常会与子域的边界很好地对齐。但有界上下文实际上是遵循系统演进的。
系统随着公司组织发展。不幸的是,这个发展过程中呈现的新概念经常不以符合我们设计的方式出现,我们对变得更加不一致的代码感到不舒服了,只要我们有时间就想要统一这些新旧概念并制作干净的抽象,因为我们应该创建一个设计良好的系统。
 

子域与有界上下文区别
上面的例子简单地表明,单个子域实际可以由多个有界上下文表示。
领域与有界上下文区别:有界上下文可能与应用或服务边界一致,也可能不一致。同样,它们可能与领域边界对齐,也可能不对齐。领域存在于问题空间中。领域是组织如何看待其活动和专业领域的方式;而有界上下文是属于解决方案空间的一部分,它们是经过深思熟虑的设计选择。
作为系统设计师,您选择这些边界来管理系统的可理解性,通过使用不同的模型来解决领域的不同方面。
对于上面案例,系统设计者可以:


  • 合并两个销售上下文,
  • 将一个迁移到另一个里面,
  • 建立一个新的销售上下文来取代两者,
  • 推迟这项努力,
  • 或者不做任何事情并保留现有的两个上下文。

这些都是设计选择,即使 CEO 最终会从这些选项中进行选择(例如,由于预期的投资回报率)。或许,在权衡之后,将两个销售上下文并排放置是目前最好的战略设计选择,因为它允许合并后的公司专注于新的机会。毕竟,现有系统确实服务于它们的目的。这里的要点是,为单个子域设置两个有界上下文可能是一个非常有效的选择。
 

一个子域有多个上下文
当没有外部触发(如批发商合并)时,您是否还会故意选择将单个域拆分到多个上下文中?
假设你为一位小商品贸易商提供咨询。他们专注于一些特殊商品,由 20 名交易员、一些运营支持角色和大约 10 名开发人员组成。首席工程师参观了该系统,该系统由单个交易域的 20 个有界上下文组成。每个交易者都有一个上下文。
这看起来很奇怪,我们的本能是找出相似之处,将它们抽象出来,并使它们可重复使用。开发人员没有这样做。他们充其量只是复制粘贴彼此的代码块。首席工程师主要关心的是“我们是否针对我们的情况进行了优化设计?” 他们担心自己陷入了大麻烦。
每个交易者都有自己的交易代表。整个公司甚至有多种金钱货币体系。交易者的算法不同,尽管许多人做的事情有些相似。每个交易者都有不同的仪表板。开发人员使用相同的第三方库,但是当他们彼此共享自己的代码时,他们并没有尝试统一它。相反,他们复制了代码,并随着时间的推移按照他们认为合适的方式进行修改。许多工作涉及数学算法,而不是典型的面向业务的 IT。
事实证明,每个交易者都有独特的需求。他们需要快速行动:他们尝试了不同的算法、预测和看待市场的方式。开发人员为交易者服务,并与他们密切合作,不断将他们的想法转化为新代码。交易员受到高度重视,他们是压力大、竞争激烈的环境中的首要人物。如果你想成为其中的一部分,你就不能成为一个缓慢的编码者或一个数学懒鬼。没有(Jira)票,没有功能积压。这是领域专家和程序员之间的终极快速反馈循环。
事情每天都在快速变化。找到正确的抽象需要大量的协调,它会大大减慢开发速度。试图统一代码会毁了公司。
这种设计并不充满技术债务。这也不是遗留问题,多年来设计意外地以这种方式发展。该代码正在工作。这种缺乏统一抽象的设计是一种深思熟虑的设计选择,符合目的,即使起初看起来是一个激进的选择。所有的开发者和交易者都对它感到满意。
这些也不仅仅是具有大量重复代码的独立程序。这是一个单一的领域,分为 20 个有界上下文,每个有自己的领域模型、自己的通用语言和自己的变化率。协调模型中的语言和概念会增加这种高速环境中的摩擦。通过故意选择设计单独的上下文,他们消除了这种摩擦。
 

权衡
权衡设计选择的后果是:当开发人员需要帮助解决问题时,他们必须让其他开发人员跟上进度。每个开发人员在另一个有界上下文中工作时,都希望他们必须进行上下文切换。毕竟,它们的术语和概念彼此不同,即使它们共享相似的术语。上下文切换是有代价的,如果您整天处理不同的项目,您可能已经体验到了这种代价。但是在这里,因为上下文显然是有界的,所以这并没有引起很多问题。有时,通过向具有相似上下文背景(但有界上下文不同)的另一位开发人员解释问题,解决方案变得显而易见。
  

一般 IT 系统中的多个有界上下文
交易系统是一个极端的例子,您不会遇到许多环境,其中具有 20 个有界上下文的单个子域是有意义的。但是在许多常见情况下,您应该考虑拆分域。如果在您的公司中,个人客户和企业客户的定价规则不同,那么在单个域模型中统一这些规则的努力可能会花费更多。或者在薪资系统中,受薪员工和计时员工的规则和流程不同,您最好拆分此域。
  

总结
正确的上下文边界遵循业务的轮廓。不同的区域在不同的时间以不同的速度变化。随着时间的推移,看起来相似的东西可能会以令人惊讶和出人意料的方式产生分歧(如果有机会的话)。将概念压缩到单个模型中是有限制的。通过使其服务于两种不同的业务需求并持续承担协调成本,您正在使模型复杂化。这是一种隐藏的依赖债务。
我们可以在这里推导出两种启发式方法:

  1. 限界上下文/有界上下文不应该服务于设计师的感性和对完美的需求,而应该提供商业机会。
  2. 变化率启发式:考虑组织有界上下文,以便它们管理以相同速度变化的相关概念。

由 Mathias Verraes @mathiasverraes和 Rebecca Wirfs-Brock @rebeccawb 撰写。

 


推荐阅读
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • qt学习(六)数据库注册用户的实现方法
    本文介绍了在qt学习中实现数据库注册用户的方法,包括登录按钮按下后出现注册页面、账号可用性判断、密码格式判断、邮箱格式判断等步骤。具体实现过程包括UI设计、数据库的创建和各个模块调用数据内容。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • “你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间,这是我们最战战兢兢的心情。但是显然,有些人体会不了。这份行业数据,让笔者“柠檬” ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 本文讨论了读书的目的以及学习算法的重要性,并介绍了两个算法:除法速算和约瑟夫环的数学算法。同时,通过具体的例子和推理,解释了为什么x=x+k序列中的第一个人的位置为k,以及序列2和序列3的关系。通过学习算法,可以提高思维能力和解决问题的能力。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
author-avatar
蜃海
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有