前言

领域驱动设计最近貌似开始火起来了,越来越多的人开始认识到领域设计的重要性,从我做过的项目来看,似乎欧洲已经有很多的公司开始实施领域驱动设计了,我看领域驱动设计也有些时间了,但是网上不管是文章还是代码,都显得太过“高大上”,一谈领域驱动设计,一大堆的概念一股脑的给你上上来,搞的有点晕头转向,而我想在一些中小项目实施领域驱动也遇到了不小的障碍,大家对很多东西都处于一种恐惧的状态,而且在正真开始实施时,也遇到一些疑问,所以也想和大家交流学习,因此开始在此写写对领域驱动的理解,后面会有一些轻量的演进代码。

为何要领域驱动设计?

简化数据存储

领域驱动设计有很多原因,谈到我为啥要在公司推行领域驱动设计,说起来还是很好玩的,因为原来基于数据驱动的开发方式,也就是传统的多层开发架构,大家定义了一堆DAL来操作数据, 在.Net大家一般有两种使用方式,一种是用ORM像Entity Framework, 另一种想使用Dapper这样轻量级的Mapping工具,这些都要把关系型数据转换为对象。结果导致以下几种结果。

  • 没有正确的使用ORM, 导致数据加载过多,导致系统性能很差。
  • 为了解决性能问题,就不加载一些导航属性,但是却把DB Entity返回上层,这样对象的一些属性为空,上层使用这个数据时根本不知道什么时间这个属性是有值的,这个是很丑陋的是不是?
  • 如是又开始使用一些轻量级的数据方法,比如使用Dapper然后自己写SQL语句,这本来是很不错的方式,但是大部分人的SQL能力实在不敢恭维,大部分写出来的SQL语句,甚至比EnityFramework生成的语句还差。

所以,我就想我们做项目,大部分处理的应该是业务,如何让程序员从数据存储,模型转换的大泥潭里解放出来,领域驱动设计就进入了我的视线,当然光从数据这个角度还不足以选择领域驱动设计,用一个NoSQL数据库是不是就解决了? 但是NoSQL也有一些问题,比如MongoDB如何更优雅的保证事务以及数据的一致性等。

更多了解上下文

我们很多软件的问题,大家都知道是需求的问题,也就是客户的需求我们很难理解准确,导致程序员更加关注"HOW" 而忽略了"WHAT", 最终做了几个礼拜甚至更长时间,结果客户会说:"What?! I told you", 但是客户告诉我的,我们理解是不一样的。比如客户说:“ Great job, I love you!” 这个Love肯定不是男女之间的Love, 我们拿到的是一个客户的需求,他的上下文是什么? 比如说:“这个球打的好”, 如果是在打篮球,肯定说的事篮球,如果是在打乒乓球肯定说的是乒乓球。 而领域驱动设计里我们可以让业务人员更多的参与系统,更早的参与系统。

统一语言(Ubiquitous Language)

业务人员和我们使用一样的语言,我们的程序比如让业务尽量集中在领域里,比如在传统的数据驱动里,如果说Jack爱Rose, 我们一般会这么写

C# UserService.Love(Jack, Rose)

但是我们业务人员很奇怪谁Love谁? 为什么要UserService?, 如果我们写成下面这样

Jack.Love(Rose)

还有如果我们用

Company.hire(employee)

来代替

companyservice.hire(company,employee)

这样我们就更容易让业务人员参与进来,而且代码可以更易于表示真实的业务场景。


出处:http://www.cnblogs.com/cnblogsfans

