`
Joo
  • 浏览: 47274 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

也谈领域对象的数据与动作分离

阅读更多
说来惭愧, 某日项目组成员交上来领域模型类图,将对象的属性和方法分类,基本上统统使用了DomainObject-DomainObjectManager的方式,前者之后属性以及对应的getter-setter方法,后者包含具体的业务操作.在我询问为什么要这么做的时候,对方反问为什么不能呢,我说这样不符合OO,OO的对象是具有属性已经在此属性上具有操作能力的一种东西,他说分开来一部分用作PO对应数据库表,动作部分用来做基本业务处理难道不好吗? 我一时语塞...只能饮用Robin的一段:
引用
首先要区别持久对象和POJO。

持久对象实际上必须对应数据库中的entity,所以和POJO有所区别。比如说POJO是由new创建,由GC回收。但是持久对象是 insert数据库创建,由数据库delete删除的。基本上持久对象生命周期和数据库密切相关。另外持久对象往往只能存在一个数据库 Connection之中,Connnection关闭以后,持久对象就不存在了,而POJO只要不被GC回收,总是存在的。

由于存在诸多差别,因此持久对象PO(Persistent Object)在代码上肯定和POJO不同,起码PO相对于POJO会增加一些用来管理数据库entity状态的属性和方法。而ORM追求的目标就是要 PO在使用上尽量和POJO一致,对于程序员来说,他们可以把PO当做POJO来用,而感觉不到PO的存在。



难道这就是传说中的贫血Domian  Model,而所谓的Service其实就是这些个Manager的集合?



  • 大小: 32.9 KB
分享到:
评论
16 楼 jasin2008 2009-03-02  
目前就是这样做的,不过看了lz的引用,又有了点新的想法,在实际业务中,domain ojbect是不应该存在update_time,remark等与业务无关的属性,这些属性应该是属于po,只是orm的存在我们可以把pojo当作po来用,导致在pojo中存在所有数据库中的字段,而不分该字段是否是domain相关
15 楼 毁人不倦 2009-02-09  
本人理解领域模型应该是需求分析的范畴,是系统分析和设计的输入,系统分析根据领域模型建立分析模型,而系统的设计与使用的应用框架相关,如果单说领域模型的话,不应该有贫血只说。
14 楼 瀚愚 2009-01-29  
wq163 写道
如果把所有的基础架构代码或者业务代码放置到领域模型类中,这些类就变得“肥胖不堪”,难于使用和维护。但是,如果我们把它放在领域模型类之外,我们又使其变为“贫血的”领域模型,不能充分利用面向对象的潜力。

实现充血模型的一个比较好的实践是使用领域对象代理子类,不知楼主的manager是不是可以看做或当做DomainObject的代理子类(我不知道具体代码不敢确定),如果可以的话,那么manager和DomainObject可以作为一个整体,这样就是个很优雅的DDD实践,貌似贫血但其实是充血的




期待给出一段代码来看看
13 楼 wq163 2009-01-24  
如果把所有的基础架构代码或者业务代码放置到领域模型类中,这些类就变得“肥胖不堪”,难于使用和维护。但是,如果我们把它放在领域模型类之外,我们又使其变为“贫血的”领域模型,不能充分利用面向对象的潜力。

实现充血模型的一个比较好的实践是使用领域对象代理子类,不知楼主的manager是不是可以看做或当做DomainObject的代理子类(我不知道具体代码不敢确定),如果可以的话,那么manager和DomainObject可以作为一个整体,这样就是个很优雅的DDD实践,貌似贫血但其实是充血的


12 楼 chemsnake 2008-09-20  
答:因为企业级的Web+业务逻辑+数据库应用不适合OO。
为什么这样说呢?一个数据模型是对一套业务的完整抽象,因此数据库是业务系统的骨干。不幸的是,当前流行的数据库是关系型数据库而非OO数据库,这就造成了整个架构上的不匹配。所以从整个系统的架构上来说,并非OO,包括PO和DAO在内的方法,元素都是借用了一个OO语言描述一个非OO的语意。因此不应强制一定要OO,可以在实现具体业务时借用OO,但整个架构上并非如此。 ??
11 楼 Joo 2008-09-20  
当前遇到的问题是ibatis好像不太容易执行动态生成SQL,各位有没有什么经验
因为sql中where字句是通过具体的运行时逻辑产生的
10 楼 pikachu 2008-09-19  
ray_linn 写道
是不是充血的鸡翅就能比贫血的鸡翅卖得更好价钱?

不能的话没事干嘛折腾自己,统统贫血,不是简单又美味吗?



+1
9 楼 ytuwlg 2008-09-19  
在MIS中的“构件”通常就是包括属性和操作,例如“入库单”。形成构件库,不知用这种方式如何组织??
8 楼 yangyi 2008-09-19  
答:因为企业级的Web+业务逻辑+数据库应用不适合OO。
为什么这样说呢?一个数据模型是对一套业务的完整抽象,因此数据库是业务系统的骨干。不幸的是,当前流行的数据库是关系型数据库而非OO数据库,这就造成了整个架构上的不匹配。所以从整个系统的架构上来说,并非OO,包括PO和DAO在内的方法,元素都是借用了一个OO语言描述一个非OO的语意。因此不应强制一定要OO,可以在实现具体业务时借用OO,但整个架构上并非如此。
7 楼 ray_linn 2008-09-19  
是不是充血的鸡翅就能比贫血的鸡翅卖得更好价钱?

不能的话没事干嘛折腾自己,统统贫血,不是简单又美味吗?
6 楼 davidgrubby 2008-09-19  
finalbone 写道
Manager和Service其实是两层 如果硬要搅在一起就更加不OO了

把Domain Object和DomainObjectManager看成一个整体

有点类似于bridge模式 service是更上一层的东西

这个话有点不理解,那Mgr里面包含的是些什么东西?bridge的设计模式在Spring中不就是将抽象的业务逻辑(service)和真正操作数据的实现(DAO)分开吗?

那楼主认为有问题的东东问题有在哪里呢?
5 楼 chenjianjx 2008-09-18  
这是老问题了,可以概括为  Domain Model 和 Transact Script 两种企业级模式的区别。 Martin Fowler 曾在这个问题上说了很多口气很大的话,却没什么说服力。总之这个问题还在争论中,还没争出什么结果。我个人偏向 Transact Script模式,因为我觉得把 持久化做得完全透明,本来就是很危险的事情,而且设计者在心理上也不需要这种透明。
4 楼 finalbone 2008-09-17  
Manager和Service其实是两层 如果硬要搅在一起就更加不OO了

把Domain Object和DomainObjectManager看成一个整体

有点类似于bridge模式 service是更上一层的东西
3 楼 downpour 2008-09-17  
为什么要把Domain Object和DomainObjectManager对应起来?太死板了。

你把Domain Object理解成你系统中所有的管理对象,把所有的Manager理解成你系统所有的对外接口就可以了。所谓的Manager或者Service是一组可进行系统操作的接口集合,而不是机械性的对Domain Object进行CRUD的操作。
2 楼 惊鸿逝水 2008-09-17  
其实这样做也很好呀,本来就没血,干嘛非要脑充血?OO不OO不是教条
1 楼 lzy.je 2008-09-17  
有同感,现在身边有很多同事也是这样考虑、设计模型的。把行为、状态分离到一组类中,而将操作的数据(一时也含状态)都放在另外的一组类中,就如上面的图中那样。一些同事还把这种情况和MVC结合,当然了他是把MVC当成了架构模式来看的,实际上MVC是表示模式。说M主要是负责数据加工的(行为对象),而数据对象则统统为了M和V通信,做为被加工的对象。

现在也有些困惑,感觉这样也OO是违背的,但当大家问到为什么不能这样设计时也很难和其解释。
另外还有重要一点,我感觉这和模型所在的业务有关,觉得做MIS业务很容易就形成这样的设计。而如果做一些框架、工具则不太可能这样这种情况。

和大家探讨。

相关推荐

    QTP脚本数据分离管理

    【QTP脚本数据分离管理】是自动化测试领域中一种高效的方法,用于将测试脚本与测试数据分离开来,以提高脚本的可维护性和复用性。QuickTest Professional(QTP)是HP(现称Micro Focus)推出的一款功能强大的自动化...

    领域事件Demon

    事件的发布通常在领域对象的方法中完成,当某个业务条件满足时,领域对象会触发相应的事件。发布事件通常通过事件总线(Event Bus)来完成,事件总线负责将事件分发到订阅者。 **事件处理** 领域事件的处理分为两种...

    第 面向对象方法论PPT课件.pptx

    与传统方法不同,面向对象方法不将数据和处理分离,而是将它们视为一个整体,使对象成为处理的主体,能够主动执行操作,而不是被动地接受外界指令。 面向对象方法的四个要点是: 1. **对象的定义**:世界由对象...

    面向对象复习题.doc

    面向对象编程是一种重要的软件开发方法,它以对象作为基本的构造单元,强调数据与操作的封装,通过继承、多态等特性实现代码的重用和灵活性。以下是对面向对象编程相关知识点的详细解释: 1. **对象的抽象**:对象...

    DDD领域驱动设计初探(6):领域服务 - 文章 - 伯乐在线1

    这种方法使得业务逻辑与数据访问分离,保持了领域模型的纯净。 总结来说,领域服务是DDD中处理跨实体操作的重要工具,它提供了一种方式来封装那些不能简单归于单个实体或值对象的业务行为。通过合理地划分聚合并...

    面向对象参考题 给学生

    26. 面向对象分析与设计与面向功能分析的区别在于,前者基于对象和类的抽象,后者基于功能分解和数据流。 27. 用例“创建新订单”、“更新订单”与“核查客户帐号”的关系可能是包含(include),表示核查客户帐号...

    JSP方面的面试资料汇总 pdf 这是一些JSP方面的面试资料汇总 pdf格式,都是些面试时候经常涉及到的常见问题,不要小看这些问题,往往是简单的东西才容易被忽略,有空时候还是翻番看为好,本资料的内容涉及JSP基础概念、内置对象、动作等,还包括一些JAVA方面的面试资料。

    除了基础概念和内置对象,JSP的动作也是面试中的高频考点。JSP动作包括标准动作和自定义动作,标准动作如jsp:forward、jsp:param等用于页面请求的转发和参数传递;自定义动作则需要开发者根据实际需要编写。此外,...

    MvcContrib分离ASP.NET+MVC项目源码

    MvcContrib 是一个针对 ASP.NET MVC 框架的开源扩展库,它提供了许多额外的功能和工具,以增强和简化...此外,这也有助于开发者掌握 ASP.NET MVC 框架的高级特性和最佳实践,进一步提升其在 .NET 开发领域的专业技能。

    面向对象的mvc

    面向对象的MVC模式是一种软件设计模式,全称为Model-View-Controller,广泛应用于Web开发领域,特别是Java、.NET等平台。这个模式的主要目的是分离应用程序的业务逻辑、用户界面和数据模型,使得代码更易于维护和...

    kinectV2获取深度图像和彩色图像

    在编程领域,开发者可以通过SDK来访问这些数据,实现各种有趣的应用,如虚拟现实、体感游戏、人机交互等。本文将详细介绍如何使用Kinect V2获取深度图像和彩色图像。 首先,我们需要了解Kinect V2的硬件结构。它...

    form_object:与模型分离的表单对象

    在IT行业中,尤其是在Web开发领域,表单对象(Form Objects)是一种常见的设计模式,它将表单处理逻辑从模型(Model)中分离出来,以提高代码的可读性、可维护性和可测试性。"form_object:与模型分离的表单对象"这...

    qtp学习与实践经验总结4

    QTP支持数据驱动测试,可以从外部数据源(如Excel、Access)导入数据,使得测试用例与数据分离,便于维护和扩展。 五、脚本语言 QTP使用VBScript作为内置脚本语言,允许用户自定义逻辑,进行更复杂的测试操作。 六...

    自定义mvc架构的数据处理

    在IT行业中,MVC(Model-View-...通过分离关注点,这种架构提高了代码的可读性和可维护性,同时也便于团队协作。在实际项目中,开发者可以根据具体需求对每个组件进行扩展和定制,以达到最佳的性能和用户体验。

    p-finder 高斯分布用于背景分离。97年PAMI最早那篇

    通过对背景进行建模,Pfinder能够从背景中分离出前景对象,即需要追踪的人体部分。这种方法的一个关键优势在于能够处理阴影和光照变化等挑战。 ##### 3. 实时性能与硬件需求 为了确保实时性能,Pfinder在设计时考虑...

    OpenCV动作识别源码.zip

    OpenCV(开源计算机视觉库)是一个强大的工具,用于处理图像和视频数据,广泛应用于计算机视觉、机器学习和人工智能领域。这个"OpenCV动作识别源码.zip"文件很可能包含了一系列实现特定动作识别算法的代码示例。动作...

    DDD.rar_DDD设计 例子

    5. **仓储**:在新闻系统中,需要持久化这些领域对象。仓储(Repository)接口提供了一种封装数据访问的方式,使得业务逻辑与数据存储技术分离。 6. **语言建模**:领域专家(Domain Expert)和开发人员之间的沟通...

    QTP学习与实践经验总结(11章全).

    动作是QTP中的基本执行单元,而参数化则允许我们将数据与测试脚本分离,提高测试的灵活性和可复用性。这部分内容会讲解如何创建、编辑和调用动作,以及如何使用数据表进行参数化测试。 四、对象与属性 QTP中的对象...

    ADR介绍-echo.pdf

    ADR模式的核心思想在于动作直接与领域逻辑交互,然后将结果传递给响应器。这样可以更好地遵循单一职责原则,将不同类型的代码分离,便于测试和维护。在ADR模式下,HTTP方法是与领域逻辑分离的,允许领域逻辑保持业务...

    Struts2 技术内幕读书笔记(1)

    例如,在处理用户请求时,一个控制器对象可能需要与多个服务对象协同工作。 #### 框架的本质 框架是一种预先设计好的软件结构,用于解决特定领域的问题。它为开发者提供了一个基础平台,使得开发者能够在此基础上...

Global site tag (gtag.js) - Google Analytics