领域模型是对领域内的概念类或现实世界中对象的可视化表示。又称概念模型、领域对象模型、分析对象模型。它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系。
领域模型的概念
什么是领域 模型?这个很关键,弄清楚什么是领域模型,才能进行领域模型设计,否则领域模型设计的结果就没有相互讨论的基础。
首先,我想谈谈我的理解。
业务系统一般包括三部分内容:(1)操作者(角色)、(2)系统为操作者提供的行为、(3)操作对象。其中的操作对象就是领域模型的来源。在进行需求分析时,领域模型来自于业务描述中的名词以及对名词的抽象。
当然描述业务的名词不都是模型,有可能是模型的一个属性,也有可能是角色、或者是跟业务无关紧要描述。在业务描述中有些关联名词描述的则是模型之间的关系。例如,在一个业务描述中出现了部门、用户、用户部门、部门用户这些名词,那么领域模型可能只是部门和用户,用户部门则是模型的一个属性,而部门用户表明了部门和用户这两个模型的关系。
一个描述业务的名词成为领域模型,至少具备两点:要么是业务中确实存在的实体、要么是业务实体的提炼(抽象)。
领域模型设计
举一个简单的例子来说明如何进行领域模型设计。
假如我们要为一个小卖店设计一套进销存系统,她为我们提供的业务描述是这样的:每天凌晨从布吉农批市场买苹果、梨、葡萄、橘子、香蕉、荔枝、核桃等等,反正哪些好卖她就买回来卖。葡萄、荔枝不能长久保留,一般要当天卖出去…。
针对上面这段业务描述,我们怎么进行领域模型设计?我给出以下几个步骤来完成领域模型设计。
总结业务描述中的名词
首先建一个名词表,把涉及到的名词列出来:
序号
名词
备注
1.
布吉农批市场
2.
买东西的人
是一个隐含的名词,每天凌晨从农批市场拿货
3.
苹果
4.
梨
5.
葡萄
6.
橘子
7.
香蕉
8.
荔枝
9.
核桃
10.
顾客
是一个隐含的名词,买回来卖的对象
11.
凌晨、当天
时间名词,与实体及角色无关
这个名词列表包括了业务的行为主体:角色,以及业务过程中的操作实体:模型,对我们接下来的用例描述、领域模型分析、需求分析很有帮助。当然这个名词列表需要经过进一步分析提炼,成为领域模型
确定业务实体
序号
名词
描述
1.
布吉农批市场
不是本业务的一个实体
2.
买东西的人
是本业务的一个角色
3.
苹果
是一个实体
4.
梨
是一个实体
5.
葡萄
是一个实体
6.
橘子
是一个实体
7.
香蕉
是一个实体
8.
荔枝
是一个实体
9.
核桃
是一个实体
10.
顾客
是本业务的一个角色
11.
凌晨、当天
时间名词,与实体及角色无关
抽象业务模型
经过分析,我们得出的实体是苹果、梨、葡萄、橘子、香蕉、荔枝、核桃,这些是不是模型呢?应该说还不是,还要经过进一步分析:在我们分析的业务领域 内,它们有没有共性?苹果、梨、葡萄、橘子、香蕉、荔枝属于水果,核桃属于干果,它们都是果品的一个具体实例。而在水果中葡萄和荔枝属于不宜保存水果,通 过这样进一步的分析得出如下的领域模型图例:
果品进销存领域模型
这个领域模型不但能反映目前的经营实体,同时给我们需求分析人员和系统功能提供了一定的扩展视野:将来会不会经营食品,短期保持水果采取什么利润空间来促销,长期保存的水果会不会因为保存成本而导致利润下降。
领域模型与数据模型的关系
我认为领域模型它是一个分析模型,帮助系统分析人员、用户认识现实业务的工具,描述的是业务中涉及到的实体及其相互之间的关系,它是需求分析的产物, 与问题域相关。领域模型是需求分析人员与用户交流的有力工具,是需求分析人员与用户共同理解的概念,是彼此之间交流的语言。而数据模型是系统设计、实现的 一部分,描述的是对用户需求在数据结构上的实现,仅此而已。当然数据模型中的概念模型设计与领域模型类似,缺乏的是实体之间更广泛的关系描述。
通常大家会考虑数据怎么存放的问题,我的理解是领域模型设计期间不用考虑数据的存放问题,只考虑业务描述中涉及的实体以及实体之间的关系。
实体之间的关系,很多书都讲了,无非是泛化、依赖和关联,关联又分了一般关联、聚合、组合等等,我这里就不列了。
总结
领域模型设计是需求分析的关键步骤。它帮助用户及需求分析人员建立业务概念,确定用户业务的问题域,系统涉及的业务范围等等。
领域模型设计的步骤为:
1. 从业务描述中提取名词;
2. 从提取出来的名词中总结业务实体,区分名词中的属性、角色、实体、实例,形成问题域中操作实体的集合;
3. 从业务实体集合中抽象业务模型,建立问题域的概念(例如在前面的例子中,我们把容易变质的水果称之为“短期保持水果”,当然也可以是其它说法,只要能跟用户达成共识即可);
4. 用UML提供的方法和图例进行领域模型设计、确定模型之间的关系;
领域模型的概念
什么是领域 模型?这个很关键,弄清楚什么是领域模型,才能进行领域模型设计,否则领域模型设计的结果就没有相互讨论的基础。
首先,我想谈谈我的理解。
业务系统一般包括三部分内容:(1)操作者(角色)、(2)系统为操作者提供的行为、(3)操作对象。其中的操作对象就是领域模型的来源。在进行需求分析时,领域模型来自于业务描述中的名词以及对名词的抽象。
当然描述业务的名词不都是模型,有可能是模型的一个属性,也有可能是角色、或者是跟业务无关紧要描述。在业务描述中有些关联名词描述的则是模型之间的关系。例如,在一个业务描述中出现了部门、用户、用户部门、部门用户这些名词,那么领域模型可能只是部门和用户,用户部门则是模型的一个属性,而部门用户表明了部门和用户这两个模型的关系。
一个描述业务的名词成为领域模型,至少具备两点:要么是业务中确实存在的实体、要么是业务实体的提炼(抽象)。
领域模型设计
举一个简单的例子来说明如何进行领域模型设计。
假如我们要为一个小卖店设计一套进销存系统,她为我们提供的业务描述是这样的:每天凌晨从布吉农批市场买苹果、梨、葡萄、橘子、香蕉、荔枝、核桃等等,反正哪些好卖她就买回来卖。葡萄、荔枝不能长久保留,一般要当天卖出去…。
针对上面这段业务描述,我们怎么进行领域模型设计?我给出以下几个步骤来完成领域模型设计。
总结业务描述中的名词
首先建一个名词表,把涉及到的名词列出来:
序号
名词
备注
1.
布吉农批市场
2.
买东西的人
是一个隐含的名词,每天凌晨从农批市场拿货
3.
苹果
4.
梨
5.
葡萄
6.
橘子
7.
香蕉
8.
荔枝
9.
核桃
10.
顾客
是一个隐含的名词,买回来卖的对象
11.
凌晨、当天
时间名词,与实体及角色无关
这个名词列表包括了业务的行为主体:角色,以及业务过程中的操作实体:模型,对我们接下来的用例描述、领域模型分析、需求分析很有帮助。当然这个名词列表需要经过进一步分析提炼,成为领域模型
确定业务实体
序号
名词
描述
1.
布吉农批市场
不是本业务的一个实体
2.
买东西的人
是本业务的一个角色
3.
苹果
是一个实体
4.
梨
是一个实体
5.
葡萄
是一个实体
6.
橘子
是一个实体
7.
香蕉
是一个实体
8.
荔枝
是一个实体
9.
核桃
是一个实体
10.
顾客
是本业务的一个角色
11.
凌晨、当天
时间名词,与实体及角色无关
抽象业务模型
经过分析,我们得出的实体是苹果、梨、葡萄、橘子、香蕉、荔枝、核桃,这些是不是模型呢?应该说还不是,还要经过进一步分析:在我们分析的业务领域 内,它们有没有共性?苹果、梨、葡萄、橘子、香蕉、荔枝属于水果,核桃属于干果,它们都是果品的一个具体实例。而在水果中葡萄和荔枝属于不宜保存水果,通 过这样进一步的分析得出如下的领域模型图例:
果品进销存领域模型
这个领域模型不但能反映目前的经营实体,同时给我们需求分析人员和系统功能提供了一定的扩展视野:将来会不会经营食品,短期保持水果采取什么利润空间来促销,长期保存的水果会不会因为保存成本而导致利润下降。
领域模型与数据模型的关系
我认为领域模型它是一个分析模型,帮助系统分析人员、用户认识现实业务的工具,描述的是业务中涉及到的实体及其相互之间的关系,它是需求分析的产物, 与问题域相关。领域模型是需求分析人员与用户交流的有力工具,是需求分析人员与用户共同理解的概念,是彼此之间交流的语言。而数据模型是系统设计、实现的 一部分,描述的是对用户需求在数据结构上的实现,仅此而已。当然数据模型中的概念模型设计与领域模型类似,缺乏的是实体之间更广泛的关系描述。
通常大家会考虑数据怎么存放的问题,我的理解是领域模型设计期间不用考虑数据的存放问题,只考虑业务描述中涉及的实体以及实体之间的关系。
实体之间的关系,很多书都讲了,无非是泛化、依赖和关联,关联又分了一般关联、聚合、组合等等,我这里就不列了。
总结
领域模型设计是需求分析的关键步骤。它帮助用户及需求分析人员建立业务概念,确定用户业务的问题域,系统涉及的业务范围等等。
领域模型设计的步骤为:
1. 从业务描述中提取名词;
2. 从提取出来的名词中总结业务实体,区分名词中的属性、角色、实体、实例,形成问题域中操作实体的集合;
3. 从业务实体集合中抽象业务模型,建立问题域的概念(例如在前面的例子中,我们把容易变质的水果称之为“短期保持水果”,当然也可以是其它说法,只要能跟用户达成共识即可);
4. 用UML提供的方法和图例进行领域模型设计、确定模型之间的关系;