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

一、领域、子域、限界上下文

一、简介领域驱动设计,Domain-Driver-Design,简称为DDD。DDD是一种思想,用以软件系统的分析和设计。由领域来驱动设计的进行,这里的领域可以简单理解为我们常说的“业务”。也

一、简介

领域驱动设计,Domain-Driver-Design,简称为DDD。

DDD是一种思想,用以软件系统的分析和设计。由领域来驱动设计的进行,这里的领域可以简单理解为我们常说的“业务”。也即是,由对业务的分析工作来驱动软件设计工作。

听起来好像所有软件都是这样,从业务分析到软件设计,但是一般软件过程中,业务和软件之间存在着一条鸿沟,分析完了,似乎没办法马上转换成软件设计。DDD思想则为了打破这道鸿沟。

DDD自上而下分为战略设计和战术设计,我们可以这么想,战略设计就是从上层进行抽象性设计,而战术设计就是基于上层抽象做下层的具体实现设计。

本文涉及的领域、子域、限界上下文就是属于战略设计。也就比较抽象,在DDD书籍当中看起来也显得有些晦涩。

不过对于思想层面的东西,我们不应该要求自己一下子就完全跟作者契合。而是通过自己的理解和不断实践,一步步让思想不断加深。所以,不要太纠结于自己是不是理解的不正确。

二、概念

什么是领域?

我们可以把领域当作一个大的问题域来理解,如果对一个企业来说,那么就是这个企业要做的所有事情。

什么是子域?

子域是相对于领域的一个概念,顾名思义就是领域被细化以后分成了不同的子域。这个应该相对比较好理解,因为我们人习惯性的会将大的东西进行分割,然后逐个击破。比如“分层思想”,“模块化思想”等。

那么子域就是将一个大的问题域拆分成了很多小的问题域。

并且根据子域的重要性以及作用范围将子域分成了:

1、核心域:重要性最强

2、支撑子域:重要性较低,辅助核心域

3、通用子域:给所有域提供辅助

什么是限界上下文?

开发软件的目的就是为了解决问题,领域定义了问题域,子域细分了问题域。那么我们需要考虑如何根据这些问题域来设计解决方案。

我们说的解决方案就是“领域模型”,领域驱动设计即根据问题域来进行建模。

可是我们想一下,如果我们对整个领域建立一个模型是不是太可怕了,如果系统过于庞大,那么这个模型也将非常庞大,牵一发动全身。

既然模型不好建得太庞大,那么我们可以根据细分的子域来建模型。

比较理想的情况是我们根据一个子域单独建立一个模型,也就是一个问题有一个解决方案。这是比较理想化,有时候我们会遇到一个模型能会对应多个子域,或者多个模型对应一个子域的情况。就是说我们可能需要多个解决方案一起来合作把一个问题解决,或者一个解决方案能够解决多个问题。

那,限界上下文在子域和模型这里起到什么作用呢?

我们姑且认为,限界上下文就是将模型对应的子域给框定一个范围,就是说我这个方案要解决的问题包括这些内容。从这个角度,我们可以将领域模型和限界上下文理解为一对一的关系,而通常一个限界上下文将成为一个系统。因此,我们简单地去认为(实际中这个等式并不准确):领域模型 = 限界上下文 = 一个系统 

事实上,限界上下文包含的不只是一个领域模型,还有通用语言,领域服务...等不少东西,这里不去讨论这些内容。

三、总结

本文不求甚解,将领域和子域映射为问题域的确定和细分,将领域模型作为问题域的解决方案,将限界上下文认为是为领域模型框定了一个范围表示领域模型解决了那些问题。

在进行战略设计的过程中,主要在于如何确定问题,以及确定要构建哪些模型来解决什么问题。

你根据问题域去设计解决方案的过程也即是领域如何驱动设计的过程。

 


推荐阅读
  • BeautifulSoup4 是一个功能强大的HTML和XML解析库,它能够帮助开发者轻松地从网页中提取信息。本文将介绍BeautifulSoup4的基本功能、安装方法、与其他解析工具的对比以及简单的使用示例。 ... [详细]
  • 择要:Fundebug的JavaScript毛病监控插件同步支撑Vue.js异步毛病监控。Vue.js从降生至今已5年,尤大在本年2月份宣布了严重更新,即Vue2.6。更新包含新增 ... [详细]
  • 本文探讨了如何在Sitecore 9环境中通过Postman使用API密钥发送请求,包括解决常见错误的方法。 ... [详细]
  • 本文介绍如何通过Java代码调用阿里云短信服务API来实现短信验证码的发送功能,包括必要的依赖添加和关键代码示例。 ... [详细]
  • 解决Expo XDE 2.22.1版本启动错误
    根据问题描述,用户在将Expo升级至2.22.1版本后,在尝试打开项目时遇到了错误。本文提供了详细的错误分析及解决方案。 ... [详细]
  • 本文探讨了互联网服务提供商(ISP)如何可能篡改或插入用户请求的数据流,并提供了有效的技术手段来防止此类劫持行为,确保网络环境的安全与纯净。 ... [详细]
  • 本文详细介绍了如何使用C#实现不同类型的系统服务账户(如Windows服务、计划任务和IIS应用池)的密码重置方法。 ... [详细]
  • JavaScript 跨域解决方案详解
    本文详细介绍了JavaScript在不同域之间进行数据传输或通信的技术,包括使用JSONP、修改document.domain、利用window.name以及HTML5的postMessage方法等跨域解决方案。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 本文探讨了如何通过优化 DOM 操作来提升 JavaScript 的性能,包括使用 `createElement` 函数、动画元素、理解重绘事件及处理鼠标滚动事件等关键主题。 ... [详细]
  • 本文详细介绍了JQuery Mobile框架中特有的事件和方法,帮助开发者更好地理解和应用这些特性,提升移动Web开发的效率。 ... [详细]
  • Irish budget airline Ryanair announced plans to significantly increase its route network from Frankfurt Airport, marking a direct challenge to Lufthansa, Germany's leading carrier. ... [详细]
  • 本文档介绍了如何使用OpenStack命令行工具在Keystone身份服务中创建和管理域、项目、用户及角色。随着Keystone命令向OpenStack命令集的迁移,了解这些新的命令格式对于系统管理员来说至关重要。 ... [详细]
  • 调试利器SSH隧道
    在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到 ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
author-avatar
手机用户2402851155
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有