`

关于领域建模的实现

阅读更多
关于领域建模的实现

[url]http://gigix.blogdriver.com/gigix/166013.html [/url]


我们现在的做法是Transaction Script模式(http://www.martinfowler.com/eaaCatalog/transactionScript.html)。实体(也就是需要持久化的对象,有时我们也说它们就是领域对象)只是原始数据的对象形式,或者加上一些最简单的操作(只涉及本身数据的简单处理)。DAO负责将数据转化为实体对象,我们通常用Hibernate来实现。业务逻辑放在service里,每个service方法是一个Transaction Script。AppFuse(http://https://appfuse.dev.java.net/)也是按这种方式架构的。

Martin Fowler更倾向于Domain Model模式(http://www.martinfowler.com/eaaCatalog/domainModel.html)。领域对象不仅是原始数据的对象形式封装,而且包含几乎所有重要的业务逻辑。领域对象可以直接访问数据库,因此DAO不是必要的,而是通过一个他称为“mapper”的东西提供O/R映射。由于领域对象封装了业务逻辑,service只是一个很薄的facade,提供面向服务的接口。Spring的JPetstore范例就是按照这种方式架构的。但是,JPetstore的业务逻辑相当简单,我草草看了一下,似乎领域对象没有直接操作持久化逻辑,因此这并不是一个很有说服力的例子。或许更有说服力的是Pluto(http://jakarta.apache.org/pluto/)。在Pluto这里,需要持久化的大多是些配置信息(包括portal本身的配置、portlet的配置和用户配置),它并没有使用DAO,而是直接通过XML binding持久化到XML文件。

我不知道应该如何选择这两个体系结构模式。我不知道Transaction Script模式的缺点在哪里。我不知道Domain Model模式用起来会有什么困难。我不知道Martin Fowler为什么如此激烈地批评“贫血的领域对象”。这让我感到困惑和苦恼。我要首先再看一遍PoEAA的相关章节,再想想,再问问。我不喜欢感觉自己像个白痴。


http://gigix.blogdriver.com/gigix/168486.html

下午Jacques Lebrun帮忙找到了Domain Driven Design,还没来得及看。Martin Fowler说应该由Domain Model负责访问持久化逻辑,并借助Data Mapper封装持久化的实现细节。但是,我竟然找不到这样的一个例子。Spring JPetstore细看之下原来也是Transaction Script,只不过service的方法都非常非常简单,前天乍一看还以为和我们做的Transaction Script有什么不同呢。
看JPetstore唯一的收获是:不要使用DTO,用轻量级持久化框架(例如Hibernate或者iBatis),直接把实体对象到处传。

Domain Model模式看了仍然是半懂不懂,很多细节上的问题想不清楚。比如说,领域对象(或者说,实体)的创建和查找(对应于DAO的create方法和load方法)由谁来调用?仍然在service里调用吗?如果要放到实体类,在创建/查找操作之前,没有一个具体的实体对象存在的,那么就只能放在一个static方法里了,这是一个好的做法吗?

到哪里可以找到一个Domain Model体系结构的例子?我想看看究竟应该怎样去做。如果到明天晚上还没有进展,我就写信去问Martin Fowler本人。



http://gigix.blogdriver.com/gigix/168634.html

Potian几句话说得我好象有点开窍了。

原来,采用什么体系结构模式取决于我的实体(领域对象)干什么、我要持久化什么。如果像Pluto、OSUser,领域对象本身有复杂的功能,持久化的是一个功能组件的状态,Domain Model就比较合适。而我们做的很多web应用,实体代表的是简单的数据(比如“用户”,甚至是某种公文),业务操作大多是对领域对象的CRUD操作,Transaction Script就挺合理。我感觉桌面应用和这种web应用好象有点区别,原来就是这个区别:它们的业务操作是做了不同的事。

刚才对G-Roller做了一点修改,取消了DTO(http://www.aspectoriented.org:9080//space/2004-04-22#DTO?_我需要吗?),直接把实体传到表现层,感觉除了让程序变简单之外,并没有什么影响。不过有一点:接口上好象不那么漂亮。比如说,User有个getPosts()方法,但User和Post的关联是lazy的,如果直接在表现层调用User.getPosts()方法,就有可能来一个LazyInitializationException。当然,表现层本来就不应该这样获得Post对象,但这个接口是不是会给使用者造成困惑呢?好象又有点不开窍了。


http://gigix.blogdriver.com/gigix/169972.html

一个体系结构重构模式- -

名称:
用Domain Model替代Transaction Script

意图:
你的业务层采用Transaction Script模式实现
你希望将实现方式改为Domain Model模式

Bad Smells:
Long Method / Large Class——由于放置Transaction Script的service组件涉及全部业务逻辑的实现细节,其方法很容易变得冗长;如果对其使用Extract Method重构,则会使service实现类变得庞大。
Duplicate Code——不容易从现有的Transaction Script中找出可复用的代码,因此常常重复实现类似的逻辑。
Switch Statements——在领域对象有继承关系时,Transaction Script需要对不同类型的领域对象做不同的操作,此时容易造成基于类型的switch语句。
Data Class——领域对象只携带了数据,作为对象的职责不够。

重构过程:
使用Extract Method,消除Transaction Script中的重复代码。
使用Move Method,将领域对象固有的业务逻辑移到领域对象类中。
如果该方法需要使用DAO,则将DAO作为参数传入。
如果该方法需要使用其他service,说明该方法并不适合存在于特定领域对象类,而应该仍然存在于service组件中。
如果领域对象是一个继承体系,将业务逻辑移到其基类中。
如果第2步搬移的方法中有switch语句,使用Replace Conditional with Polymorphism消除之,将业务逻辑分配到领域对象的各个子类。


分享到:
评论
1 楼 rustlingwind 2008-10-23  
好文好文,ding~~

相关推荐

    jtest domain领域建模工具

    通过使用jtest domain领域建模工具,开发者可以更加专注于业务逻辑的理解和实现,降低因需求理解不准确导致的返工,提升软件项目的成功率。同时,清晰的领域模型也有助于团队之间的沟通,减少误解,提高整体项目效率...

    领域建模技术概述之-分清问题域和问题解决域.docx

    "领域建模技术概述" 领域建模技术是指对业务问题域和问题解决域的分析和建模,以帮助企业更好地理解业务本质,挖掘业务工作的内涵,并将业务知识转化为可视化的模型。领域建模技术的核心是对领域的理解和分析,领域...

    面向领域建模

    面向领域建模(Domain-Driven Design,简称DDD)是一种软件开发方法,由Eric Evans在其同名著作《领域驱动设计:软件核心复杂性应对之道》中提出。DDD的核心思想是将复杂的业务逻辑通过深入理解领域知识来建模,使得...

    北邮软件工程分布式系统中需求定义领域建模用例建模

    总的来说,这个资料包提供了从需求分析到系统设计的全面视角,包括了需求定义、领域建模和用例建模的关键实践,对于理解如何构建一个分布式软件系统,特别是温控系统的实现,具有很高的学习价值。学习这些知识可以...

    000001_DDD领域建模知识分享.pptx

    【DDD领域建模】是软件开发中的一种高级设计方法,由Eric Evans在其2004年的著作《领域驱动设计——应对复杂软件的核心挑战》中提出。DDD的核心目标是通过深入理解业务领域,创建反映业务规则和流程的模型,以此来...

    从领域建模到模型驱动--j建模理论进展

    为了有效地实现领域建模,需要设计专门的领域建模语言(Domain-Specific Modeling Language, DSML)。这些语言专注于特定业务领域,提供了一种直观的方式来描述业务概念和规则。 **1. 领域建模语言的特点:** - **...

    DDD 领域驱动设计 领域建模PPT

    下面将详细阐述领域建模、事件风暴、限界上下文以及设计经验实战示例等关键概念。 首先,领域建模是DDD中的核心实践,它涉及到识别和表达业务领域的关键实体、值对象、聚合、领域事件等元素。领域模型应清晰地反映...

    基于DDD的领域建模中的模版和工具实践(36页).pdf

    DDD中的模板和工具是实现领域建模的重要辅助手段。模板可以帮助开发者遵循最佳实践,快速搭建起模型的框架,而工具则可以进一步提升建模的效率和准确性。以下是基于DDD的领域建模中的一些关键知识点: 1. **领域...

    软件工程之全程建模实现

    《软件工程之全程建模实现》采用UML建模实现了软件工程的主要过程:需求、分析、设计、代码导出、设计模型维护等。本书采用了大量国内实际工程软件过程中的截图,通过图形和示例来描述工程实际中的问题和过程。这在...

    面向问题域的领域建模方法

    ### 面向问题域的领域建模方法 #### 引言 随着信息技术的快速发展,软件开发已成为现代社会不可或缺的一部分,并且对于经济和技术的发展起着至关重要的作用。然而,尽管经过了几十年的研究和发展,软件开发仍然...

    领域建模工具metaedit++介绍

    ### 领域建模工具MetaEdit++介绍 #### 一、引言 随着软件工程领域的不断进步,针对特定领域的模型语言(Domain Specific Modeling Languages,简称DSMLs)逐渐受到越来越多的关注。DSMLs旨在帮助领域专家在进行...

    多领域统一建模语言Modelica及其仿真平台

    虽然基于接口的多领域建模方法可以利用不同仿真软件之间的接口实现集中式协同仿真,但这种方法依赖于商业软件公司的专用接口,限制了其研究潜能。 Modelica语言和基于该语言的仿真平台的提出,为解决多领域建模问题...

    一次领域建模的实战之旅.docx

    领域建模是一种重要的软件开发方法,它关注于理解和表达业务领域的复杂性,通过抽象和建模来创建可复用的对象模型。在这个过程中,我们借鉴了《分析模式:可复用的对象模型》、DDD(领域驱动设计)以及彩色UML等建模...

    Koala领域建模工具

    也可以通过对系统的实验或统计数据的处理,并根据关于系统的已有的知识和经验来建模。还可以同时使用几种方法。建模简单概括就是建立模型的过程。建模是一种通过抽象、简化和符号化的方法,将现实世界中的问题转化为...

    软件分析建模与PowerDesigner实现

    在软件工程领域,分析建模是理解系统需求、组织信息和设计解决方案的重要手段,而PowerDesigner则为模型的创建、管理和交流提供了便利。 首先,我们需要理解分析建模的核心概念。分析建模主要是通过一系列图表和...

    《软件工程之全程建模实现》(青润)(114页)

    ### UML建模与软件工程全程...通过以上内容可以看出,《软件工程之全程建模实现》是一本全面覆盖软件工程理论与实践的专业书籍,不仅适合于从事软件开发的专业人士阅读,也适合对软件工程感兴趣的初学者作为入门教材。

    数学建模算法matlab实现大全

    《数学建模算法matlab实现大全》是一本深入探讨数学建模中常见问题及解决方案的著作,特别关注如何使用强大的编程工具MATLAB进行算法实现。MATLAB,全称Matrix Laboratory,是数学、工程和科学领域广泛应用的一种...

    领域建模PPT(bang网站上的)

    而DDD进一步强化了这个概念,提出领域模型应当是分析原型和软件设计的基础,建模和设计过程应当迭代进行,建模专家需要理解设计,反之亦然。 DDD倡导采用分层架构来组织系统,包括表现层、应用层、领域层和基础层。...

    领域建模的易与难(27页).pdf

    在“领域建模的易与难(27页)”这个PDF文档中,我们可以看到作者对DDD实践的深入探讨,包括其优点、挑战以及如何在实际项目中应用DDD原则。 首先,领域模型是DDD的核心,它是对业务领域的抽象表示,包含了业务规则...

Global site tag (gtag.js) - Google Analytics