我的领域驱动设计运用实例 - 领域啊领域

一、前言

断断续续的也有在闲余时间接触领域驱动设计的相关知识,因为目前在工作中更多的还只是一名 crud boy,因此目前也只是对其中的某些知识点有知晓,实际使用的比较少,仅此而已。因此,趁着这个春节假期,整理了一下自己的 github 帐号,同时结合自己定的学习计划以及自己的期望发展方向,决定从一个真实的案例来梳理领域驱动的相关知识。

本篇文章是开篇,因为领域驱动设计相关的知识真的不怎么好懂,如果行文中出现错误的地方,欢迎大家在评论区指出,先行感谢。

当然,talk is cheap, show me the code,作为一名 .NET 开发人员,实例中的服务端代码全部是基于 ASP.NET Core 框架进行搭建的。 

二、系列目录

  1. 我的领域驱动设计运用实例 - 领域啊领域 

三、Step by Step

不清楚大家在接触领域驱动的相关知识时,是不是一上来就是领域驱动经典的四层架构,然后什么是实体、值对象、聚合,它们之间有什么异同以及与传统的开发模式又是什么,领域模型又是什么东东,最终接触到一大堆的概念,结合上网搜到的示例项目代码,结果最后就知道了几个名词。

当然,这些都是领域驱动设计中比较重要的知识点,可能是自己入行较短,按照上面的这个顺序看了一遍,看完之后,嗯,貌似最后都没看完,我只能是下面的这种表情。。。因此,为了不让像我这样的小白用户一上来就用药过猛,所以这里我换一种方式来尝试解释我所认为的领域驱动设计,如若存在偏差,希望可以帮忙指出。

第一篇介绍的是我认为领域驱动设计中一个最基础的东西,也是很多文章中并没有说的,如何去识别出业务领域并进行划分。

1、案例分析

因为在识别领域时,需要做到对于业务流程有比较深刻的了解,至少应该做到有相关软件的使用经历,因此在这个系列的文章中,我选择的是项目管理软件作为文章的示例项目。最终实现的各种需求是基于禅道项目管理软件这个开源项目的,因此,在开发这个项目之前,我们可以先看看禅道这个项目管理系统中所包含的功能模块。毕竟,只有在了解需求之后才好进行下一步的工作。

在这个开源的项目管理系统中,主要包含了如下的几个功能。

除了一些基础的权限相关功能,站在项目产品的角度,禅道包含了对于产品的分支、团队成员、迭代版本、功能模块、功能需求等数据信息的维护,同时针对项目可以去设定各种任务、以及可以提 bug 等等任务操作。

当然,系统所包含的功能还可以继续往下展,如果按照我们面向数据库开发的经验,在弄清楚系统的各项功能后,可能就是去建各种的表了,继而识别出各个表之间的关联关系,然后就 ctrl c、ctrl v 的开干了。当然,这里既然选择采用一种新的方式进行开发,忘掉我们原来的经验,从一个新的角度开始。

2、领域划分

领域驱动设计,在维基百科中对于领域的解释如下,因为词条的中文解释应该是机翻的,所以这里放出英文原文,下方的中文是我基于个人理解所提供的翻译,仅供参考。

A sphere of knowledge (ontology), influence, or activity. The subject area to which the user applies a program is the domain of the software;

领域是一种关于知识、影响或是活动的范围限定。软件的领域是用户想要通过使用该程序所要达到的主体功能。

范围,即是边界,能够置于相同范围内的事物必定是具有着某种相同的特性,我们通过代码的手段来解决现实中的问题时,也会将某些共通的业务放到一块。

因此,在使用领域驱动的思想来指导软件开发的过程中,我们需要按照一定的业务规则将期望达成的业务进行细分,在最终划分出的一个个小业务范围内,通过建立领域模型的方式,指导代码实现,从而解决具有共同特性的问题,因此,领域驱动设计中的领域就是这个业务边界范围内想要解决的业务问题域。

接下来,针对我们期望实现的项目管理系统,就是需要按照一定的业务规则,完成我们的业务领域的划分。

  • 第一步:确定研究对象,明确我们将要研究的业务领域,识别出最终需要解决的业务问题;

    我们最终想要实现的目标是一个项目管理系统,因此这里我们的研究对象就是项目管理。

  • 第二步:对研究对象按照一定的业务逻辑进行细分,将领域进一步的划分成多个子领域;

    从上面了解到的期望实现的系统功能中看出来,基于各个项目管理中不同业务的特性,我们可以将项目管理这个领域拆分成项目子域、版本子域、任务子域等等。

  • 第三步:对识别出的子领域再次进行细化,从而识别出子领域中的最小单元,从而确定所需要研究的范围边界;

    在识别出领域的各个子域之后,我们需要对子域进行进一步的细化,当不能再细化的时候,我们就可以在这个限界上下文中去建立该子领域的领域模型,从而构建出代码模型,完成最终的编程开发。