为何要领域驱动设计?相关推荐

  1. DDD领域驱动设计之聚合、实体、值对象

    关于具体需求,请看前面的博文:DDD领域驱动设计实践篇之如何提取模型,下面是具体的实体.聚合.值对象的代码,不想多说什么是实体.聚合等概念,相信理论的东西大家已经知晓了.本人对DDD表示好奇,没有在真 ...

  2. 领域驱动设计_软件核心复杂性应对之道

    领域驱动设计_软件核心复杂性应对之道 转载于:https://www.cnblogs.com/MarvinGeng/archive/2013/02/21/2920968.html

  3. 领域驱动设计 敏捷_反馈失败:发现敏捷数据驱动的致命弱点的风险

    领域驱动设计 敏捷 by Phil Seaton 菲尔·西顿(Phil Seaton) 反馈失败:发现敏捷数据驱动的致命弱点的风险 (Feedback fail: discover the risk ...

  4. 领域驱动设计(DDD)架构演进和DDD的几种典型架构介绍(图文详解)

    我们生活中都听说了DDD,也了解了DDD,那么怎么将一个新项目从头开始按照DDD的过程进行划分与架构设计呢? 一.专业术语 各种服务 IAAS:基础设施服务,Infrastructure-as-a-s ...

  5. DDD领域驱动设计 — 贫血模型与充血模型

    文章转载来源:https://juejin.cn/post/6917125801460629518 | 前言  要想深入掌握和了解 DDD 领域驱动设计的核心,那无论如何也绕不开两大较为抽象的概念-- ...

  6. 一文理解 DDD 领域驱动设计!

    来源丨SpringForAll社区 2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity in the Heart of Softwa ...

  7. DDD 领域驱动设计:贫血模型、充血模型的深入解读!

    作者:JavaEdge在掘金 链接:https://juejin.cn/post/6917125801460629518 -     前言     - 要想深入掌握和了解 DDD 领域驱动设计的核心, ...

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

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

  9. 领域驱动设计,为何死灰复燃?

    作者简介 张逸,曾先后就职于中兴通讯.惠普 GDCC.中软国际.ThoughtWorks 等大型中外企业,任职角色为高级软件工程师.架构师.技术总监.首席咨询师. 一.领域驱动设计为何又死灰复燃焕发青 ...

  10. 领域驱动设计门槛很高,没有深厚的面向对象编码能力很难实践成功

    时间是人类最宝贵的资源.时间是有限的.不可再生的,你可以用钱买任何东西,却买不了时间.技术,就像时尚,在以光速在变化着.为了赶上它,我们需要跑的非常快.但是这个跑道上没有终点,所以没有赢家. 将你的黄 ...

最新文章

  1. 放授权代码的php文件夹,自己的项目如果包含别人的开源代码,licence文件应放在哪里...
  2. 一个虐你千百遍的问题:“RPC好,还是RESTful好?”
  3. 防止用户将表单重复提交的方法
  4. axios post传递对象_axios的post传参时,将参数转为form表单格式
  5. python数据类型汇总_python基础数据类型汇总
  6. 框架源码专题:Spring的事件监听、发布机制 ApplicationListener
  7. ssis 表达式任务_SSIS表达式任务与将变量作为表达式求值
  8. linux装软raid,LINUX中软RAID的实现方案
  9. Linux命令学习总结(超详细)
  10. 美化传奇NPC对话框添加图片显示实列
  11. vue3:兄弟组件,跨组件传值,事件总线的通信方式(mitt / tiny-emitter)
  12. Android 使用 Scroller 实现平滑滚动
  13. php微信公众号报警,微信报警函数定义与用法汇总
  14. 学画画软件app推荐_可以学画画的APP有哪些?
  15. python-matplotlib-数据可视化-导入shp矢量数据并显示成图
  16. 编写训练一年级学生10以内减法的程序
  17. 云计算前景如何?大专学历学习云计算怎么样?
  18. PowerPoint ppt 触发器 自定义动画 视频 音频 播放 停止
  19. 计算机专业主要学什么?
  20. 华为云-文字识别OCR-身份证识别

热门文章

  1. C语言判断树是否为求和树(附完整源码)
  2. OpenGL 平行粒子的实例
  3. OpenGL延迟着色之二
  4. C++实现顺序查找(附完整源码)
  5. python表头写进csv文件_Python读取CSV文件列并在CSV-fi中写入文件名和列名
  6. oracle 0值处理判断,ORACLE数据统计0的处理
  7. 02_clickhouse安装,卸载,启动/关闭服务,交互式命令(数据库创建,数据导入,查询),批模式数据导入,MySQL接口操作ClickHouse,DBeaver可视化工具安装与使用(学习笔记)
  8. 6、HIVE JDBC开发、UDF、体系结构、Thrift服务器、Driver、元数据库Metastore、数据库连接模式、单/多用户模式、远程服务模式、Hive技术原理解析、优化等(整理的笔记)
  9. Linux RedHat下安装eclipse-standard-kepler-SR1-linux-gtk.tar.gz
  10. Oracle数据处理