一、前言

断断续续的也有在闲余时间接触领域驱动设计的相关知识,因为目前在工作中更多的还只是一名 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领域驱动设计的理解

我的领域驱动设计运用实例 - 领域啊领域相关推荐

  1. DDD(领域驱动设计)系列主题:领域驱动设计(DDD)实践

    过去几年,通天塔一直处于快速的业务能力建设和架构完善的阶段,以应对不断增长的业务需求和容量.高可用等技术需求,现在通天塔平台已经能满足集团主站的大部分活动.频道搭建和运营能力,主流程的新需求越来越少, ...

  2. 领域驱动设计 (DDD)实例分析

    本文结合实例来分析下领域驱动设计 (DDD) 文章目录 啥是DDD 啥是驱动 DDD误解 啥时候用 啥是复杂 具体解决啥 为啥会耦合 咋解决耦合 咋做分治 咋做分界 模块 分层 咋落地 本文小结 啥是 ...

  3. 解构领域驱动设计(三):领域驱动设计

    在上一部分,分层架构的目的是为了将业务规则剥离出来在单独的领域层中进行实现.再回顾一下领域驱动设计的分层中应用层代码的实现. @Override public void pay(int orderId ...

  4. 一文揭秘领域驱动设计(DDD):领域和子域!

    来源:掘金 链接:https://juejin.cn/post/6898450822771539981 -     前言     - 众所周知,领域驱动设计(DDD)是个相当抽象的概念,国内除了几家知 ...

  5. 领域驱动设计之领域模型_在领域驱动的设计,贫乏的领域模型,代码生成,依赖项注入等方面……...

    领域驱动设计之领域模型 埃里克·埃文斯(Eric Evans)已制定了域驱动设计(DDD). Martin Fowler是DDD的大力支持者和拥护者. 这些都是非凡的名字,几乎可以肯定的是,他们正在支 ...

  6. 分布领域驱动设计(DDD):领域接口化设计式缓存的选择

    -     前言    - 把服务对象(service)和资源库对象(repository)设计成接口是最常见的.但是这对接口化的认识还远远不够,我们需要更深入地去分析接口化设计和更全面地应用接口化编 ...

  7. 领域驱动设计(DDD):领域和子域

    领域和子域 在很长一段时间里,我们认为技术是主导项目成功的关键因素,这种关键因素通常表现在项目使用的编程语言.框架.架构(如:分层架构).中间件.数据库等等方面(如:生态).但技术真的是项目成功的关键 ...

  8. DDD(领域驱动设计)系列主题:领域和子域

    目录 领域和子域 什么是领域? 子域(Subdomain) 核心域(Core Domain) 领域愿景说明(Domain Vision Statement) 突出核心(Highlighted Core ...

  9. 领域驱动设计(DDD):领域接口化设计

    领域接口化设计 把服务对象(service)和资源库对象(repository)设计成接口是最常见的.但是这对接口化的认识还远远不够,我们需要更深入地去分析接口化设计和更全面地应用接口化编程.所以我们 ...

最新文章

  1. python爬虫抓取信息_python爬虫爬取网上药品信息并且存入数据库
  2. [svc]caffe安装笔记-显卡购买
  3. web播放器(falsh,audio)
  4. 矩阵二范数(norm)
  5. numpy 创建加一行_Python数据分析快速入门--NumPy amp; Pandas
  6. python 全栈开发,Day116(可迭代对象,type创建动态类,偏函数,面向对象的封装,获取外键数据,组合搜索,领域驱动设计(DDD))...
  7. 不属于python的数据类型_下列________不是Python的数据类型。
  8. IDEA打开父类的接口方法快捷键
  9. android关闭系统弹窗,Android 禁止 EditText 弹出软件盘
  10. python ftp_Python FTP
  11. NLP 自然语言分析理解
  12. Android SDK 和 JDK 安装
  13. python 导入自定义的包
  14. typroa 思维导图_巧用Markdown和百度脑图
  15. 自研·学术·文献查找
  16. P语言: 为异步、容错和不确定性而生的编程语言
  17. javaweb mysql购物车_java web开发之实现购物车功能
  18. X87 FPU 指令集
  19. 《人物》:计算机世界第一人—艾兰·图灵
  20. valine评论系统使用

热门文章

  1. Html、Css-----当有文字和图片的时候,需要文字和图片居中,怎么实现?不想文字换行怎么设置...
  2. Struts 2.x No result defined for action 异常
  3. 用VS studio 2008做sql server 报表出现乱码
  4. Teams Developer Portal介绍
  5. IT:如何使用Server 2008 R2上的远程桌面服务设置自己的终端服务器
  6. macbook图形化编程_如何判断MacBook使用的是哪种图形芯片(并进行切换)
  7. 如何批量删除指定的GitHub Repos
  8. JS基础入门篇( 一 )
  9. Intellij IDEA2017 的控制台里不识别maven命令问题处理
  10. 玩一玩微信公众号开发(一) 接入系统