就像上面列出的步骤一样,我们在对业务领域进行不断的拆分中,会划分出不同的子域。对于业务来说,某些业务很重要,某些可能就无关紧要。因此在划分子领域的过程中,通过子域的重要性和业务功能属性的差异,我们可以将其区分成核心子域、通用子域、以及支撑子域。

核心子域是我们需要解决的业务核心问题,支撑子域是支撑我们的核心子域实现的业务,而通用子域则更多的是每个系统中一些通用的业务功能,例如,认证、授权等等。因此,在实现业务时,我们应该将核心子域的建设摆在首位。

按照上面的步骤,识别出的业务领域如下图所示,因为这里的领域划分,更多的是我个人的想法,所以会存在思考不完善的地方,如果你有别的看法,欢迎指出。

可以看到,这里其实只是识别出了比较粗放的业务子领域,并没有完成对于业务最小单元的边界识别。因为这块的内容会与领域建模关联比较大,所以统一放到下一篇文章中,通过介绍如何用事件风暴的方式完成对于业务领域的建模时一起介绍。

嗯,其实就是完全没想好怎么写。。。

 

三、个人总结

  • 领域驱动的核心是完成对于领域模型的定义,从而确定业务和应用边界,保证我们的业务模型与代码模型一致性;

  • 领域驱动是一种架构设计的方法论,通过围绕实际业务构建领域模型的方式将复杂的业务领域逐步的拆分,帮最终找出最基础的业务功能与其对应的最基础功能应用的边界;

  • 领域是用来确定功能的范围,范围即是边界,相同的业务问题应该限制在特定的一个功能范围中。一个业务领域可以继续划分,最终实现将业务域进行不断的拆解,从而降低对于整体业务的理解和系统实现的复杂度; 

四、参考资料

  • 阿里盒马领域驱动设计实践

  • DDD理论学习系列——案例及目录

  • 浅谈我对DDD领域驱动设计的理解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AcWing 503. 借教室

代码如下&#xff1a; #include <iostream> using namespace std; const int N 1000010; int r[N],d[N],s[N],t[N]; typedef long long LL; LL b[N]; int n,m; bool check(int mid) {for (int i 1;i<n;i) b[i] r[i]-r[i-1];for (int i 1;i<mid;i){b[s[i]]-d[i…

远程办公从学习开始,潜伏在家,技术如何逆袭?

今年的春节假期特别长&#xff0c;大家为了能够尽快结束武汉新冠肺炎&#xff0c;自主隔离在家。我也花了大概三天的时间写了一篇总结我公司当前支持远程办公的文章&#xff1a;远程办公经验为0&#xff0c;如何将日常工作平滑过度到线上? 这篇文章使用的全部是腾讯的产品&…

AcWing 499. 聪明的质监员

解题思路&#xff1a; https://www.acwing.com/solution/content/33961/ 代码如下&#xff1a; #include <iostream> using namespace std; const int N 200010; int w[N],v[N],L[N],R[N]; typedef long long LL; LL cnt[N],b[N]; int n,m; LL S; LL get_Y(int mid) {…

也读《人类简史》:从动物到上帝的智人

【读书笔记】| 作者 / Edison Zhou这是恰童鞋骚年的第178篇原创文章《人类简史&#xff1a;从动物到上帝》是一本评分极高的书&#xff0c;我在春节期间阅读完&#xff0c;信息量极大&#xff0c;现在将其重点内容总结整理成此文&#xff0c;分享与你。1关于《人类简史》《人类…

二分边界

转载地址&#xff1a; https://www.acwing.com/solution/content/33961/

重磅 | GitHub 2019 数字年报全文正式发布

摘要在开源日益重要的今天&#xff0c;我们需要一份建立在全域大数据基础上的相对完整、可以反复进行推演的数据报告&#xff08;报告、数据、算法均需开源&#xff09;。本项目为X-lab 开放实验室团队发起&#xff0c;旨在通过分析Github全网的开发者行为日志&#xff0c;通过…

dotnet 从零开始写一个人工智能 网络模型

本文将不使用任何人工智能框架&#xff0c;只用简单的 dotnet 的类&#xff0c;自己搭建一个人工智能网络。本文适合小伙伴跟着一步步写特别感谢老马的程序人生的帮助&#xff0c;本文有大量代码都是从如何利用 C# 抽象神经网络模型抄的在人工智能模型有不同的问题可以选用不同…

深度学习之tensorflow环境搭建

深度学习之tensorflow环境搭建&#xff1a; 1.搭建的步骤 1-1.破解版的Pycharm软件包下载 1-2.Ananconda软件包的下载 1-3.使用Anaconda Prompt 命令&#xff0c;首先输入 “conda create -n py37 python3.7 anaconda” 然后回车等待包的下载&#xff0c;其次激活py37&am…

