架构师之路 - 业务领域建模

 

领域模型的概念及做用

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

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

那既然领域模型如此重要,咱们是否是要在类图中尽量的展现对象的属性和方法,以便更好的指导后续的开发设计。编程

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

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


完成一个领域模型建模,主要须要作两件事:数据库设计

  1. 定义类的关键属性和关键行为;工具

  2. 定义类与类之间的关联关系。学习

定义类的属性和行为

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

- 表示private  
# 表示protected 
~ 表示default,也就是包权限  
+ 表示public


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

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

泛化(Generalization)

介绍:

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

图例:

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


代码实现:

public class A {
  
}

public class B extends A {
  
}

实现(Realization)

介绍:

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

图例:

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


代码实现:

public interface A {
  
}

public class B implements A {
  
}

聚合(Aggregation)

介绍:

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

图例:

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


代码实现:

public class A {
    private B b;
    public A(B b){
        this.b = b;
    }
}

组合(Composition)

介绍:

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

图例:

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


代码实现:

public class A {
    private B b;
    public A () {
        this.b = new B();
    }
}

关联(Association)

介绍:

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

图例:

使用实线箭头表示。


代码实现:

public class A {
    private B b;
    public A(B b){
        this.b = b;
    }
}

或者

public class A {
    private B b;
    public A () {
        this.b = new B();
    }
}

依赖(Dependency)

介绍:

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

图例:

使用 虚线箭头 表示。


代码实现:

public class A {
    private B b;
    public A(B b){
        this.b = b;
    }
}

或者

public class A {
    private B b;
    public A () {
        this.b = new B();
    }
}

或者

public class A {
 public void func(B b)         ...     } } 

模型简化

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

因此在实际业务建模过程当中,咱们并不须要严格按照UML类图交互关系来描述业务实体之间的关系,好比咱们能够将聚合、组合、关联通通使用关联关系表示,使用实线链接两个实体,并在两侧标记出实例个数便可。


小结

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

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

  • 将待开发系统也放在领域模型里面 待开发系统要不要出如今领域模型中取决于你的业务离开待开发的系统能不能玩的转。举个例子:若是开发的是共享单车的信息系统,共享单车离开信息系统确定玩不转,因此这时候信息系统须要出如今领域模型。

  • 概念划分不清,关系没有画到位 好比属性画成了类,继承关系搞错

以上,但愿对你有所帮助!

 

 

本文分享自微信公众号 - JAVA日知录(javadaily)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索