这几天刚开始学习DDD,看了几篇大神的文章,现在只是知道了几个名词,还没有详细的学习。结合自己的工作经历,说说自己的看法,请各位大神多多指点。

  最开始用的比较多的是以数据库表建立模型驱动开发。后来发现这种开发方式有很大的弊端:项目开始的时候,对业务分析不够明确,就开始建立数据库表,之后根据建好的表,来设计怎么去实现功能。这就导致开发过程中,经常会有字段冗余,表结构混乱,分工不明确,相似代码太多等问题。接着就会在项目开始之前,有意识的分析业务逻辑,理清楚一个项目的功能模块,拆分不同模块,对每个模块再次详细分析,看都需要哪些实体,这些实体之间都有哪些联系,对实体都有哪些操作,等等。那个时候还没有接触到DDD,只是知道开发之前需要详细设计,分析不同对象的关系和业务过程。这样一两年之后,开发效率比之前忙着开发快了很多。这几天从公司一位大师那里听到了DDD的概念,就来学习一下。

  DDD(Domain Driven Design)领域驱动设计,是一种业务设计思想。设计前期确认业务边界,划分功能模块,确认不同模块之间的关系和联系,以及交互方式,每个模块可以当做是一个领域来看。如果领域复杂,继续拆分成多个子域。后期确认业务实体的行为、属性,以及多个实体之间的联系。

  驱动有两层含义:问题域驱动领域建模,领域建模驱动软件实现。(引自汤雪华大大的文章http://www.cnblogs.com/netfocus/archive/2011/01/17/1937779.html)

  问题域驱动领域建模,主要是从功能模块、流程、和实现目标分析业务,不涉及具体的实体。业务分析好之后,实体一般是比较明确的,这个时候再编码实现,就会少走很多弯路。

  领域的边界是服务,服务是对外的唯一入口,向外界反应业务领域实现的功能,和可以调用的接口。实体对象是业务领域内一个独立的具有一定自主能力的生命体,是业务领域内部的运行机制,不对外开放。体现领域的高内聚和不同领域直接的低耦合。

  聚合:是一个域中的一个实体对象。

  聚合根:可以和外部直接交互的实体。一个聚合根可以只有一个实体,也可以是包含多个实体属性的实体。

  例如:一个订单对象,包含了  订单金额、收件人对象、订单商品明细  等属性信息,收件人对象包含了  姓名、联系电话、地址等,订单商品明细包含了多个商品信息。这个订单对象是和外部直接交互的对象,缺少了订单对象,收件人、订单商品明细 都没有实际意义。如果需要访问订单的收件人,则需要通过订单对象来访问。这个时候,这个订单对象就是一个聚合根,收件人、订单商品明细 则是聚合。

  关于业务,包括了我们对一件事的处理过程和处理过程中涉及的实体对象,以及对象之间的关系。设计业务的过程,类似模拟人民处理事情的过程,也包括不同实体的关系,面向过程和关系的味道也比较重。

  再说下充血模型和三层架构的贫血模型的对比吧,BLL 层的业务处理方法,相当于创建一个工厂里面,处理原材料或者半成品的处理部件,不同方法之间的调用,相当于传送带一样传递产品。DDD相当于创建了一个机器人,它包含了一些属性,和不同的功能,可以处理不同的任务。这就是贫血模型和充血模型的区别:贫血模型只是包含了一些属性,只能被动的被处理,传递;充血模型包含了属性和方法,可以主动的处理一些任务。

  表达能力有限,还是举例来说吧。

  一个业务场景:建造一个小区,首先是跟进地的大小、周围环境设计出可以建多少座楼,每座楼的占地面积,每层几户,每户多大,楼高,楼间距是多少,绿化面积、分布,等等,之后才是设计楼的外形,房间的户型,电梯位置等等具体的实体。

  这个场景中,分析业务的流程,就是设计小区的过程,问题域是“如何建造一个小区”,服务是小区的几个大门,外界只有通过大门才能进入小区,一个聚合根是这个小区,它聚合了多个楼和停车场等实体,每座楼聚合了多个房间和电梯等。分析之后的实现,就是设计外形、户型,并建造的过程。

  写的不好,也很少写东西,希望各位大神多多指点。

初学DDD-领域驱动设计的更多相关文章

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

    从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能够在线上也能销售自己的产品 ...

  2. DDD 领域驱动设计-商品建模之路

    最近在做电商业务中,有关商品业务改版的一些东西,后端的架构设计采用现在很流行的微服务,有关微服务的简单概念: 微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务可被独 ...

  3. DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(3)

    上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext 的实践(2)> 这篇文章主要是对 DDD.Sample 框架增加 Transa ...

  4. DDD 领域驱动设计-两个实体的碰撞火花

    上一篇:<DDD 领域驱动设计-领域模型中的用户设计?> 开源地址:https://github.com/yuezhongxin/CNBlogs.Apply.Sample(代码已更新) 在 ...

  5. DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(2)

    上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext 的实践(1)> 阅读目录: 抽离 IRepository 并改造 Reposi ...

  6. DDD 领域驱动设计-领域模型中的用户设计

    上一篇:<DDD 领域驱动设计-如何控制业务流程?> 开源地址:https://github.com/yuezhongxin/CNBlogs.Apply.Sample(代码已更新,并增加了 ...

  7. DDD 领域驱动设计-如何控制业务流程?

    上一篇:<DDD 领域驱动设计-如何完善 Domain Model(领域模型)?> 开源地址:https://github.com/yuezhongxin/CNBlogs.Apply.Sa ...

  8. DDD 领域驱动设计-如何完善 Domain Model(领域模型)?

    上一篇:<DDD 领域驱动设计-如何 DDD?> 开源地址:https://github.com/yuezhongxin/CNBlogs.Apply.Sample(代码已更新) 阅读目录: ...

  9. DDD领域驱动设计之领域服务

    1.DDD领域驱动设计实践篇之如何提取模型 2.DDD领域驱动设计之聚合.实体.值对象 3.DDD领域驱动设计之领域基础设施层 什么是领域服务,DDD书中是说,有些类或者方法,放实体A也不好,放实体B ...

  10. DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(1)

    好久没写 DDD 领域驱动设计相关的文章了,嘎嘎!!! 这几天在开发一个新的项目,虽然不是基于领域驱动设计的,但我想把 DDD 架构设计的一些东西运用在上面,但发现了很多问题,这些在之前的短消息项目中 ...

随机推荐

  1. Java 时间类-Calendar、Date、LocalDate/LocalTime

    1.Date 类 java.util.Date是一个"万能接口",它包含日期.时间,还有毫秒数,如果你只想用java.util.Date存储日期,或者只存储时间,那么,只有你知道哪 ...

  2. 在Visual Studio Code中配置GO开发环境

    一.GO语言安装 详情查看:GO语言下载.安装.配置 二.GoLang插件介绍 对于Visual Studio Code开发工具,有一款优秀的GoLang插件,它的主页为:https://github ...

  3. winform 窗体圆角设计

    网上看到的很多winform窗体圆角设计代码都比较累赘,这里分享一个少量代码就可以实现的圆角.主要运用了System.Drawing.Drawing2D. 效果图 代码如下. private void ...

  4. NV显卡Ubuntu14.04更新软件导致登录死循环,不过可以进入tty模式

    注意:此方法只适用于nv显卡的电脑! 在网上寻找各种方法无果的情况下,选择重新安装显卡驱动,成功登录进入图形界面. 一.首先需要在另外一台电脑(windows系统也可以)上下载NVIDIA相应显卡驱动 ...

  5. 简单Linux命令学习笔记

    1.查看进程 ps -ef | grep 关键字       /*关键字为服务名*/ netstat -unltp | grep 关键字        /*关键字为服务名或者是端口均可*/ 2.杀死进 ...

  6. centos6.X使用Apache+Mono搭建asp.net 环境

    mark 一下时间  2016年1月19日09:42:49 mono是指由Novell公司(由Xamarin发起,并由Miguel de lcaza领导的,一个致力于开创·NET在Linux上使用的开 ...

  7. Floyd-Warshall 全源最短路径算法

    Floyd-Warshall 算法采用动态规划方案来解决在一个有向图 G = (V, E) 上每对顶点间的最短路径问题,即全源最短路径问题(All-Pairs Shortest Paths Probl ...

  8. SSH隧道应用, 突破网络限制

    文/怡文圣美 这篇文章可以帮你解决下面三个问题: 不能直连服务器, 要先登陆跳板机, 造成客户端工具无法连接服务器. 服务器没有公网IP, 且只允许公司IP访问, 要在家里操作要先远程桌面到工作机再登 ...

  9. App开发的新趋势

    移动开发这些年,移动开发者人数越来越多,类似的培训公司发展也很快,不过伴随着的是移动应用的需求这几年发展更为旺盛.要开发好的App,纯原生开发肯定是最佳选择.但是这么多年发展,原生开发的难度并没有降低 ...

  10. 在 Linux 中使用搜狗拼音输入法以及搞定 Flash 和支付宝

    在 Ubuntu 中安装搜狗输入法 在 Ubuntu Kylin 系统中,默认安装搜狗拼音输入法,但是在原生 Ubuntu 系统中则不是.这可以理解,毕竟搜狗输入法的 Linux 版有 Kylin 团 ...