基于领域驱动设计的本体论内容
基于领域驱动设计的本体论内容
基于领域驱动设计的本体论
张桂权
Pavel Hruby
Microsoft
Frydenlunds Allé 6
2950
+45 29229183
phruby@acm.org
张桂权 译
fish-in-the-air@126.com
(未经许可不许以转载或其他任何的形式进行传播本文,否则将追究其责任)
摘要
本篇论文介绍了一种基于领域本体论应用的软件应用的领域特有模型设计的方法。我们将举例说明一个领域特有组件的应用对象可以从领域的本体论的类型中被驱动,并且应用的行为可以作为切面,应用对象的横截面,被模型化。这种方法通过模型在二维空间导向一个软件组件特有的体系结构。一维代表领域本体的类型,另一维代表用户需求功能。软件应用包含组件的内联子集和由特殊领域本体来判定的组件接口。
类型和主体描述
面向对象的编程、领域特有体系结构、领域工程、模式和数据抽象
通用术语
设计
关键字
本体、资本和事件代理(Resources, Events agents)、面向切面的编程、商业应用。
1、概述
软件设计最基本的任务之一就是创建一个应用软件对象模型。在领域特有软件设计当中,设计者有选择的应用领域知识于用户需求和面向对象设计的原则。
我们将举例说在软件设计中应用常规特有领域知识导向一个特有结构模型。模型标注两个正交关联;基础概念和源于领域知识的类型和源于用户需求的特有行为。
在这个文档中,领域驱动开发是知道在一个特殊领域或者一个应用区域的软件应用的开发。领域实例,比如,商业领域、交互系统领域、销售领域,如图2。我们叫应用模型实体为应用对象。在商业领域的应用对象是销售订单、货物清单和装运。本体类型和应用对象元类相符合,实体用来描述应用对象的特性。在商业领域中的本体类型为经济资本、事件、代理、索赔、合同和托付。应用对象的实例是应用对象运行时表现。
图1举例说明了拥有元类经济资本(本体类型)的现金应用对象。在运行时,现金实例就是一个请求对象,比如,一个钱包中的现金。
图1.本体、应用对象和实例
术语切面(**)是用来表示应用对象横截面功能性模数的一个概念。有很多手段来建模和实现横截面相关的事件,比如,面向切面的编程,组成(成分)过滤器,关联的多维分离和统一建模语言的组合。在本编论文中我们不会讨论这些任何特殊的方法,我们始终保持在概念的层次。
论文的剩余部分通过如下的结构组织:下一章概述领域组件建模的方法,接连几个章节描述方法的每一步骤。系统层次相关章节举例说明软件应用包含的基于本体接口的领域组件。论文的最后一部分回答一些作者写论文的时候收到的一些问题。
2、实现方法
本方法包含四个步骤:
1、确定领域。 这一步确定软件应用或者产品系列的范围;图2说明了
基于多重范围的领域的实例。
2、选择领域本体。有时一个合适的本体并不存在,所以必须自己开发。一个应用软件元模型可以扮演一个领域本体的角色,提供基于元模型的不知道的领域原则超乎于用户需求的及时表示。一个本体相当于包含完全领域的最小概念集合。
3、标记特殊的用户需求。经常有一些功能性需求不能成为本体的一部分,因为不是所有的领域应用都需要这些需求。我们将会展示这些需求的模型,通常是横切领域对象,而且可以作为切面被建模。
4、通过配置源于本体类型和特殊用户需求的对象构建应用模型。下一节中有这四个步骤地详细介绍。
3、确定领域
图2举例说明了应用对象在不同水平的抽象;水平线表示应用对象可以实现的领域。通用建模语言,比如,统一建模语言,是在术语对象、类和方法中描述模型,包含一些现实世界的概念的语义。另一切面,模型范围是所有面向对象系统的一个领域。特殊的建模语言是用户实体,比如,货物清单和装运包含详细的和额外的语义和模型意图信息。这种信息可以被有效的利用,比如,使模型生效而违背领域规则和领域模型之间的自动转换。这种权衡,一种特殊语言的应用性区域是比通用建模语言的应用型更加严格。
在一个理想的情况下,原型实体(modeling)必须精确的出于抽象层次(水平),即完全覆盖软件应用领域。在下一节中我们将展示处于正确抽象水平,并且符合领域类型的领域对象。比如,对于商业领域,通过资源、事件代理本体来确定符合的此类对象。
图2.抽象级别和覆盖的领域
4、领域本体
一个本体就是一个概念的详述规约[7]。本体类型定义领域中存在的概念以及概念之间的关系。对于面向对象的应用,领域本体定义这个领域中应用模型的元模型。领域类型符合应用对象的元类。比如,通过REA(资源、事件代理)来指定的经济代理是对象,如,客户和销售商,的一个元类。经济事件时销售、支付对象的一个元类。经济资本是金钱、产品对象的一个元类。同样的,本体之间的关系成为应用对象之间的关系元关系,比如,股票流是出口流和进口流之间的关系的元关系。经济事件之间的二象性是销售和支付接收之间的调和关系的元关系。
图3. 应用模型和相关的REA(资源、事件代理)元模型
5、指定需求
5.1、领域对象的功能需求
前面几节举例说明了构建软件应用可以从适用于应用的领域的本体类型驱动。虽然仅仅通过领域对象是不足以创建一个软件应用。领域对象通常需要一些本体类型没有指定,但是应用用户需求的功能。 比如,REA(资源、事件代理)本题没有指定如何确定上用对象的标识或者如何创建金融报告。然而,功能,比如,序列号和账目是商业应用用户的必需品。
应用功能没有通过领域本体来指定有一个很好的缘由。领域本体指定适用于领域内所有系统的概念结构。领域本体设法寻找最小的,仍然完全覆盖领域的概念集。
由于特定的需求,本地方便性以及其他诸多的原因,系统之间的应用对象的功能是大不相同的。比如,在商业应用中,有些对象,客户和产品,需要可读序列号;有些则不需要,比如,订单行。金融报告则与当地的法律法规有关,商业和报告的行在应用之间通常是变化的,正如不知什么原因现实世界的不同公司时不同于其他的公司的。一个完全的功能列表通常很可能没有被整个领域指定。软件应用用户经常需要新功能或者已经存在功能的新版本,而这些是本体创建者不能预见的。
5.2、横切领域对象
本体类型确定领域的一维分解。另一维分解时应用功能。在以下几段中我们将展示许多情形下应用功能组件是不能本地化到一个当一个应用对象。
在商业应用领域中,比如,产品序列号是产品对象的一个属性。序列号通常不是一个随机数。产品序列号是从一个经济资本组属性数字序列中选出来的,这些资源序列号自己提供的。因此,对象请求产品组包含指定序列号格式,一个序列号是否需要唯一,它是如何依赖于前一个产品序列号等规则,规则指定一个已经删除的产品的序列号是否可以重用,和一些相似的规则。序列号模数横切两个领域对象,产品对象和产品组对象,序列号由产品聚集部分和产品组聚集部分相互合作来构建。把这个序列号作为一个单一的模数是非常有用的,但是这个模数横切了两个应用对象。
图4.序列号横切应用对象
面向切面的编程[10]是方法之一,是一个组件方法中关于如何处理横切关联的想法的精确的约定。在领域开发的范围内,从本体类型中采用对象思考实体和利用切面理念思考软件应用功能是一种很好的想法。
这种关联区分,同时确定了一种如何在不改变基础结构的情况下增加软件应用新功能的机制。本体类型对象的协作确定的软件应用基础结构和切面提供特殊的功能。
5.3、切面类型
在介绍领域对象的章节中我们已经展示了本体类型相当于应用对象元类。类似的方法同样适用于切面范围内的实体。
在这一节中我们将为应用切面描述元类。例如,我们已经在一个应用模型中展示了序列号是一个切面。虽然,序列号的基本的目的是给应用对象提供一个为一个标识。
因此,我们可以认为序列号是一个非常通用的切面类型标识的一个特殊实例。其他的标识切面类型是名字、电话号码、电子邮件地址、统一资源定位器(URL)、全局唯一标识(GUID)和国际标准书号(ISBN)。
标识切面类型指定了给某物一个标识的概念。标识不是继承于对象和事物的一部分。人们通常用一个名字和现实或想象中的事物关联。因为在一个应用范围内名字没有必要唯一,事物可以通过给定的数字来关联。通常,现实或想象事物拥有一个或多个被给定的标识,所以可以通过这些标识与之关联。
图5. 应用切面和相关的元模型。
图5举例说明了在切面元类水平的标识切面类型和在应用模型中的序列号切面。下面我们将更加详细的描述标识切面来说明切面类型是如何被指定的。
标识切面类型在元类层次上包含两个部分:标识定义,定义一个标识类型的名称。一个标识类型含有以下的属性:AutoNumber - 一个用来指示一个标识是否可以通过系统自动的增加的布尔函数。Unique - 一个用来指示一个标识是否需要唯一的布尔函数。Mandatory是一个用来指示必须或者可以定义一个标识的布尔函数。
切面类型的Identifier部分指定标识的数据类型,比如,字符串或数字。
应用层次包含的切面部分是被设置的切面类型参数。例如,Number Series Definition是自增标识类型的一个实例。这些数字是唯一的,而且是强制的。Series Number (标识的一个实例) 包含序列中最后被利用的数字,并且明确指定标识的格式。允许序列号是数字和符号的结合体。商业领域中关于切面类型的例子是地址、账目和邮政(posting)。相关的细节,以及其他的切面类型被描述为行为的商业模式。
地址切面类型的目的,看图6,用来指定对象的地理位置以及不同位置之间的可通航的路径。地址切面由4个组件组成。起始和目标位置,实际位置决定有些应用对象的实际位置和用来跟踪实际位置历史改变的航道。起始和目的位置经常被不同的经济代理配置,航道/路径经常被不同的经济事件配置,实际位置经常被一个资源配置。
图6. 地址切面类型
邮政切面类型的目的,如图7,是跟踪有些应用对象改变时表示的交易。邮政切面的组件是持续应用对象,使之不可改变的和描述即将被每一个实体注册的信息的数字范围的实体。这些实体是典型的经济事件或交付配置,范围是通过经济代理、资源、相关类型和组所配置。
图7. 切面类型实体
账目切面类型的目的,如图8,是表示聚合的实体数据。账目切面的组件是表示聚合总额的账目和表示所有的增加或减少的一个或多个实体。账目经常通过一个代理或资源类型,和经济事件和支付实体来配置。
图8. 账目切面类型
5.4、切面类型的数字
根据我们的经验一个领域切面类型数字在某些水平上作为本体类型是很枯燥的。例如,最后一个版本的REA(资源、事件代理)本体[5]描述37个本体类型。23根据元类型,而14根据元关系。客户关系管理(CRM)商业应用的一个功能可以完全被18切面类型覆盖。
6、配置应用
我们已经展示了一个特定领域模型的二维分解:对象区域可以映射领域的本体类型,切面区域映射到为了应用的高效性而设置的行为,如图9。我们同时已经说明了可以在对象域和切面域上两个抽象水平指定的组件。本体类型或切面模式水平,和应用对象与应用切面水平。