DDD领域模型

  官方说法

  领域驱动设计,它是对面向对象的的分析和设计(OOAD,Object Orient Analysis Design)的一个补充,对技术框架进行了分层规划,同时对每个类进行了策略和类型划分。领域模型是领域驱动的核心 ,采用DDD的设计思想,业务逻辑不再集中在几个大型的类上,而是在大量相对小的领域对象上,这些类具有自己的状态和行为,每个类都是完成的独立的,并与现实领域的业务对象形成一种映射。基于DDD的架构设计,保证了系统的可维护性,扩展性和敏捷性,在处理复杂业务逻辑方面有着明显的优势!

  以上是官方的说法:http://www.jdon.com/ddd.html

  个人理解

  传统的软件生产过程:分析,设计,编程,测试,部署。然而在真实的环境中,分析和设计时分开的,分析人员不需要了解设计,只需要知道设计-实现难度即可,而设计人员在接到分析的需求后,并不能很好的理解需求。而DDD就是抛弃了这种做法,在分析阶段,就将设计加入其中,给分析人员提出了更高的要求。

  DDD的弊端也十分明显,如果需求出现大范围改动,整个模型可能不再适合,这个时候吗,需要重新设计模型。给后期的维护带来更大的麻烦。 这也是

  DDD革命性在于:领域模型准确反映了业务语言,而传统的分层架构只关心数据, 这些数据对象除了简单读、写操作外,没有任何业务方法,被比喻成失血模型,那么领域模型这种带有业务方法的充血模型到底好在哪里?

  看到领域模型代码,就看到业务需求,没有翻译没有转换,保证软件真正实现“拷贝不走样”。

  DDD最大的好处是:接触到需求第一步就是考虑领域模型,而不是将其切割成数据和行为,然后数据用数据库实现, 行为使用服务实现,最后造成需求的首肢分离。DDD让你首先考虑的是业务语言,而不是数据。重点不同导致编程世界观不同。

  DDD的特点

  分层架构

  成熟、清晰的分层架构。

  领域对象与世界的业务映射。

  明确的职责划分。

  复用性

  领域对象是核心

  领域对象完美的描述了业务。

  设计基于领域对象,而不是数据库。

  适用对象

  具备复杂的业务逻辑的如软件

  对设计和开发人员要较高

  不适用普通的CRUD操作

  系统维护性和扩展性高

  DDD 的分层

  一般的系统设计是,一般分为三层:数据层,业务层,表现层,即MVC模式。

  DDD分层的方式发生了变化分成了:表现层,应用层,领域层,基础层。

  表现层也就是view层,这个无论怎么设计都不会丢。

  应用层:用来协助应用活动,不包含业务逻辑,不保存对象,只保存任务状态,相当于一个任务流。

  领域层:包含领域信息,包含绝大部分的业务,保留业务对象的状态,需要将业务对象交给持久化处理。

  基础层:可以理解为持久化,

  DDD中的几个核心对象

  Entites:包含业务逻辑的实体(domain)

  Factories:工厂类,用来生成对象

  Respositories:持久化,本身就是DAO

  Service:服务层,为Controller提供接口,负责领域对象的再次封装和业务流处理。

  模型中的Model

  在DDD模型中,一般分为三种模型,ViewModel,DomainModel,Model。

  ViewModel与UI数据对应

  DomainMode与领域业务模型对应,与业务关联。

  Model实体模型,与数据表对应。

  失血、贫血、充血、胀血模型

  失血模型:只有getter/setter方法,没有任何业务逻辑,也不包含任何的实体关系。

  优点:思路清晰,编写代码方便,所有业务都在service中。

  缺点:service过重,业务中出现大概率重复调用的情况。

  贫血模型:在这里Entity应该叫domain。简单来说,就是除了getter/setter方法外,兼任了组装实体的业务,并且保留实体之间的关系,或者说是实体之前的嵌套。依然是service–DAO–domain(entity)的层级关系。

  优点:各层级单向依赖,结构清楚,很容易编写,也容易维护。稳定。

  缺点:domain部分流转被封到了Service层,不够面向对象。Service也比较厚重。

  充血对象:充血模型是将DAO也挪到domain中,由domain去持久化对象。调用关系变成了service–domain–DAO。

  优点:很面向对象。Service很薄,

  缺点:DAO和domain双向依赖,存在很多问题。划分domain和service业务混杂,不同人员有不同理解。Service也需要调用domain的业务方法,相当于又封装了业务。

  胀血对象:取消Service层,只保留domain–DAO。

  优点:简化分层

  缺点:业务暴露太多给Web层。service的业务也被强行加入了domain,可能引发domain不稳定。

  四种模型中,失血和胀血模型,不应该被提倡,因为弊大于利。而贫血,充血这两种在技术上已经很成熟了。但是推荐使用贫血模型。因为充血模型中,DAO和domain双向依赖带来结构问题。而且在批量操作domain的结构,很不合理。推荐使用贫血模型,增加少量的业务在entity中。比如参数构造,getter/setter中加入少量的逻辑判断。编码优先级最高的是完成业务的同时,引起的BUG更少。至于是不是面

