如果你连业务领域建模都不会,那还怎么做架构师呢?

简介: 领域模型是对领域内的概念类或现实世界中对象的可视化表示。又称概念模型、领域对象模型、分析对象模型。它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系。概念比较深奥,其实说白了就是我们把基于对业务的理解画成一个类图,并画出这些类之间的关系(面向对象)。

d9a0a2bd9b9bb8e4a592efcea329ee1d.png


领域模型的概念及作用


领域模型是对领域内的概念类或现实世界中对象的可视化表示。又称概念模型、领域对象模型、分析对象模型。它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系。概念比较深奥,其实说白了就是我们把基于对业务的理解画成一个类图,并画出这些类之间的关系(面向对象)。


领域模型可以整理业务中的概念以及关系,帮助团队中的成员对业务的理解保持一致,往后可以指导数据库设计、系统功能设计、指导开发。在整个系统建设周期能起到 上接需求,下承开发 的作用。


那既然领域模型如此重要,我们是不是要在类图中尽可能的展示对象的属性和方法,以便更好的指导后续的开发设计。


恰恰相反,我们在建模的时候不要将注意力集中在属性或行为上,应该摆脱这些细枝末节,抓住领域对象定义的最基本特征,只需要体现对象模型的重要概念。如果细节过多很容易产生 ”只见树木,不见森林“ 的现象。


下面我们看一个简化后的报销业务的领域模型,加深一下印象。


fd0103fb560a33077deb0225922d4730.png


完成一个领域模型建模,主要需要做两件事:


定义类的关键属性和关键行为;

定义类与类之间的关联关系。

定义类的属性和行为

定义类的属性和行为比较简单,用设计工具拖一个class即可,这里只需要注意一下属性和行为的访问权限。


- 表示private  

# 表示protected

~ 表示default,也就是包权限

+ 表示public


7fff590ebd2466682976b739efc09dac.png


定义类与类之间的交互关系


在UML类图中,定义了六种类之间的关系,他们分别是: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency)。关系比较多,而且有些还比较相近,比如聚合和组合,接下来我们逐渐讲解:


泛化(Generalization)


介绍:


泛化(Generalization)表示类与类之间的继承关系,接口与接口之间的继承关系。


图例:


使用 空心三角形+实线 表示。


970cd549b9226252e751b1808209e57f.png


代码实现:


publicclassA {
}
publicclassBextendsA {
}


介绍:


实现(Realization)表示一个class类实现interface接口(可以是多个)的功能。


图例:


使用 空心三角形+虚线 表示。


b9cacf76d18e0db72749efe90097f2b8.png


代码实现:


publicinterfaceA {
}
publicclassBimplementsA {
}

聚合(Aggregation)


介绍:


聚合(Aggregation)表示一种弱的 ‘拥有’ 关系,即has-a的关系,体现的是A对象可以包含B对象,B类生命周期可以不依赖A类对象的生命周期, 也就是说可以单独销毁A类对象而不影响B类对象,比如课程与学生之间的关系。


图例:


使用 空心的菱形+实线箭头 表示。

d9a0a2bd9b9bb8e4a592efcea329ee1d.png


代码实现:


publicclassA {
privateBb;
publicA(Bb){
this.b=b;
    }
}


组合(Composition)


介绍:


组合(Composition)表示一种强的 ‘拥有’ 关系,即contains-a的关系,体现的是A对象包含B对象,B类生命周期依赖A类对象的生命周期,B类对象不可单独存在,比如鸟与翅膀之间的关系。


图例:


使用 实心的菱形+实线箭头 表示,还可以使用连线两端的数字表示某一端有几个实例。


cc1bd14af276a4bdc498de293e4b1b17.png


代码实现:


publicclassA {
privateBb;
publicA () {
this.b=newB();
    }
}


关联(Association)


介绍:


关联(Association)是一种非常弱的关系,包含聚合、组合两种关系。对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。具体到代码层面,如果B类是A类的成员变量,那么B类和A类就是关联关系。


图例:


使用实线箭头表示。


132a4fa78eaaf06829e8a7405a90aa2c.png


代码实现:


publicclassA {
privateBb;
publicA(Bb){
this.b=b;
    }
}


或者


publicclassA {
privateBb;
publicA () {
this.b=newB();
    }
}


依赖(Dependency)


介绍:


依赖(Dependency) 是比关联关系更加弱的关系,包含关联关系。不管是B类对象是A类对象的成员变量,还是A类方法使用B类对象作为参数或者返回值、局部变量,只要B类对象和A类对象有任何使用关系,我们都称他们有依赖关系。


图例:


使用 虚线箭头 表示。