SkyWalking学习笔记(CentOS环境)

基于 CentOS 环境使用 SkyAPM-dotnet 来介绍一下 SkyWalking&#xff0c; SkyAPM-dotnet 是 SkyWalking 的 .NET Agent环境要求JDK8Elasticsearch8080,9200,10800,11800,12800 端口不被占用Elasticsearch安装Elasticsearch下载安装(CentOS为例) 参考官方教程.下载并安装公共签名…

[蓝桥杯2019初赛]最大降雨量-模拟

题目描述 由于沙之国长年干旱&#xff0c;法师小明准备施展自己的一个神秘法术来求雨。 这个法术需要用到他手中的49 张法术符&#xff0c;上面分别写着1 至49 这49 个数字。 法术一共持续7 周&#xff0c;每天小明都要使用一张法术符&#xff0c;法术符不能重复使用。 每周&a…

用户登录的电话号码和密码进行测试PythonGUI实验

用户登录的电话号码和密码进行测试PythonGUI实验&#xff1a; 1.要求&#xff1a;对用户登录的电话号码和密码进行测试 2.电话号码&#xff1a;分为首字母不为0&#xff0c;长度必须为11为&#xff0c;类型全部为数字 3.密码&#xff1a;分为长度为6-12位&#xff0c;类型为AS…

武汉坚守第十二日——爆发期的困守待破

已经到了第十二天&#xff0c;不能出门的日子&#xff0c;浑身都是难受的&#xff0c;尤其对于我这样一个日常一天要步行10公里每年4000公里步行的人来说&#xff0c;坚持了四年的习惯变成这样&#xff0c;真心不舒服&#xff0c;于是在室内开始了一些自救——自救运动&#xf…

[蓝桥杯2019初赛]完全二叉树的权值-完全二叉树的性质

注意: j < n不能少!!! 代码如下&#xff1a; #include <iostream> using namespace std; const int N 100010; typedef long long LL; int a[N];int main() {int n;LL maxv -1e18;cin >> n;int depth 0;for (int i 1; i < n; i)cin >> a[i];for …

机器学习前的热身(必备)

机器学习前的热身&#xff08;必备&#xff09; 备注&#xff1a; 本内容参考李航的《统计学习方法第二版》第一章 注&#xff1a;如果本篇内容存在错误&#xff0c;望大家留言批评指正。

WTM系列视频教程:初体验

WTM系列视频教程第一章&#xff1a;初体验文字摘要&#xff1a;“如果你没用过wtm&#xff0c;今天的教程肯定能让你眼前一亮&#xff0c;这个框架竟然这么牛逼么&#xff1f;开发速度这么快么&#xff1f;”“至于为什么叫WTM&#xff0c;他的全称是WalkingTec MVVM&#xff0…

[蓝桥杯2019初赛]修改数组-并查集

代码如下&#xff1a; #include <iostream> using namespace std; const int N 1000010; int a[N];int find(int x) {if (a[x] ! x)a[x] find(a[x]);return a[x]; }int main() {int n;cin >> n;for (int i 1; i < N; i)a[i] i;for (int i 1; i < n; i)…

【听歌】GDB入门教程之查看函数调用堆栈

写在前面&#xff1a;又到周末啦~上上周忍痛买了个雅马哈声卡和 AKG 话筒&#xff0c;这周六才正式打开试用了下&#xff0c;效果还不错&#xff0c;我自己还挺享受的。不过这玩意儿太高端&#xff0c;还不会用 AI 调音。小伙伴们感觉下这首加了一点点电音效果的歌曲如何呢等我…

python通过tkinter界面库实现三角形成立的测试

python通过tkinter界面库实现三角形成立的测试 from tkinter import * from tkinter import messagebox login Tk() login.title(验证) login.geometry(800x600) Label(login,text实现三角形成立的验证).grid(row0,column0,columnspan2) Label(login,text边a&#xff1a;).gr…

研发协同平台持续集成实践

源宝导读&#xff1a;“持续集成”是敏捷最佳实践中&#xff0c;保证高质量交付的关键环节之一。本文将分享&#xff0c;在大规模研发在线协同的背景下&#xff0c;如何支撑在线持续集成的高性能和高可用。 一、什么是持续集成 在《持续集成》一书中&#xff0c;对持续集成的定…

机器学习朴素贝叶斯算法+tkinter库界面实现好瓜坏西瓜分类

机器学习朴素贝叶斯算法tkinter库界面实现好瓜坏西瓜分类 一、界面实现 from tkinter import * from tkinter import ttk import NBdef main():win Tk()win.title(甜的西瓜挑选系统)win.geometry(1000x600)lb2 Label(win, text"色泽", font"tahoma 12 norma…