DDD领域模型和充血对象的更多相关文章

  1. DDD中的值对象如何用NHibernate进行映射

    原文:DDD中的值对象如何用NHibernate进行映射 <component/>是NHibernate中一个有趣的特性,即是用来映射DDD(Data-Display-Debuger)概念 ...

  2. DDD领域模型数据访问之对象(十一)

    在工程DDD.Domain中文件夹ModelPermission新建类:BAS_Object public partial class BAS_Obejct:AggreateRoot { //仓储接口 ...

  3. DDD领域模型之分配权限(十三)

    权限分配和权限查找. 在DDD.Domain工程中新建:BAS_PermissionAssign类 public partial class BAS_PermissionAssgin:Aggreate ...

  4. DDD领域模型数据访问权限之权限(十二)

    实现权限的领域对象:BAS_Permission public partial class BAS_Permission:AggreateRoot { private IRepository<B ...

  5. DDD领域模型数据访问权限之用户权限(十)

    BAS_PRService岗位和角色服务: public class BAS_PRService { //岗位 private IRepository<BAS_Post> ireposit ...

  6. DDD领域模型数据访问权限(九)

    权限分为:数据权限和功能权限 数据权限: 查询提供附加表达式的支持: //提供附加表达式的支持 List<TAggreateRoot> GetByCondition(Expression& ...

  7. DDD领域模型查询方法实现(八)

    在DDD.Domain工程文件夹Repository下创建RequestPage类: public class RequestPage { public RequestPage(int pagesiz ...

  8. DDD领域模型实现依赖注入(六)

    添加下订单的值对象: public partial class CustomerInfo:ValueObject { /// <summary> /// 下订单的值对象 /// </ ...

  9. DDD领域模型企业级系统(一)

    领域模型的基本构造块: 1.实体(Entity):有业务生命周期,使用标识进行跟踪. 2.值对象(Value Object):无业务生命周期,用来描述实体. 3.服务(Service):无状态的行为类 ...

随机推荐

  1. python的三种字符串格式化方法

    1.最方便的 print 'hello %s and %s' % ('df', 'another df') 但是,有时候,我们有很多的参数要进行格式化,这个时候,一个一个一一对应就有点麻烦了,于是就有 ...

  2. linux命令:压缩解压命令

    压缩解压命令:gzip 命令名称:gzip 命令英文原意:GNU zip 命令所在路径:/bin/gzip 执行权限:所有用户 语法:gzip 选项  [文件] 功能描述:压缩文件 压缩后文件格式:g ...

  3. #C++初学记录(sort函数)

    sort函数 前言:当进行贪心算法的学习时,需要用到sort函数,因为初学c++汇编语言,sort的具体用法没有深入学习,所以这里进行sort学习记录并只有基础用法并借用贪心算法题目的代码. 百度百科 ...

  4. ATG精准科技-前端面试题

    1.请写出以下结果 for(var i=0; i<10; i++){ setTimeout(function () { console.log(i) },10) } 结果:打印10次190解析: ...

  5. hdu5145 莫队算法

    这题说的是个了n个数字 然后 在L 和R 区间内的数字的排列有多少种方案, 这里我们通过 将 这n长度的字符串 分成sqrt(n) 块然后 一个属性 他们的l 属于 那个快  以这个为第一关键字 ,然 ...

  6. Java设计模式应用——组合模式

    组合模式实际上是一种树形数据结构.以windows目录系统举例,怎么样用java语言描述一个文件夹? 定义一个文件夹类,文件夹类中包含若干个子文件类和若干个文件类. 进一步抽象,把文件夹和文件都看做节 ...

  7. 由浅入深之Tensorflow(3)----数据读取之TFRecords

    转载自http://blog.csdn.net/u012759136/article/details/52232266 原文作者github地址 概述 关于Tensorflow读取数据,官网给出了三种 ...

  8. QQ群免IDKEY加群PHP源码

    加群链接需要idkey的,该源码自动解析idkey,实现免idkey加群. 该源码来自彩虹秒赞系统. 例如:api.yum6.cn/qqun.php?qun=463631294 <?php /* ...

  9. MySQL数据库----安装

    一.基础部分 1.数据库是什么 之前所学,数据要永久保存,比如用户注册的用户信息,都是保存于文件中,而文件只能存在于某一台机器上. 如果我们不考虑从文件中读取数据的效率问题,并且假设我们的程序所有的组 ...

  10. jpeg exif

    公司项目需要在jpeg图片里面添加exif信息,同事完成了这部分代码:但是有些手机兼容性有问题: libexif 地址:http://libexif.sourceforge.net/ 注意相关资料来之 ...