论坛首页 Java企业应用论坛

领域模型的价值与困境

浏览 44056 次
该帖已经被评为精华帖
作者 正文
   发表时间:2008-12-23  
能否把此篇制成PDF 以飨食大家
0 请登录后投票
   发表时间:2008-12-23  
赞同上面几位说过的一些话
简单 实用 应该是最好的 OO的思想就是现实的体现
0 请登录后投票
   发表时间:2008-12-24  
业务与技术要分开,却一定需要懂业务也懂技术的人。
0 请登录后投票
   发表时间:2008-12-24  
robbin 写道

所以最终我对这个问题的总结就是:

一、只要技术框架能够实现,尽量使用领域模型

二、无论Java还是Ruby,必须消灭DAO和TransactionScript

三、领域模型不必All-in-One,Java可以分割为 1个entity bean和几个business bean,而Ruby可以分割为1个model和几个mixin的module。




对于第3点能举例说下么,我不是很明白在代码中应该怎么写?
0 请登录后投票
   发表时间:2008-12-24  
据个例子,我有个Member类,对应数据库的member表,我页面上有个grid,列里显示出member表的全部列,这个Member类分个人会员和企业会员,如果是企业会员的话我要去查企业会员表,个人会员的话个人会员表,我这个domain model调用了dao去查数据库,domain model里可不可以去调用dao查数据库(原因?),我这里该怎么改才比较好。

会员类
pubic class Member {
    private Long id;
    private Integer type; //会员类型 (1,个人会员 2,企业会员)
    ......
    private ICompanyMemberDao companyMemberDao = BeanUtil.getBean("companyMemberDao");

    ......

    /**
     * 取得公司的名称
     */
    public String getCompanyName() {
        if (type == 1) {
            return getPerson().getPersonName();
        } else {
            return getCompanyMember().getCompanyName();
        }
    }
    
    /**
     * 获取企业会员
     */
    public CompanyMember getCompanyMember() {
        if (this.companyMember == null) {
            this.companyMember = companyMemberDao.findCompanyMemberByMid(id);
        }
        return this.companyMember;
    }
    
    /**
     * 获取个人会员信息
     */
    public Person getPerson() {
         if (this.person == null) {
             this.person = personDao.findPersonByMid(id);
         }
         return this.person ;
    }
}




0 请登录后投票
   发表时间:2008-12-30  
读完后,感觉一点想法都没有了,一下子世界清静了许多。
0 请登录后投票
   发表时间:2008-12-31  
深深体会过被DAO限制的痛苦,是时候消除DAO层了。
0 请登录后投票
   发表时间:2009-01-21  
xredleaf 写道
据个例子,我有个Member类,对应数据库的member表,我页面上有个grid,列里显示出member表的全部列,这个Member类分个人会员和企业会员,如果是企业会员的话我要去查企业会员表,个人会员的话个人会员表,我这个domain model调用了dao去查数据库,domain model里可不可以去调用dao查数据库(原因?),我这里该怎么改才比较好。

会员类
pubic class Member {
    private Long id;
    private Integer type; //会员类型 (1,个人会员 2,企业会员)
    ......
    private ICompanyMemberDao companyMemberDao = BeanUtil.getBean("companyMemberDao");

    ......

    /**
     * 取得公司的名称
     */
    public String getCompanyName() {
        if (type == 1) {
            return getPerson().getPersonName();
        } else {
            return getCompanyMember().getCompanyName();
        }
    }
    
    /**
     * 获取企业会员
     */
    public CompanyMember getCompanyMember() {
        if (this.companyMember == null) {
            this.companyMember = companyMemberDao.findCompanyMemberByMid(id);
        }
        return this.companyMember;
    }
    
    /**
     * 获取个人会员信息
     */
    public Person getPerson() {
         if (this.person == null) {
             this.person = personDao.findPersonByMid(id);
         }
         return this.person ;
    }
}






我有些晕,为什么会存在Member这个对象?难道不应该只是存在CompanyMember和Person吗?然后查找的行为放在Manager中去,或者将各自的行为放在各自的QueryObject放在Entity上,再或者以静态的方法存在于各自的Entity上?
0 请登录后投票
   发表时间:2009-01-24  
taowen 写道

价值
数据,一定是数据。做企业系统,最核心的东西一定是数据。


我这边想表达一下我的看法:
数据是我们企业系统的要管理的对象,一个软件最核心的是如何“有效的管理数据”,而不“只是”保证数据正确,保证数据的正确,不管难度多大,都比较是低层面的。


领域模型,我认为它建立起来的一个原因是OO的发展,使用OO来接解决一些问题。
领域模型关注的地方,在于汲取业务知识,复杂问题简单化,抽象成建立清晰简单的模型。

领域建模,我觉得,领域模型比较能够解决复杂业务的东西,但是,开发比较慢,因为,他要不断提纯模型,是的模型能够准确清晰的表达业务含义。

但是一个有效的模型的建立,会使得以后解决问题都有清晰的思路。

对于领域模型,处理类的方法膨胀问题,方法有很多种。
但是,大多数出现的问题,都是对于领域没有提纯好,本来的两个domian的问题,非的一个domain类处理。

我个人认为:
对于领域模型使用上的最大问题,是如何建立良好模型的问题,这里会有好几个问题一般会遇到:
1.把那些方法认为是service的,那些认为是domain的,这个robin说过(我理解的大致是:一般性的要到dao的方法),eric也说过(我理解的大致是:那些是过程性的行为,比如营业员的柜台收钱,适合service)。
2.类里的方法膨胀,我认为大多是没有提取好业务模型所致,本来的两个domian的问题,非的一个domain类处理。还有些本身就很庞大的类。需要借助pub/utils 这些来避免,当然还有很多其他途径,建议看完ddd之后,“应用它所提出的方法”搞完一个项目之后,再做评价。

看了一些评论,发现大多数只是简单的做过一些很简单的实验性的东西,不能够说明很多问题。




0 请登录后投票
   发表时间:2009-02-12   最后修改:2009-02-12
企业应用?OO? 切莫被flower给忽悠了,不是搞组件开发的玩充血就是自找没趣,还是SOA思想来的实在。

DAO也是个大忽悠,持久层更换的需要,谁遇到过。

还有那个qi4j,写个helloworld都复杂无比,知道有这么个东西就行了,嘿嘿




0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics