文档章节

静下心来,想想为什么领域模型对于架构师如此重要?(学习笔记)

ND小龙
 ND小龙
发布于 2017/09/08 22:20
字数 1143
阅读 39
收藏 0
点赞 0
评论 0

做任何一个软件系统,都是有原因的,都是要解决特定的问题。

通过问题,我们就知道了我们需要一个什么样的系统,这个系统解决了什么样的问题。

 

两个概念:

“问题空间(Problem Space)”和“解决方案空间(Solution Space)”

 

问题空间,就是当前环境下业务所面临的一系列问题和背后的需求,它属于产品规划阶段,通常是业务或产品领域专家主导进行问题需求收集描述和分析。

 

解决方案空间,则是针对问题空间的解决方案,它思考的是如何设计实现软件系统以解决这些问题,它属于工程设计实施阶段,通常是技术专家主导的解决方案设计和实现。

 

 

在问题空间里,主要是找出某个业务面临的挑战及其相关需求场景用例分析,而解决方案空间里,则通过具体的技术工具手段来进行设计实现。互联网软件从业人员容易理解的一个映射转化过程。

 

两个概念:

领域(Domain) 和 领域模型(Domain Model)也叫业务对象模型

 

“领域”相对于软件系统来说,就是系统要解决的现实问题。因此也可以简单理解一个领域就对应一个问题空间,是一个特定范围边界内的业务需求的总和。

 

“领域模型”则是针对特定领域里的关键事物及其关系的可视化表现。它属于“解决方案空间”,是为了准确定义需要解决问题而构造的抽象模型,为软件系统的构建目标统一认知,是业务功能场景在软件系统里的映射转化。

 

