跳转至

领域模型

什么是领域

定义1: 《领域驱动设计》

每个热软件程序是为了执行用户的某项活动,或是满足用户的某种需求。这些用户应用软件的问题区域就是软件的领域。 —— Page. 1

领域:知识、影响或活动的范围 —— 术语表。

定义2: 《Object-Oriented Methods —— A foundation》

Understanding concepts is usually accomplished by identifying and defining the context, or domain. It provides a common understanding that formally delimits and focuses our efforts.

A domain is a collection of objects in a selected area of interest.

A domain specifiation is the collection of concepts that apply to a domain.

什么是领域模型

定义1:《UML和模式应用(原书第3版)》

在UP中,术语“领域模型”指的是对现实世界概念类的表示,而非软件对象的表示。该术语并不是指用来描述软件类、软件架构领域层或有职责软件对象的一组图。

UP对领域模型的定义是:可以在业务建模科目中创建的制品之一。

更准确地讲,UP领域模型是UP业务对象模型(BOM)的特化,“专用于解释业务领域中重要的‘事物’和产品”[RUP]。 也就是说,领域模型专注于特定领域,例如与POS相关的事物。更为广泛的BOM是扩展的、通常十分庞大和难以创建的多领域模型,BOM覆盖整个业务及其所有子域,本书并不涵盖这部分内容,并且也不提倡创建BOM(因为需要在实现前进行大量建模)。

应用UML表示法,领域模型被描述为一组没有定义操作(方法的特征标记)的类图(classdiagram)。它提供了概念透视图。它可以展示:

  • 领域对象或概念类。
  • 概念类之间的关联。
  • 概念类的属性。

UP 领域模型 的两个传统含义

“领域模型”是现实世界中对象的概念透视图,而非软件透视图。 但这一术语是多义的,也用来表示“软件对象的领域层”(尤其是在Smalltalk社团里,20世纪80年代我的大部分早期OO开发工作即是围绕Smalltalk进行的。)

也就是说,在表示层或UI层之下的软件对象层是由领域对象(domainobject)组成的——领域对象是表示问题领域空间事物的软件对象,并且与“业务逻辑”或“领域逻辑”方法相关。例如,软件类Board具有getSquare方法。哪种定义是正确的呢?嗯,都是正确的!这一术语在不同社团具有长期确定的使用,表示不同含义。

定义2:《企业架构模式》

领域模型——合并了行为和数据的领域的对象模型 —— 《企业架构模式》P81

领域模型混合数据和处理过程,拥有多只属性和复杂的关联网,并且使用继承。因此,领域模型衍生出两种风格:

  • 简单领域模型看起来与数据库设计很类似,这种设计中几乎每一个表都与一个领域对象对应。简单领域模型可以使用活动记录
  • 而复杂领域模型则与数据库设计不通,他是用继承,策略和其它设计模式,是一张由互联的洗礼读对象组成的复杂网络。复杂领域模型更适合于复杂的逻辑,但他到数据库的映射比较困难。复杂领域模型需要使用数据映射器

由于业务行为是经常变化的,因此易于修改,构建和测试对领域层来说十分重要。因而,领域模型于系统中其他层之间的耦合程度应达到最小。

你会发现许多分层模式,他们的主导思想就是在领域模型于系统中其他部分之间保持尽可能小的依赖。

如何创建领域模型

以当前迭代中所要设计的需求为界:

  1. 寻找概念类(参见后继准则)。
  2. 将其绘制为UML类图中的类。
  3. 添加关联和属性。参见9.14节和9.16节。

定义3:《领域驱动设计》

为了创建真正能为用户活动所用的软件,开发团队必须运用一整套与这些活动有关的知识体系。所需知识的广度可能令人望而生畏,庞大而复杂的信息也坑你超乎想象。模型正是解决此类信息超载问题的工具。模型这种知识形式对知识进行了选择性的简化和有意的结构化。适当的模型可以使人理解信息的意义,并专注于问题。 领域模型并非某种特殊的图,而是这种图要传达出来的思想。它绝不单单是领域专家头脑中的知识,而是对这类知识严格的组织且有选择的抽象

在领域驱动设计中,3个基本用途决定了模型的选择:

  1. 模型和设计的核心相互影响。
  2. 模型是团队所有成员使用的通用语言中枢。
  3. 模型是浓缩的知识。

软件的核心

软件的核心是为其用护解决领域相关的问题的能力。所有其他特性,不管有多么重要,都要服务于这个基本的目的。——《领域驱动设计》