02f6b655c15f349bd2081550f5c09729.png


代码实现:


publicclassA {
privateBb;
publicA(Bb){
this.b=b;
    }
}


或者


publicclassA {
privateBb;
publicA () {
this.b=newB();
    }
}


或者


publicclassA {
publicvoidfunc(Bb)
        ...
    }
}


模型简化


严格的UML类图之间的关系拆分的太细,专业要求很高,大大增加了学习成本,而且对于业务沟通,指导后续数据库设计,编程开发没有太大意义。


所以在实际业务建模过程中,我们并不需要严格按照UML类图交互关系来描述业务实体之间的关系,比如我们可以将聚合、组合、关联统统使用关联关系表示,使用实线连接两个实体,并在两侧标记出实例个数即可。


02f6b655c15f349bd2081550f5c09729.png


小结


领域模型最终呈现后的结果很简单,但是过程却很复杂。需要架构师基于自身的业务知识和类似产品的参考,再结合客户、业务专家、领域专家的咨询和指导,需要经过不断推倒、修改优化才能完成。


对于刚开始接触领域模型的绘制时经常会出现下面两种典型错误:


将待开发系统也放在领域模型里面

待开发系统要不要出现在领域模型中取决于你的业务离开待开发的系统能不能玩的转。举个例子:如果开发的是共享单车的信息系统,共享单车离开信息系统肯定玩不转,所以这时候信息系统需要出现在领域模型。

概念划分不清,关系没有画到位

比如属性画成了类,继承关系搞错


目录
相关文章
|
6月前
|
机器学习/深度学习 人工智能 数据挖掘
如何做好互联网产品需求分析?看这里!
如何做好互联网产品需求分析?看这里!
|
10月前
|
架构师 数据可视化 领域建模
架构师之路 - 业务领域建模
架构师之路 - 业务领域建模
223 0
|
12月前
好的软件研发管理怎么做
好的软件研发管理怎么做
167 0
|
12月前
|
存储 缓存 架构师
如何做架构设计和评审
如何做架构设计和评审
385 1
|
敏捷开发 架构师 项目管理
架构师才能看懂的大型网站架构面临的挑战:业务架构的基本思路
业务架构的基本思路 大型网站系统有很多功能,一次性明确所有的功能需求并设计出一个庞大的业务架构是一件费力不讨好的事情。因为在项目前期,难免会忽视一些琐碎功能,而随着开发的进行,也会有很多新的想法产生,基本上不会存在完全按照最初的业务架构设计完成的软件产品。因此,业务架构不仅要做到“规整功能模块,厘清产品业务逻辑”,更重要的是如何做到“有规划性地应对项目过程中的需求变更”。
|
存储 人工智能 缓存
架构设计00-架构师知识体系04-怎么做架构设计
架构设计00-架构师知识体系04-怎么做架构设计
172 0
架构设计00-架构师知识体系04-怎么做架构设计
|
敏捷开发 项目管理
Scrum理论在业务线中的实践
Scrum 的应知应会 Scrum 是什么 所有符合敏捷思想和原则的方法都是敏捷方法。Scrum是一种实现敏捷方法的框架。   Scrum的组成 Scrum Master 产品负责人 开发团队 业务负责人通过产品负责人和Scrum团队产生连接   Scrum Master ScrumMaster负责促进和支持Scrum。 ScrumMas
226 0
Scrum理论在业务线中的实践
|
设计模式 安全 测试技术
如何快速理解复杂业务,系统思考问题?
对于复杂问题的思考其实是有层次的,从最表面的事件,到事件背后的规律,再到这个问题的结构模式,再到价值观,层层递进。在画完自己的业务系统因果回路图之后,再结合这个心智模型,思考自己的思考在哪个层次,是否可以有机会再下钻到更深的层次。
1177 2
如何快速理解复杂业务,系统思考问题?
|
程序员
思考如何做好架构设计
在开发软件中过程中,我们时常会遇到这样的场景:在需求描述中只要求我们提供一个针对其特定需求的功能,但是作为程序员,直觉告诉我们在别的场景下可能有类似的需求,但是这个“别”的场景还没有真正出现,处在可能出现,也可能不会出现的境地,那我们应该如何应对这样的情况呢?在这篇文章中,将对如何处理这样的问题进行探讨。  在展开探讨前,我们先定义如下的两个词汇,便于我们后面的讨论: 通用:是指在设计中考虑了多个不同的使用场景,能在多个不同的场景下提供服务 特定:只考虑很特定的场景,要求在相对较多的限制条件下才能提供服务
207 0
|
消息中间件 监控 NoSQL
项目中怎样做技术选型
项目中怎样做技术选型
项目中怎样做技术选型