领域模型驱动设计(DDD:Domain-Driven Design

 

经典分层架构

 

  • 将领域模型相关的代码集中到一个层中,把它从用户界面、应用和基础设施代码中分隔开来
  • 释放领域对象的显示自己、保存自己、管理应用任务等职责,让它专注于展现领域模型
  • 复杂的程序切分成层
  • 层中采用内聚的设计
  • 层仅依赖于它底下的那层

 

架构概述

 

详细架构

  • 实体(Entity)
  • 实体就是领域中需要唯一标识的领域概念。实体有生命周期,实体从被创建后可能会被持久化到数据库。

  • 值对象(Value Object)

    在领域中,并不是没一个事物都必须有一个唯一标识,也就是说我们不关心对象是哪个,而只关心对象是什么。

  • 领域服务(Domain Service)

    领域服务是以动词开头来命名的,需要强调的是领域服务是无状态的,它存在的意义就是协调领域对象共完成某个操作,所有的状态还是都保存在相应的领域对象中。

    领域服务可以避免领域逻辑泄露到应用层。引入领域服务可以有效的防治领域层的逻辑泄露到应用层,通过调用领域服务提供的简单易懂但意义明确的接口。

  • 模块
  • 聚合
  • 工厂(Factory)

    DDD中的工厂也是一种体现封装思想的模式。DDD中引入工厂模式的原因是:有时创建一个领域对象是一件比较复杂的事情,不仅仅是简单的new操作。客户传递给工厂一些简单的参数,然后工厂可以在内部创建出一个复杂的领域对象然后返回给客户,简单的调用领域工厂创建出期望的对象。

  • 资源库 或 仓储(Repository)

    仓储分为仓储定义部分和仓储实现部分,在领域模型中定义仓储的接口,从某个类似集合的地方根据某个条件获取一个或一些对象。根据项目中查询的灵活度要求来选择适合的仓储查询接口设计。

 

 

 

 

 

 

 

思考总结

领域建模不是面向技术的一种纯软件设计方法,它是一种思维方式,我们采用它来搭建领域模型。

它体现了系统的核心价值,及能解决的问题及解决的程度。

本文转载自:http://blog.csdn.net/johnstrive/article/details/16805121

共有 人打赏支持
ND小龙
粉丝 10
博文 45
码字总数 2295
作品 0
福州
如何学习Ruby

提示:本文是学习方法论,不喜勿看。 我是从06年底开始关注Ruby的,07年的时候投入到了Ruby的开发中,并持续到今天。我从毕业到现在,除了Ruby还使用过VB、Java、JavaScript, 大学里也学过C...

blackanger ⋅ 2013/12/10 ⋅ 0

如何学好oracle课程

oracle的体系太庞大了,对于初学者来说,难免会有些无从下手的感觉,什么都想学,结果什么都学不好,所以把学习经验共享一下,希望让刚刚入门的人对oracle有一个总体的认识,少走一些弯路。 ...

slence ⋅ 2011/09/03 ⋅ 0

Leslie G. Valiant获得2010年图灵奖

因其在计算学习理论及广泛的计算机科学领域里作出的重大贡献,Leslie G. Valiant获得2010年ACM图灵奖。Valiant教授目前在哈佛大学工程与应用科学学院教授计算机科学和应用数学的课程。他在过...

二胡 ⋅ 2011/03/21 ⋅ 1

《我们应当怎样做需求分析》阅读笔记

原文链接(转载请注明出处):如何做好需求分析 这学期的《软件需求与分析》课可以说是软件工程专业比较重要的一门课。如何做好软件需求分析就等同于如何做好一个项目。客户对需求一改再改,...

dmego ⋅ 2017/09/29 ⋅ 0

如何开始机器学习,从TensorFlow开始

摘要:对于大多数组织来说,机器学习仍然是一个白日梦,Gartner估计,只有不到15%的企业成功地将机器学习投入生产。像TensorFlow这样的开源项目可以极大地提高企业机器学习成功的机会。“Ten...

云技术实践 ⋅ 2017/12/22 ⋅ 0

软件开发杂谈 001

1. 软件架构设计可以基于数据库的模型设计也可以基于领域模型设计。对于业务系统来说,如果他的核心是数据处理和分析,而且数据量很大可以在架构设计时采用基于数据库建模的方式,对于一些中...

青夜之衫 ⋅ 2017/12/05 ⋅ 0

IT人的学习方法论-4 一些重要的能力

/*---------------------------------------- 本系列共7篇文章,目前已经完成如下内容: IT人的学习方法论-1,讨论学习的方向 IT人的学习方法论-2,讨论学习的误区 IT人的学习方法论-3,讨论...

yongyu2000 ⋅ 2009/10/12 ⋅ 0

一路孤独走来

我 从很小的时候,就是一个孤独的人,安安静静的学习,安安静静的看电视,安安静静的想着很多事,我想到我的同学问我:“你数学怎么总考那么高的成绩?”我想到在学校里我少有的娱乐就是做数...

big_c_god ⋅ 2017/06/22 ⋅ 0

程序员 30 岁前,该如何规划自己的职业发展?

1.为什么职业规划很重要? 在回答这个问题之前,我得先给大家解释下为什么职业规划很重要,我就简单的举个例子,我想大部分人职业生涯的初期,跳槽、换工作大都是为了薪资,哪个方向赚的多,...

野梦M ⋅ 2017/11/24 ⋅ 0

程序员 30 岁前,该如何规划自己的职业发展?

有读者问我职业规划这个话题,姑且今天好好谈谈,因为我一直认为这个话题对职场工作人士非常重要,今天我就来聊聊程序员的职业规划。 1.为什么职业规划很重要? 在回答这个问题之前,我得先给...

stormzhangV ⋅ 2017/11/23 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

C++内存映射文件居然是这样?!

内存映射文件大家都时不时听过,但它到底是个什么?赶紧来看看吧 内存映射文件到底是干嘛的呢?让我们先来思考下面几个问题: 如果您想读的内容大于系统分配的内存块怎么办?如果您想搜索的字...

柳猫 ⋅ 27分钟前 ⋅ 0

MySQL 数据库设计总结

规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎。 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的所有字段的长度之和不能超过1000字节...

OSC_cnhwTY ⋅ 今天 ⋅ 0

多线程(四)

线程池和Exector框架 什么是线程池? 降低资源的消耗 提高响应速度,任务:T1创建线程时间,T2任务执行时间,T3线程销毁时间,线程池没有或者减少T1和T3 提高线程的可管理性。 线程池要做些什...

这很耳东先生 ⋅ 今天 ⋅ 0

使用SpringMVC的@Validated注解验证

1、SpringMVC验证@Validated的使用 第一步:编写国际化消息资源文件 编写国际化消息资源ValidatedMessage.properties文件主要是用来显示错误的消息定制 [java] view plain copy edit.userna...

瑟青豆 ⋅ 今天 ⋅ 0

19.压缩工具gzip bzip2 xz

6月22日任务 6.1 压缩打包介绍 6.2 gzip压缩工具 6.3 bzip2压缩工具 6.4 xz压缩工具 6.1 压缩打包介绍: linux中常见的一些压缩文件 .zip .gz .bz2 .xz .tar .gz .tar .bz2 .tar.xz 建立一些文...

王鑫linux ⋅ 今天 ⋅ 0

6. Shell 函数 和 定向输出

Shell 常用函数 简洁:目前没怎么在Shell 脚本中使用过函数,哈哈,不过,以后可能会用。就像java8的函数式编程,以后获取会用吧,行吧,那咱们简单的看一下具体的使用 Shell函数格式 linux ...

AHUSKY ⋅ 今天 ⋅ 0

单片机软件定时器

之前写了一个软件定时器,发现不够优化,和友好,现在重写了 soft_timer.h #ifndef _SOFT_TIMER_H_#define _SOFT_TIMER_H_#include "sys.h"typedef void (*timer_callback_function)(vo...

猎人嘻嘻哈哈的 ⋅ 今天 ⋅ 0

好的资料搜说引擎

鸠摩搜书 简介:鸠摩搜书是一个电子书搜索引擎。它汇集了多个网盘和电子书平台的资源,真所谓大而全。而且它还支持筛选txt,pdf,mobi,epub、azw3格式文件。还显示来自不同网站的资源。对了,...

乔三爷 ⋅ 今天 ⋅ 0

Debian下安装PostgreSQL的表分区插件pg_pathman

先安装基础的编译环境 apt-get install build-essential libssl1.0-dev libkrb5-dev 将pg的bin目录加入环境变量,主要是要使用 pg_config export PATH=$PATH:/usr/lib/postgresql/10/bin 进......

玛雅牛 ⋅ 今天 ⋅ 0

inno安装

#define MyAppName "HoldChipEngin" #define MyAppVersion "1.0" #define MyAppPublisher "Hold Chip, Inc." #define MyAppURL "http://www.holdchip.com/" #define MyAppExeName "HoldChipE......

backtrackx ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部