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

对Robbin《domain model的延伸讨论(重新编辑) 》一文质疑

阅读更多

《domain model的延伸讨论》 http://www.iteye.com/topic/57075
robbin试图用两个例子来支撑其观点似乎太过牵强!

1. ruby的代码中是domain model直接包含了操作集合的代码,java的理念则不是如此。用来比较优劣是否妥当暂且不说,首要的问题在于:domain model理念是哪个?是允许一个对象包含自己的集合操作还是不可以?
我以为目前并没有定论。
退一万步说,就算是允许,那么java可以参照的同级别的语言是有些ADO.NET的C#(C#是可以和ruby在ActiveRecord可比的),java想做不难!
再次,允许是一回事,好不好又是另一回事。

回到正题,既然是比较就要标准统一,表面上看都是同一个题目,其实背后的理念是不一样(由此引发的种种设计实现上的变化,robbin就得出了ruby可以做更多的逻辑,因而……),
然而我以为这样的比较是支持不了robbin的观点的。

2. robbin说:“但是Java如果不使用IoC方式注入,而是直接调用依赖类的静态方法,行为就被限定死了,复杂的类依赖关系的创建和织入就是一个很麻烦的问题,这也是Java引入IoC的主要原因。”
为什么不可以直接调用依赖类的静态方法,我可以不用IoC而用AspectJ。可以看看我之前写的blog
http://www.blogjava.net/AndersLin/archive/2007/02/09/95666.html
或者
http://yimlin.iteye.com/blog/53545
看上去有点抬杠,其实不是,看官们请冷静思考一下这个问题(又或各位不以为然,没有关系)。

因此robbin说:“对于Java来说,更加适合采用贫血的模型,Java比较适合于把一个复杂的业务逻辑分离到n个小对象中去,每个小对象描述单一的职责,n个对象互相协作来表达一个复杂的业务逻辑,这n个对象之间的依赖和协作需要通过外部的容器例如IoC来显式的管理。但对于每个具体的对象来说,他们毫无疑问是贫血的。”
从robbin写的这样java来看,似乎确实如此。然而java的程序的设计是否就此一种。
如果用AspectJ来重写代码,是否还需要那么多接口,那么类?同样加上annotation的应用,又可以省去xml文件
有关于dao的设计可以这样处理:
public class User{ public static UserFinder finder; ...... }
public interface UserFinder{ public List doQuery(...); ...... }
public class UserService{ public void FindByDept(...){ List list = User.finder.doQuery(....); .... } }
这里我选择保留了接口,实际的情况则是未必,各自选择。

3. Java在AspectJ的支持下,可以对domain model的各个方面的逻辑进行切割,就像C#的partial class那样,一个应用就是
http://yimlin.iteye.com/blog/54060
我以为是可以解决robbin所认为的一个”充血模型的坏处“:对象高度自洽的结果是不利于大规模团队分工协作。一个编程个体至少要完成一个完整业务逻辑的功能。对于单个完整业务逻辑,无法再细分下去了。

4.如果robbin的观点是:ruby和java在实践domain model理念中,因为ruby的语言特性及其设计理念比java的有自己的优势,那我认为没有什么问题。而现有观点太过草率和武断了。


BTW:感谢newman对小弟《小议领域模型》一文的认可。

分享到:
评论
6 楼 yimlin 2007-03-06  
complystill 写道
我感觉Robbin的原文, 表面是

Ruby vs Java

实则

RoR.ActiveRecord vs ORM.Hibernate

比较的是两种语言的主流Paradigm, 而不是语言本身的全部能力.
基本上同意!

而且我本人对于ActivieRecord是否可以是Domain Model保留质疑,或许ROR下可以这么做吧!

