初学DDD-领域驱动设计
这几天刚开始学习DDD,看了几篇大神的文章,现在只是知道了几个名词,还没有详细的学习。结合自己的工作经历,说说自己的看法,请各位大神多多指点。
最开始用的比较多的是以数据库表建立模型驱动开发。后来发现这种开发方式有很大的弊端:项目开始的时候,对业务分析不够明确,就开始建立数据库表,之后根据建好的表,来设计怎么去实现功能。这就导致开发过程中,经常会有字段冗余,表结构混乱,分工不明确,相似代码太多等问题。接着就会在项目开始之前,有意识的分析业务逻辑,理清楚一个项目的功能模块,拆分不同模块,对每个模块再次详细分析,看都需要哪些实体,这些实体之间都有哪些联系,对实体都有哪些操作,等等。那个时候还没有接触到DDD,只是知道开发之前需要详细设计,分析不同对象的关系和业务过程。这样一两年之后,开发效率比之前忙着开发快了很多。这几天从公司一位大师那里听到了DDD的概念,就来学习一下。
DDD(Domain Driven Design)领域驱动设计,是一种业务设计思想。设计前期确认业务边界,划分功能模块,确认不同模块之间的关系和联系,以及交互方式,每个模块可以当做是一个领域来看。如果领域复杂,继续拆分成多个子域。后期确认业务实体的行为、属性,以及多个实体之间的联系。
驱动有两层含义:问题域驱动领域建模,领域建模驱动软件实现。(引自汤雪华大大的文章http://www.cnblogs.com/netfocus/archive/2011/01/17/1937779.html)
问题域驱动领域建模,主要是从功能模块、流程、和实现目标分析业务,不涉及具体的实体。业务分析好之后,实体一般是比较明确的,这个时候再编码实现,就会少走很多弯路。
领域的边界是服务,服务是对外的唯一入口,向外界反应业务领域实现的功能,和可以调用的接口。实体对象是业务领域内一个独立的具有一定自主能力的生命体,是业务领域内部的运行机制,不对外开放。体现领域的高内聚和不同领域直接的低耦合。
聚合:是一个域中的一个实体对象。
聚合根:可以和外部直接交互的实体。一个聚合根可以只有一个实体,也可以是包含多个实体属性的实体。
例如:一个订单对象,包含了 订单金额、收件人对象、订单商品明细 等属性信息,收件人对象包含了 姓名、联系电话、地址等,订单商品明细包含了多个商品信息。这个订单对象是和外部直接交互的对象,缺少了订单对象,收件人、订单商品明细 都没有实际意义。如果需要访问订单的收件人,则需要通过订单对象来访问。这个时候,这个订单对象就是一个聚合根,收件人、订单商品明细 则是聚合。
关于业务,包括了我们对一件事的处理过程和处理过程中涉及的实体对象,以及对象之间的关系。设计业务的过程,类似模拟人民处理事情的过程,也包括不同实体的关系,面向过程和关系的味道也比较重。
再说下充血模型和三层架构的贫血模型的对比吧,BLL 层的业务处理方法,相当于创建一个工厂里面,处理原材料或者半成品的处理部件,不同方法之间的调用,相当于传送带一样传递产品。DDD相当于创建了一个机器人,它包含了一些属性,和不同的功能,可以处理不同的任务。这就是贫血模型和充血模型的区别:贫血模型只是包含了一些属性,只能被动的被处理,传递;充血模型包含了属性和方法,可以主动的处理一些任务。
表达能力有限,还是举例来说吧。
一个业务场景:建造一个小区,首先是跟进地的大小、周围环境设计出可以建多少座楼,每座楼的占地面积,每层几户,每户多大,楼高,楼间距是多少,绿化面积、分布,等等,之后才是设计楼的外形,房间的户型,电梯位置等等具体的实体。
这个场景中,分析业务的流程,就是设计小区的过程,问题域是“如何建造一个小区”,服务是小区的几个大门,外界只有通过大门才能进入小区,一个聚合根是这个小区,它聚合了多个楼和停车场等实体,每座楼聚合了多个房间和电梯等。分析之后的实现,就是设计外形、户型,并建造的过程。
写的不好,也很少写东西,希望各位大神多多指点。
初学DDD-领域驱动设计的更多相关文章
- 浅谈我对DDD领域驱动设计的理解
从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能够在线上也能销售自己的产品 ...
- DDD 领域驱动设计-商品建模之路
最近在做电商业务中,有关商品业务改版的一些东西,后端的架构设计采用现在很流行的微服务,有关微服务的简单概念: 微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务可被独 ...
- DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(3)
上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext 的实践(2)> 这篇文章主要是对 DDD.Sample 框架增加 Transa ...
- DDD 领域驱动设计-两个实体的碰撞火花
上一篇:<DDD 领域驱动设计-领域模型中的用户设计?> 开源地址:https://github.com/yuezhongxin/CNBlogs.Apply.Sample(代码已更新) 在 ...
- DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(2)
上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext 的实践(1)> 阅读目录: 抽离 IRepository 并改造 Reposi ...
- DDD 领域驱动设计-领域模型中的用户设计
上一篇:<DDD 领域驱动设计-如何控制业务流程?> 开源地址:https://github.com/yuezhongxin/CNBlogs.Apply.Sample(代码已更新,并增加了 ...
- DDD 领域驱动设计-如何控制业务流程?
上一篇:<DDD 领域驱动设计-如何完善 Domain Model(领域模型)?> 开源地址:https://github.com/yuezhongxin/CNBlogs.Apply.Sa ...
- DDD 领域驱动设计-如何完善 Domain Model(领域模型)?
上一篇:<DDD 领域驱动设计-如何 DDD?> 开源地址:https://github.com/yuezhongxin/CNBlogs.Apply.Sample(代码已更新) 阅读目录: ...
- DDD领域驱动设计之领域服务
1.DDD领域驱动设计实践篇之如何提取模型 2.DDD领域驱动设计之聚合.实体.值对象 3.DDD领域驱动设计之领域基础设施层 什么是领域服务,DDD书中是说,有些类或者方法,放实体A也不好,放实体B ...
- DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(1)
好久没写 DDD 领域驱动设计相关的文章了,嘎嘎!!! 这几天在开发一个新的项目,虽然不是基于领域驱动设计的,但我想把 DDD 架构设计的一些东西运用在上面,但发现了很多问题,这些在之前的短消息项目中 ...
随机推荐
- 【项目管理】GitHub使用操作指南
GitHub使用操作指南 作者:白宁超 2016年10月5日18:51:03> 摘要:GitHub的是版本控制和协作代码托管平台,它可以让你和其他人的项目从任何地方合作.相对于CVS和SVN的联 ...
- C++随笔:.NET CoreCLR之GC探索(3)
有几天没写GC相关的文章了哈,今天我讲GC的方式是通过一个小的Sample来讲解,这个小的示例代码只有全部Build成功了才会有.地址为D:\coreclr2\coreclr\bin\obj\Wind ...
- C++随笔:.NET CoreCLR之corleCLR核心探索之coreconsole(2)
这篇文章是上篇的续集,本文将会继续介绍coreconsole.cpp里面的逻辑.也许大家会看一些CLR的书,我承认我没有看过,因为我觉得一个人,他再NB,那也是他自己的眼光,而且说句难听的,CLR也不 ...
- 【uwp】浅谈China Daily 中划词翻译的实现
学习uwp开发也有一段时间了,最近上架了一个小应用(China Daily),现在准备将开发中所学到的一些东西拿出来跟大家分享交流一下. 先给出应用的下载链接:China Daily , 感兴趣的童鞋 ...
- Java实现Excel中的NORMSDIST函数和NORMSINV函数
由于工作中需要将Excel中的此两种函数转换成java函数,从而计算内部评级的资本占用率和资本占用金额.经过多方查阅资料和整理,总结出如下两个转换方法 标准正态分布累计函数NORMSDIST: pub ...
- JavaScript求两个数字之间所有数字的和
这是在fcc上的中级算法中的第一题,拉出来的原因并不是因为有什么好说的,而是我刚看时以为是求两个数字的和, 很显然错了.我感觉自己的文字理解能力被严重鄙视了- -.故拉出来折腾折腾. 要求: 给你一个 ...
- Node.js学习笔记——Node.js开发Web后台服务
一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...
- 关于Java中进程和线程的详解
一.进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命 周期.它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而 ...
- height:100% 布局
常常会碰到需要填满整个浏览器,并且自适应高度的需求.首先肯定会想到给容器设定height:100%,但是会没有效果.原因是body没有高度,所以百分比无法生效. 解决方案:给html,body,标签都 ...
- WPF - 属性系统 (4 of 4)
依赖项属性的重写 在基于C#的编程中,对属性的重写常常是一种行之有效的解决方案:在基类所提供的属性访问符实现不能满足当前要求的时候,我们就需要重新定义属性的访问符. 但对于依赖项属性而言,属性执行逻辑 ...