这几天刚开始学习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. C#中如何给Excel添加水印

    我们知道Microsoft Excel并没有内置的功能直接给Excel表添加水印,但是其实我们可以用其他变通的方式来解决此问题,如通过添加页眉图片或艺术字的方法来模仿水印的外观.所以在这篇文章中,我将 ...

  2. WebGIS中等值线前端生成绘制简析

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 等值线是GIS制图中常见的功能,一般有两种思路:一种是先进行插 ...

  3. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  4. 微信小程序开发—快速掌握组件及API的方法

    微信小程序框架为开发者提供了一系列的组件和API接口. 组件主要完成小程序的视图部分,例如文字.图片显示.API主要完成逻辑功能,例如网络请求.数据存储.音视频播放控制,以及微信开放的微信登录.微信支 ...

  5. css_02之盒模型、渐变

    1.框模型:盒模型,①对象实际宽度=左右外边距+左右边框+左右内边距 + width:②对象实际高度=上下外边距+上下边框+上下内边距 + height: 2.外边距:margin:取值:①top(上 ...

  6. vim环境变量配置、背景色配置

    我们使用vi或者vim的时候,如果想要显示行号,可能会这样做:切换到命令模式,然后输入set nu,再按回车键就显示了:还有就是咱们在编写程序的时候,有的时候会希望按下回车键后,光标不是每次都在行首, ...

  7. x01.os.23: 制作 linux LiveCD

    1.首先运行如下命令  sudo apt-get install wget bc build-essential gawk genisoimage 2.下载如下资源,make all 即可 http: ...

  8. SSD框架训练自己的数据集

    SSD demo中详细介绍了如何在VOC数据集上使用SSD进行物体检测的训练和验证.本文介绍如何使用SSD实现对自己数据集的训练和验证过程,内容包括: 1 数据集的标注2 数据集的转换3 使用SSD如 ...

  9. 我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗

    文章背景,回答提问:我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗? 我的建议是这样:1. 不要辞职.首先说,你对整个开发没有一个简单的了解,或一个系统的入门学习.换句 ...

  10. .NET应用程序与数据库交互的若干问题

    我们知道,在应用程序中与数据库进行交互是一个比较耗时的过程,首先应用程序需要与应用程序建立连接,然后将请求发送到数据库,数据库执行操作,然后将结果集返回.所以在程序中,要尽量晚的与数据库建立连接,并且 ...