当然里面还涉及的对象关系逻辑的处理,就引出了IoC和AspectJ,我今天才看到那个《为什么java里不能把域对象和DAO合并,rails里面就可以? 》(http://www.iteye.com/topic/56949),我估计robbin应该就是从这个帖子发起其讨论的。
5 楼 歆渊 2007-03-06  
我感觉Robbin的原文, 表面是

Ruby vs Java

实则

RoR.ActiveRecord vs ORM.Hibernate

比较的是两种语言的主流Paradigm, 而不是语言本身的全部能力.
4 楼 ahuaxuan 2007-03-05  
有时候讨论太学术话了一点了,怎么用实用,怎么用大家都容易理解,怎么用节省时间就怎么用,不是说怎么用理论上更oo就怎么用,如何如何,如同用hibernate一样,有的人总是嚷嚷如何如何oo才是真正的用好了hibernate,说这种话的人不是菜鸟就是大牛,夹杂在中间的人追求的是实用
3 楼 yimlin 2007-03-05  
从ruby到ror不需要学习吗?
我们的观点分歧在于:你认为ruby->ror的学习都是必要的,而java只要学习语言,此外的IoC和AspectJ都是额外的。问题是:真是这样吗?

此外aspectj带来的收益可不只是类似,而是超越ror
2 楼 dennis_zane 2007-03-05  
说真的,为了做到ror似的充血模型,我非要再去专门学下AspectJ,这不正说明了robbin的结论:

Java不适合充血模型,在表达复杂的业务逻辑的能力上,Java要比ruby差很多
1 楼 justcode 2007-03-05  
我看不懂也要抢个沙发.

相关推荐

    MFC SDI制作Office2007样式的Robbin菜单.docx

    ### MFC SDI 制作 Office 2007 样式 Robbin 菜单 #### 一、概述 Microsoft Foundation Classes (MFC) 是一个由微软开发的类库,用于简化 Windows 应用程序的开发过程。本文档旨在介绍如何在 MFC 单文档界面...

    Robbin Fan—运营专业型社区的经验和反思.ppt

    Robbin Fan—运营专业型社区的经验和反思.ppt

    范凯个人网站源码robbin_site.zip

    robbin_site 是范凯的个人网站 http://robbinfan.com 网站的源码。 标签:robbin

    javaeye Robbin 论缓存技术

    在Javaeye Robbin的讨论中,他提到了缓存技术在多种场景下的应用和重要性。 **缓存的作用** 1. **高速缓冲存储**:缓存是一种位于主存储器和慢速I/O设备之间的高速存储器,其目的是减少对慢速设备的访问次数,提高...

    Git常用命令备忘 - robbin的自言自语1

    Git是分布式版本控制系统,用于跟踪对文件和项目代码的更改。在本文中,我们将深入探讨Git的一些常用命令,这些命令对于日常开发和协作至关重要。 首先,配置Git是使用它的第一步。通过`git config`命令,我们可以...

    Ribbon For DELPHI 10.1 BERLIN.7z

    Ribbon组件的核心在于它的布局设计,它将功能按钮按照功能区进行分类,如“文件”、“编辑”、“视图”等,每个功能区下又包含多个命令按钮。这样的设计使得用户可以快速找到所需的功能,降低了学习成本。在Delphi中...

    Struts2学习资料(强烈推荐)

    1. **MVC模式**:Struts2是基于Model-View-Controller(MVC)设计模式的,它将业务逻辑、数据模型和用户界面分离,提高了代码的可维护性和可重用性。 2. **Action类**:每个用户请求都会映射到一个Action类,这是...

    atl word插件源代码

    ATL(Active Template Library)是Microsoft提供的一种C++库,用于简化COM(Component Object Model)组件的开发。在本项目“atl word插件源代码”中,开发者利用ATL技术创建了一个Word插件,该插件能与Microsoft ...

    robbin谈管理:我敬佩的3位CEO管理者

    GE在韦尔奇任内20年实现了每年30%的高速增长,市值曾经达到全球第2,是全球最著名的CEO楷模。韦尔奇写的两本书:一本自传,一本Winning我读了很多遍,我觉得最有意思的反差是,尽管韦尔奇整个职业生涯都在GE渡过,...

    向Excel文件添加RibbonXml

    2. **创建XML文档**:使用文本编辑器或专门的Open XML编辑器创建一个新的XML文件,按照RibbonXML的规范编写代码。例如,你可以定义一个名为"MyTab"的选项卡,包含一组"MyGroup",并在这个组里添加一个"MyButton"。 ...

    教你学Windows 7附件中的老家伙.docx

    通过这种新的界面,写字板的主要功能在界面上方一览无余,我们可以很方便地使用各种功能,对文档进行编辑、排版。 三、画图 Windows 7 中的画图工具也引入了 Ribbon 菜单,从而使得这个小工具的使用更加方便。此外...

    一个基于WPF+ C# 实现的Ribbon 控件库程序代码

    【标题】中的“一个基于WPF+C#实现的Ribbon控件库程序代码”表明这是一个使用Windows Presentation Foundation(WPF)框架和C#编程语言开发的软件项目,专注于创建Ribbon用户界面元素的控件库。...

    spring cloud 组件整合 eureka gateway feign hystrix,各个模的整合,供大家一起学习

    在Spring Cloud生态系统中,Eureka、Gateway、Feign和Hystrix是四个核心组件,它们协同工作以构建出高可用、高性能的微服务架构。让我们深入探讨这些组件以及它们如何整合。 ...它是一个基于REST的服务,用于定位服务...

    获取ip地址方法与示例

    在IT行业中,获取IP地址是一项基础且重要的任务,特别是在网络通信和服务器开发中。这篇文章将详细探讨“获取IP地址的方法与示例”,并基于提供的标签“源码”和“工具”进行深入解析。 首先,我们需要了解什么是IP...

    Struts2技术内幕:深入解析Struts架构设计与实现原理

    资源名称:Struts2技术内幕:深入解析Struts架构设计与实现原理内容简介:本书由国内极为资深的Struts2技术专家(网名:downpour)亲自执笔,iteye兼CSDN产品总监范凯(网名:robbin)以及51CTO等技术社区鼎力推荐。...

Global site tag (gtag.js) - Google Analytics