下面哪个不是构建领域模型的目的
用来搭建系统组织结构不是构建领域模型的目的
领域建模。 从领域模型开始,我们就开始了面向对象的分析和设计过程,可以说,领域模型是完成从需求分析到面向对象设计的一座桥梁。
顾名思义,就是显示最重要的业务概念和它们之间关系,是真实世界各个事物的表示(现实世界的可视化抽象字典)而不是软件中各构件的表示。(类:表示业务概念,通常只包含重要属性,少甚至不包含操作;关联、泛化:表达概念之间的关系)领域模型是描述业务领域(业务实体)的静态结构
理论派观点:
Domain Model是一个商业建模范畴概念,即使一个企业不开发软件,也具备其业务模型;
所有同行企业,其业务模型必定有非常大的共性和内在的规律性。
由行业内的各个企业的业务模型再向上抽象出整个行业的业务模型,这个模型称之为“领域模型”。
实战派观点:
领域模型是一个分析模型,帮助系统分析人员、用户认识现实业务的工具,描述的是业务中涉及到的实体及其相互之间的关系,它是需求分析的产物,与问题域相关。
是需求分析人员与用户交流的有力工具,是彼此交流的语言。
理论派
领域模型是一种特殊的业务模型,它分析范围是整个行业,抽象出行业里共性和内在规律性的业务,比业务模型更加抽象,它不属于软件开发范畴的概念,与软件开发无关。
实战派
领域模型是一种分析模型,在软件开发过程分析阶段用于分析如何满足系统功能性需求,属于软件开发范畴,在UML中主要使用类图来描述领域模型。
业务模型是业务建模的输出物,业务建模研究的对象是公司或者组织,业务建模属于软件开发过程中的初始阶段。
软件开发过程:业务建模、需求、分析、设计。
在软件开发过程中我们接触到的领域模型属于实战派。
从这个定义我们可以看出,领域模型有两个主要的作用:
发掘重要的业务领域概念
建立业务领域概念之间的关系
运用四色建模法进行领域分析
领域建模有很多种方法,对于同样的问题域使用不同的建模手段得到的模型可能也不尽相同。于是我们经常听到这样一个问题:
这听起来是个合理的质疑,但实际上却不是那么有道理。首先我们需要明白建模的目的是什么?如果仅仅是为了描画问题,那么并没有什么对错之分——仅仅是立场和角度的差别;而如果是为了企业业务系统而进行建模,那么这个问题应该变为:
我想用下面这个例子来简要的回答一下这个问题。
在开始分析和建模之前,我们需要知道企业业务系统的目的是什么;而企业业务系统的目的往往跟决策者或者管理的诉求相关。我们现在需要移情到一位管理者身上,看看他的诉求到底是什么。
现在假想你是一家在线电子书店的COO。某天,有一位顾客向你投诉,说他订购的书少了一本,并且价钱算错了,他多给了钱。在你承诺理赔之前,你需要核对一下这位顾客说的是否属实。那么这个时候你需要知道什么样的信息才能做出准确的判断呢?
简单来说,你需要知道这位顾客订购了哪些书籍,付了多少钱以及书店到底为这个顾客送了哪些书籍。不幸的是,由于科技不够发达,你无法直接驾驶时光机器回到从前去亲眼看看发生了哪些事。但幸运的是,你并不需要会这么做,你只需要看看这位顾客的订单,和网银的支付记录以及你们书店交给EMS的快递单存根,就应该知道这些信息了。
你找到了订单和EMS快递存根。发现这位顾客是在三天前订购的书,而你们在前天就已经将书邮寄出去了。并在订单上看到这位顾客一共订购了7本书,但是在EMS的快递存根上,并没有任何书籍的信息,只有地址、包裹号、邮费和重量什么的信息。这时候你觉得应该去询问一下配送部门,看看他们做了什么。
在配送部门你根据包裹号查到了那个包裹的信息,果然里面只有6本书。同时你在包裹部门发现了一张延期交货单。上面说明由于缺货,这位顾客另外一本书正在等待发货。
那么剩下的问题就是支付问题了,从网银的记录上看,客户不含邮费一共支付了132.5元。订单上显示的金额也是132.5,显然这位顾客并没有多付钱。
为了保证准确,你重新从网站上选了这7本书,想看看是否也会是这个价钱。但你却意外的发现,以供只需要128.3。仔细辨认后,你发现有一本图书现在是促销。那么现在的问题是,促销到底是什么时候开始的?
你到了市场部,市场部给了你一份近期促销计划。你发现那部书是昨天才开始促销的,也就是说在那位顾客在下单的时候,促销还没有开始。
这个时候,你觉得应该给你的顾客打一个电话致歉,商讨如何后续邮寄的问题,并向他说明促销的事情。
你是否觉得这个COO当得有点累呢?这当然是虚构的。但是从这故事里面我们看到什么呢?
我们对于事件的追溯可以通过对数据的追溯来完成。正如上面这个故事里,你无法回到从前去看看到底发生了什么,但是却可以在单据的基础上,一定程度的还原当时事情发生的场景。当我们把这些数据的足迹按照时间顺序排列起来,我们几乎可以清晰的推测出这个在过往的一段时间内到底发生了哪些事情。
那么为什么这些数据形成的链条能够成为帮助我们追溯业务的营运呢?
因为这些数据并不是随便挑选的。如果我们回顾一下你作为COO检查这个疏漏的过程,你首先选择了订单和EMS快递存根,换句话说,如果订单出现差错,或者EMS快递存根上说明你的确邮寄了7本书,那么这个疏漏的责任并不在你。所以这两个订单实际上是你这个企业法律责任的起点和终点。
当你确定这个疏漏的责任在你之后,你选择审查一些流程执行的结果,比如包裹存根。从而验证一些主要的业务流程执行的结果是否正确。换句话讲,这些数据是支撑你运营体系的关键流程的执行结果。
1.如果我付出一笔资金,那么我的权益是什么?
2.如果我收到一笔资金,那我的义务是什么?
而这些问题都需要业务系统捕捉到相应的足迹才能够回答。所以企业的业务系统主要的目的之一,就是记录这些足迹,并将这些足迹形成一条有效的追溯链。
而作为业务分析师的你,则应该知道哪些事件在运营上是需要追溯的,这些事件都留下了什么足迹。
这些足迹通常都具有一个有意思的特性,即它们都是时标性对象(moment-interval)。发现这些时标性对象就是建模的起点。对于这些时标性对象稍加整理,我们就得到了整个领域模型的骨干。
由于在***步中,我们就将管理和运营目标作为建模的出发点。因此,整套模型实际上是围绕这些“如何有效的追踪这些目标”而建立的,这样的模型可以保证模型支撑企业的运营。
有人提了一个很有意思的问题:为什么你会以一个看上去像极端情况的例子来说明这个建模方法?以我的经验来看,对于业务系统有两个东西是很重要的:1.可追溯性(traceability)和执行效率(efficiency)。这里的可追溯性是指责任的可追溯性(traceability of liability),而通常都是在一些不太好的事情发生之后,才需要对责任进行追溯。所以想一个相对负面的例子更容易帮助我们找到建模索需要解决的问题。
本篇所说的四色法与Peter Coad的四色法并不完全相同,不敢说是发展,仅仅是对Peter Ccoad四色的一种变化吧。
《函数响应式领域建模》pdf下载在线阅读全文,求百度网盘云资源
《函数响应式领域建模》百度网盘pdf最新全集下载:
链接:
?pwd=7n8p 提取码:7n8p
简介:传统的分布式应用不会切入微服务、快速数据及传感器网络的响应式世界。为了捕获这些应用的动态联系及依赖,我们需要使用另外一种方式来进行领域建模
阐述业务建模流程?2,从业务模型到系统模型需要做哪些工作
业务建模(Business Modeling)是以软件模型方式描述企业管理和业务所涉及的对象和要素、以及它们的属性、行为和彼此关系,业务建模强调以体系的方式来理解、设计和构架企业信息系统。
根据环境和需求的不同,业务建模工作可能有不同的规模。以下列出了六种这样的场景。
场景 #1 - 组织图
您可能需要构建组织及其流程的简图,以便更好地了解对正在构建的应用程序的需求。在这种情况下,业务建模就成了软件工程项目中的一部分,它主要是在先启阶段执行的。通常,这些工作在开始时仅仅是画出组织图,其目的并不是对组织进行变更。但实际上,构建和部署新的应用程序时往往会进行一定程度的业务改进。
场景 #2 - 领域建模
如果您构建应用程序时的主要目的是管理和提供信息(例如,订单管理系统或银行系统),那么您可能选择在业务级别上构建该信息的模型,而不考虑该业务的工作流程。这就称为领域建模。请参见工作流程明细:开发领域模型。通常,领域建模是软件工程项目的一部分,它是在项目的先启阶段和精化阶段中执行的。
场景 #3 - 单业务多系统
如果您正在构建一个大的系统(即一系列的应用程序),那么一个业务建模工作可能成为数个软件工程项目的输入。业务模型帮助您找出功能性需求,并且也作为构建应用程序系列构架的输入。详情请参见概念:从业务模型到系统。在这种情况下,通常将业务建模工作本身当做一个项目。
场景 #4 - 通用业务模型
如果您正在构建一个供多个组织使用的应用程序(例如,销售支持应用程序或结账应用程序)。一种有效的做法是:从头到尾进行一次业务建模工作,从而按这些组织的经营方式对它们进行调整,避免一些对于系统来说过于复杂的需求(业务改进)。但如果无法对组织进行调整,那么业务建模工作能够帮助您了解并管理这些组织使用该应用程序时存在的差别,并使您更容易确定应用程序功能的优先级。
场景 #5 - 新业务
如果某个组织决定要启动一项全新的业务(业务创建),并将构建信息系统来支持该业务,那么就需要进行业务建模工作。在这种情况下,业务建模的目的就不仅仅是要找出对系统的需求,而且还要确定新业务是否可行。在这种情况下,通常将业务建模工作本身当做一个项目。
场景 #6 - 修改
如果某个组织决定要对其经营方式进行彻底修改(业务重建),那么业务建模通常本身就是一个或多个项目。通常,业务重建分数个阶段完成:新业务展望、对现有业务实施逆向工程、对新业务实施正向工程以及启动新业务。
DDD领域驱动设计的项目实践
DDD的概念众所周知,各个文章中的基本概念也都大同小异。这里就不再累述了。DDD***的好处是使用 领域通用语言(UBIQUITOUS LANGUAGE) 将原先晦涩难懂的业务通过领域概念清晰的显性化表达出来。写这篇文章的目的在于学习怎么使用DDD来降低应用的复杂度,增加框架的可扩展性。本文主要阐述了我在项目中的思考过程和架构实现。
我们从以下一些方面进行些讨论以帮助我们完成DDD的具体实践。
分层***的意义是在架构的层面上来进行职责的拆分,分离关注点,每一层都确定独立的职责,分层内部保持高度内聚性,让每一层只解决该层关注的问题,从而将复杂的问题简化,它们 只对下层进行依赖 ,实现高内聚低耦合、职责分离的思想。
应用层代表。
那么应用层代表什么,就是代表系统;所以, 我们要明白人与系统的关系;人使用系统,系统提供外部功能,系统内部有领域模型;
这个问题,DDD通过DCI架构(Data、Context和Interactive三层架构),显式的用role对行为进行建模,同时让role在context中对应的领域对象进行绑定(cast)来解决。
待扩展.......
由于DDD分层架构这种向下依赖的模式使得整个框架对于Infrastructure层过度依赖,这不是我们所期望的,我们希望能在Application和Domain层更多的决定领域的功能和流程。所以根据DIP(依赖倒置)原则, 高层模块和低层模块都应该依赖于抽象,为了让模型的逻辑定义更为内聚,我们可以把抽象放在上层(Application、Domain),Infrastructure提供实现。
例如在现在的项目中,我们在Domain层中定义IRepository、ISender、IListener等行为接口,在frameworks and Drivers层(The Clean Architecture)实现接口,通过注入的方式提供给Domain层。这样能够使依赖的核心层更加内聚,同时对外层的扩展预留出了足够的空间。
(同样的操作我们还尝试的用在对领域层中,将领域对象抽象化,使领域服务依赖于领域对象的抽象,将真正的的领域对象交给更外层去实现,来满足我们架构对于相似业务的扩张能力。但这种做法是极具风险的,不同业务的差异化和领域对象抽象的能力都是极难把握的。总的来说,我们所期望的方向是:1.抽象能够涵盖所有业务。2.业务的差异化只在抽象的实现层被应用。只有满足以上2点,我们的想法才有可能被实现。)
聊完了高低层模块的依赖,我们再来聊下同层之间的依赖。
分层架构的一个重要原则是 每层只能与位于其下方的层发生耦合 ,有些书中还有严格分层架构和松散分层架构两种区分。两者的区别在于能否对非直接下层发生耦合。但有一点是相同的,同分层之间的耦合都是不被允许的。但问题是有些时候,实际情况使它并不是容易被实现的。
例如在我们的项目中,为了满足高吞吐的业务需求,我们选用了Actor模型和AKKA多线程框架来构建我们的架构。这种响应式的异步模式上层无法及时获得下层的反馈,这使上层对下层的协调、分配变得异常艰难。所以我们需要在不同的分层中都创建Actor进行交互,通过对sender的回件来进行解耦。(TODO:图)
Actor模型对于DDD的使用还是有很多帮助的,他们都有相同的对象理念,同时,这种响应式架构使领域事件到其他的边界上下文或微服务变得更容易。
经过一些分层、抽象,The Clean Architecture是我们项目期望的目标。
关于整洁架构...等有时间再写了...
The Clean Code Blog by Robert C. Martin (Uncle Bob)
领域建模是整个DDD中比较核心的步骤,大部分DDD的工程都是基于领域建模展开的。这里同样不再对实体,值对象等做过多的名词解释,只来记录一次领域建模的过程。
这是一个关于交易平台报价行情系统的部分需求:
1.交易员提交报价 2.交易员选择[群组]提交报价
3.交易核心处理报价 4.交易核心下发[报价报告] 5.交易核心下发[报价行情消息]
6.行情系统订阅交易核心相关消息
7.行情系统收到[全市场][报价报告],开始计算报价行情:
a.根据[报价报告][计算]出[公有报价行情]。b.根据[公有报价行情][聚合]出[公有聚合报价行情]。c.根据[公有报价行情]为[机构]生成[私有报价行情]。d.根据[私有报价行情][聚合]出[私有聚合报价行情]。
8.行情系统收到[群组][报价报告],开始计算报价行情:
a.根据[报价报告]为[群组]包含的[机构][计算]出[私有报价行情]。b.根据[私有报价行情][聚合]出[私有聚合报价行情]。
9.行情系统收到[公有报价行情消息],开始计算报价行情:
a.将[公有报价行情消息][转化]成[公有报价行情]。b.根据[公有报价行情][聚合]出[公有聚合报价行情]。
10.行情系统收到[私有报价行情消息],开始计算报价行情:
a.将[私有报价行情消息][转化]成[私有报价行情]。b.根据[私有报价行情][聚合]出[私有聚合报价行情]。
***步:分析需求,定义关键类,描述业务流程
1.从需求中抽象出我们所关心的类
Book:报价簿,报价行情形象话的表现
Page:报价簿中记录内容的抽象类
Institution:.........
2.建立类的大致内容、行为和关系
上图只是对类的简单定义,项目中最后落地一定不可能如此简单,需要进行反复的细化工作。
3.描述大致的业务活动图
第二步:划分主要构成
我们必须在这步中识别出模型中的实体、值对象,定义出核心域、子域并理清关系,划分应用层和服务层,确定限界上下文边界。
本需求寻找核心有两种方向,一种以 行情计算和聚合 为核心,机构、群组等作为独立子域;一种以 行情拥有对象(全市场、机构) 为核心,行情计算、聚合作为支撑子域;***种偏向横向分层,第二种偏向纵向分层。按实际情况,我们选择了第二种方式,围绕Owner(全市场和机构)展开它们的行情计算、价格预警、价格变化、单机构等等。同时,上面的类图、流程图都需要调整,使依赖尽量向核心(Owner)偏移。
核心域:Owner。生成报价行情的对象,报价行情的所有者。
子域:报价簿子域、资产子域、群组子域、预警子域、监控子域、报价明细子域。
实体:机构、群组、全市场、报价单、报价簿、报价明细、资产信息。
值对象:报价簿规则、报价簿ID。
领域服务:机构服务、群组服务、行情计算服务、行情聚合服务、报价预处理服务、仓库服务。
第三步:聚合
根据前面的识别出来的各类对象初步构造出模型。
待续....
Actor是Actor.class模型的核心,怎样在DDD的架构中使用Actor?
Actor的能力和Service相似,服务是无状态的,但状态却是Actor模型的特点。一个无状态的领域服务一般使用单例模式,而当一个类有了状态,就好像一个物体有了生命,“我是谁?我在哪?”这些也都成了它所需要关心的问题。我们需要维护服务列表、制定路由规则、实现服务发现功能...写到这,我们可以发现这些和微服务的服务治理非常相似。所以,我们可以建立我们的“注册中心”封装select,create,actorof等Akka的操作来实现服务发现,还能在里面提供限流、熔断、合并等等扩展。
面向对象
DDD是一种方法论,它的本质还是面向对象的思想。DDD在OOAD的基础上提炼演进出了一套架构设计理论。帮助我们,使我们能更容易的以面对对象的思想来设计工程。DDD的设计也需要遵循OOAD的SOLID原则。
Effective Aggregate Design by V***ghn Vernon
The Clean Code Blog by Robert C. Martin (Uncle Bob)
Reactive-Systems-Akka-Actors-DomainDrivenDesign
复杂度应对之道 - COLA应用架构
关于领域建模和领域建模和数据库建模区别的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。