`
yimlin
  • 浏览: 139148 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Domain Model:业务对象的进一步设计

阅读更多
本文放在javaeye可能未必合适。文章中中英文混用也是问题。
而且本文讨论的模型比较适合交易类系统,对于ERP类未必合适。

Author :  Anders小明
原文: http://www.blogjava.net/AndersLin/archive/2006/10/09/74187.html

   在Domain Object的动静之分中,其实我已经把业务对象分为三大类,不过在那一部分中没有明确的提出。这三大类是Party,Product和Contract。
    Party
    包括Party对象和Role对象。
    Party代表业务发生对象的实体,而Role对象不仅仅是承担的相应的责任,同时也是Party在具体业务中一个侧面,因此除了责任还有保持一些实体业务关系的子集。例如:Party拥有多个Address和多个account,其中一个role只使用其中一个address和一个account。
    Role的分类有两种。从性质来分,可以分为Individual和Organization;从业务来分Customer、Provider以及位于中间的Agency(以及Employee等)。 当然还要根据业务在进一步做细粒度的建模。
    不是所有的系统都需要Role的。在一些系统中对party和role的概念区分并不强烈,例如在一些普通的BBS或者CMS系统中,party和role一一对应,通常只设计role而忽略party,或者说直接把role对象party化。但在另一些系统中则不一样,例如:在保险系统中,一个Party同时拥有多种Role是很普遍的;在eBay或者TaoBao等C2C系统中,一个Party既可以是Buyer也可以是Seller。
    Role和Role之间的relationship是一个很大的逻辑。例如:Employee是有上下级关系的;Agent是有introducer的。Relationship的实例化有两种手段:一种是在role对象中建立,另一种利用独立的一个relationship对象。
    和Party关联的是另一大类对象Holding,不过Holding对象体系比较特殊,在金融行业中Holding是一个关键的对象体系,而在其它行业中,Holding则不那么重要,只是简单的一个account记帐功能。
 
    Product
    Product对象比较麻烦,在金融行业看起来像另外一种contract。不过在B2C或C2C的电子商务中,Product则是代表现实世界中的商品。
    Product分为两类:main和rider。Main product可以被单独出售,而rider不能。这个实际上是一个固化的Package规则。
    还有一类Product比较特别,或者称为Package Product,是几种product打包一起,它拥有与product相同的属性和行为。
    Product对象域包括两部分逻辑:Product的Package规则,以及Product的计价逻辑。
    Product的Package规则。比如:rider product只能作为附属品被售出;一些Rider Product只能和特定的main product绑定销售;一些product不能同另一product同时销售;一些product一次最多买5份。
    Product的计价逻辑包括两个层次:Internal和External。Internal表现为根据自身条件判断,如时间,折扣等级等;External则和contract中其它product相关,如:其它product总价超过一定价格就获得额外折扣;或者同一个product份数超过3份就拥有一定的折扣。
    通常External建立在Internal之上,其关系有两种,override和additional。Additional关系比较常见,通常是额外的折扣。
    计价逻辑的实现手段有两种:一种是Rate Table,另一种是Formula Engine。对于Internal层次的来说,Rate Table比较常见。
    Product对象的这两个逻辑都或多或少的与Contract相关联。如同《分析模式》中描述的Quote那样,这两个逻辑将是独立的Specification。
 
    Contract
    Contract是核心业务系统的关键。通常一个业务上的contract包括一系列的子contract。同时Contract又有多种类型。同product一样,contract可以分为main contract和rider contract。典型的如Payment Agreement, Deliver Agreement都是rider contract。
    同Product一样,Contract域包含两个逻辑,contract的package规则和计价逻辑。
    不同类型的Contact包括不同的子contract。例如:保险系统中ILP和UP就包含了不同的子contract。
    Contract也拥有计价逻辑,而且通常和sale channel相关,如:通过网络定购给予一定优惠。其与Product的计价逻辑通常是additional的关系,override非常罕见。
    同Product一样,计价逻辑的实现手段也是Rate Table和Formula Engine。但对于Contract这一层次的来说,Formula Engine比较常见。
    一个contract不可避免的包含一个或多个Product,不过这里的Product和上面的Product不同,称为contract product加以区别,表现为:虽然product在定义层面已经规定了大量的责任关系(操作范围),当这些product被包含到contract中,通常会被参数化(子类型化),当然也有没有被参数化的情况,可以看作一个特例。
 
    由于Contract是核心业务系统的关键,Main Contract关联一个Life Cycle对象。如前所述,Life Cycle对象将是系统核心业务流程的驱动核心。另一个与Contract关联的是Request对象。
    出于后期进行业务回查,以及数据挖掘的需要,除了Contract Product,还需要记录所有相关Party在业务发生时的状态,即所谓的历史数据。 注意,这些数据并不是冗余数据。
        
    BTW:考虑金融市场下的,金融产品是虚拟的,它本身就是一个合同,包含了一系列的操作范围--责任。注意在这个情况下:一个product包含了一系列的操作范围--责任,从外部看,也呈现了一个完整的概念。而这与role的结构是很像的。虽然contract和product很自然的看成是include的关系,然而由于product本身是个完整的概念,使得我们可以反过来看,product修饰了contract。一个保单包含了不同的party,而保单中的保险产品修饰了保单--描述了不同party的责任关系。
分享到:
评论
9 楼 tuti 2007-02-17  
color uml已经说得很简洁明白了.
8 楼 yimlin 2006-10-17  
dada 写道
yimlin 写道
dada 写道
有点像ACORD模型,除非有推倒原有系统让业务流程适应标准的觉悟,要不然实施过程中会让人欲哭无泪。

acord在保险业算是个标准吧,不过在内部的关联上我感觉不如IAA做的好!

兄弟有什么IAA实施的best practice吗?
最近有个项目是基于IAA模型裁减出来俄。
问某专家:“如何验证项目是否成功应用了IAA?” 答:“靠经验....”
这玩意真是IBM挣钱的好玩意阿,扔个概念给你,实施不成功首先可以推卸给业务流程不规范,业务流程规范的话还有数据模型不规范兜着,数据模型由专家看着裁减的话,还有实施过程不规范兜着...


best practice是没有的,还真是靠经验。
IBM靠它混饭吃的嘛!
7 楼 dada 2006-10-17  
yimlin 写道
dada 写道
有点像ACORD模型,除非有推倒原有系统让业务流程适应标准的觉悟,要不然实施过程中会让人欲哭无泪。

acord在保险业算是个标准吧,不过在内部的关联上我感觉不如IAA做的好!

兄弟有什么IAA实施的best practice吗?
最近有个项目是基于IAA模型裁减出来俄。
问某专家:“如何验证项目是否成功应用了IAA?” 答:“靠经验....”
这玩意真是IBM挣钱的好玩意阿,扔个概念给你,实施不成功首先可以推卸给业务流程不规范,业务流程规范的话还有数据模型不规范兜着,数据模型由专家看着裁减的话,还有实施过程不规范兜着...
6 楼 yimlin 2006-10-17  
dada 写道
有点像ACORD模型,除非有推倒原有系统让业务流程适应标准的觉悟,要不然实施过程中会让人欲哭无泪。

acord在保险业算是个标准吧,不过在内部的关联上我感觉不如IAA做的好!
5 楼 yimlin 2006-10-17  
行为艺术家 写道
楼主直接说客户,产品,订单更容易理解些,我觉得客户和产品都相对独立些,订单与他们必然存在耦合关系,请问楼主怎么考虑解耦的?

客户太专有化,而且只是一种角色,对于一个在线书店来说,有三种角色,customer,provider和employee。
订单也太专有,通常一个订单是一个分析模式所说的合同夹,同样以在线书店为例,一个订单包括一个基本合同(买了什么东西,几份啊之类)和两个附加合同,一个货运合同(这里就有一个运费的概念)和一个付款合同。

解藕就只能靠接口或者抽象类来实现了,具体看项目的规模和复杂度。
通常是角色和产品是接口或者业务顶级类。订单不关联party,关联对应的角色。也关联产品。想springside所提供的例子。
复杂一点情况,可以独立定义不同的合同夹的子类(第二层级),关联或者耦合产品的子类(第二层级)等等类似的手法。

另外产品也是和合同存在约束关系的,以ebay的为例,卖家可以定义产品所支持的附加合同的,如只支持安付通和快递。
还有其他的,如某个产品需要一份额外的附加合同。

如果确实存在这样的双向关联关系,那么可以通过被我称为Product Line的领域对象来维护。这部分内容还没有放上我的blog。
而且一旦有这样的复杂性,通常就需要一个特别的visitor对象来展示某类产品(见分析模式产品一章),这个也将通过Product Line来维护。

partech 写道
product和contract之间是什么关系?谁依赖谁?

如上所说,简单模型下,基本合同依赖产品就可以了。
关系复杂的情况下,谁依赖谁将变的复杂。
4 楼 dada 2006-10-16  
有点像ACORD模型,除非有推倒原有系统让业务流程适应标准的觉悟,要不然实施过程中会让人欲哭无泪。
3 楼 partech 2006-10-16  
product和contract之间是什么关系?
谁依赖谁?
2 楼 行为艺术家 2006-10-15  
楼主直接说客户,产品,订单更容易理解些,我觉得客户和产品都相对独立些,订单与他们必然存在耦合关系,请问楼主怎么考虑解耦的?
1 楼 galaxystar 2006-10-15  
不是太理解!

相关推荐

    Python库 | domainmodel-0.12.tar.gz

    3. **实体(Entity)与值对象(Value Object)**:在DDD中,实体是有唯一标识的业务对象,而值对象关注的是属性的集合,不考虑其身份。库中可能会定义这些类,以封装业务规则并确保数据的一致性。 4. **聚合...

    面向对象的设计过程(有案例)

    3. **领域模型(Domain Model)** 领域模型是面向对象设计的核心,它反映了问题领域的概念和它们之间的关系。在这个阶段,我们需要定义类、接口和它们的属性及操作。IBM的实例可能展示了如何根据需求分析结果创建...

    Domain-Driven Design领域驱动设计

    对象模型(Object Model)在DDD中占据重要地位,通过实体(Entities)、值对象(Value Objects)和领域服务(Domain Services)构建。实体是拥有唯一标识且生命周期贯穿的应用对象,而值对象则是描述实体属性的不可...

    项目model、Dao层、业务层建模工具类

    首先,"model"层通常指的是领域模型(Domain Model),它是业务逻辑的核心,包含了对应用中实体和业务规则的抽象。在Java应用中,model类通常用来封装数据,定义业务操作方法,以及实现业务逻辑。建模工具类在此层的...

    领域驱动设计-精简版

    1. 实体(Entity):具有唯一标识的业务对象,如用户、订单等。实体之间的关系构成了业务逻辑的一部分。 2. 值对象(Value Object):关注于某个属性集合的值,例如地址、颜色等。它们不具有独立的标识,常用于描述...

    面向对象分析设计 OOAD

    2. **领域模型(Domain Model)**:领域模型是反映业务领域的核心概念、实体和关系的模型。它包含业务规则和业务逻辑,是OOAD的关键部分。领域模型的构建基于对问题域的理解,通过识别关键实体、属性、操作和它们...

    细说业务逻辑

    - **概述**:Domain Model 强调通过领域实体来表达业务逻辑,支持更复杂的业务场景。 - **分析**:虽然增加了初始开发成本,但长期来看提高了系统的可维护性和扩展性。 #### 3.5、各种架构模式的比较及选择 - **...

    领域设计驱动DDD简介.pdf

    1. 实体(Entity):具有唯一标识的业务对象,其状态和行为由领域模型定义。 2. 值对象(Value Object):关注于值而非身份的对象,例如地址、颜色等。 3. 聚合(Aggregate):由实体和值对象组成,维护业务规则的...

    领域驱动设计

    领域驱动设计(Domain-Driven Design,简称DDD)是一种软件开发方法论,旨在帮助开发团队创建高质量的软件解决方案,特别是针对那些业务逻辑极其复杂的系统。它强调将业务领域知识与软件设计紧密结合,以便更好地...

    jcommons-domain-model-jackson

    "jcommons-domain-model-jackson"是一个专门为Java设计的库,它结合了jcommons(一个Java通用工具库)和Jackson库的能力,以提供强大的对象到JSON的映射功能。Jackson是Java社区中最受欢迎的JSON处理库之一,因其...

    领域驱动设计与模型驱动开发

    与传统的J2EE架构或Spring+Hibernate的事务性编程模型相比,领域驱动设计更倾向于把业务对象和业务逻辑作为核心,而不是单纯关注数据持久化。在这种模式下,基础设施层为其他层提供支撑,包括数据持久化、通信以及...

    领域模型项目示例

    在IT行业中,领域模型(Domain Model)是一种重要的软件设计概念,尤其在企业级应用开发中占据核心地位。领域模型是对业务领域的抽象和简化,它包含了业务规则、业务实体以及它们之间的关系。本项目示例旨在提供一个...

    JAVA 课设 满汉楼餐厅点餐系统 程序设计报告

    - **Domain(实体)层**:封装业务对象。 - **Service层**:封装具体的业务逻辑。 - **Utils层**:包含通用工具类。 - **View层**:负责用户界面的显示。 ##### 2.2 框架的设计 - **前端框架**:可以考虑使用...

    充血模型设想实现(2010/07/30更新)

    充血模型,也被称为“Rich Domain Model”,是领域驱动设计(DDD)中的一种核心概念。在软件开发中,领域模型是对业务领域的抽象和建模,它包含业务规则、逻辑和状态。充血模型强调对象应该拥有自己的行为和状态,而...

    最新TERASOLUNAServerFrameworkForJavaDevelopmentGuideline

    - **MVC 框架**:实现模型(Model)、视图(View)与控制器(Controller)分离的设计模式。 - **O/R Mapper**:用于将对象映射到数据库表,实现对象与关系型数据之间的转换。 - **安全性**:确保应用程序的安全性,...

    1975年:1975年-ModelandoDomíniosRicos

    标题 "1975年:1975年-ModelandoDomíniosRicos" 提到的核心概念是“丰富的领域模型”(Rich Domain Model),这是一个软件架构设计中的关键概念,尤其是在面向对象编程和领域驱动设计(Domain-Driven Design, DDD)...

    Winform初学者之七层MVC

    7. 领域层(Domain Layer):包含业务对象和领域规则,是业务逻辑的核心。 在Winform应用中,学习如何有效地组织这七层结构对于提高代码质量、降低维护成本至关重要。你需要理解每个层次的作用,以及它们如何相互...

Global site tag (gtag.js) - Google Analytics