论坛首页 Java企业应用论坛

请教关于domain对象注入service

浏览 16406 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-01-09  
两种对象模型,一种是充血的模型,一种是贫血的模型。

贫血的仅仅做数据的承载,不做逻辑;

而充血既做承载也做逻辑。

0 请登录后投票
   发表时间:2009-01-09  
对于经验少的新手来说,纯贫血模型是最简单,最不容易出错的。
0 请登录后投票
   发表时间:2009-01-09  
当一个业务逻辑包含了N个表,N个DAO,N个逻辑关系
N大于5时
125种组合......
人的脑子一般是思考不过来的.
用domain封来封去....事务,边际变模糊了.......
最后都放到action里去作事务.
0 请登录后投票
   发表时间:2009-01-09  
抛出异常的爱 写道
当一个业务逻辑包含了N个表,N个DAO,N个逻辑关系
N大于5时
125种组合......
人的脑子一般是思考不过来的.
用domain封来封去....事务,边际变模糊了.......
最后都放到action里去作事务.

额,想请教下,你一般事务是怎么放的?
我的想法是一个事务对应了service的一个方法。这样就可以在service做事务控制了。
0 请登录后投票
   发表时间:2009-01-10  
抛出异常的爱 写道
当一个业务逻辑包含了N个表,N个DAO,N个逻辑关系
N大于5时
125种组合......
人的脑子一般是思考不过来的.
用domain封来封去....事务,边际变模糊了.......
最后都放到action里去作事务.


呵.貌似大部分人都推荐用单纯的service来做.
原本是想说pay作为User的一个行为,会更oo一些.

昨天也有就这个问题请教了下一位牛人.
是这样的看法,这个问题目前没有一个绝对的准则来说是好是坏,
各有利弊,需要自己去权衡.
作为他本人,他也是比较不倾向于充血.
也正如异常这边说的,这样的耦合性大了许多.
之后可能不好控制

呵..谢谢大家了..
0 请登录后投票
   发表时间:2009-01-10   最后修改:2009-01-10
楼主你说的:
引用
原本是想说pay作为User的一个行为,会更oo一些.

既然这么认为,那你又为什么把pay封装到PayService中呢??跟你的说法不矛盾么?

    奇怪!怎么更oo了呢???所谓的面向对象,并不是从概念上说这个对象有什么属性或行为,就都要封装到这个对象里。这是对面向对象错误的理解。主要取决这个对象要怎么用!
    举例说,比如正方形这个类,如果我们使用它的目的是计算面积,那它的父类就是平行四边形,可以把它看作是平行四边形的派生。而如果你只是用来表示图形,那它应该是多边形的子类。

    系统就是给客户(User)用的,如果按你那种思路来封装对象,一个User就够了(登录、付帐、管理系统配置、上传文件、修改记录等等)
   
0 请登录后投票
   发表时间:2009-01-10  
pipilu 写道
楼主你说的:
引用
原本是想说pay作为User的一个行为,会更oo一些.

既然这么认为,那你又为什么把pay封装到PayService中呢??跟你的说法不矛盾么?


呵 把pay封装到PayService中,pay是作为User的一个行为,至于自己的实现是怎样,
跟User应该没多大关系吧?
主要是因为pay的实现复杂了些些
所以才把它放到一个相应的service中来处理.呵

pipilu 写道

    奇怪!怎么更oo了呢???所谓的面向对象,并不是从概念上说这个对象有什么属性或行为,就都要封装到这个对象里。这是对面向对象错误的理解。主要取决这个对象要怎么用!
    举例说,比如正方形这个类,如果我们使用它的目的是计算面积,那它的父类就是平行四边形,可以把它看作是平行四边形的派生。而如果你只是用来表示图形,那它应该是多边形的子类。

    系统就是给客户(User)用的,如果按你那种思路来封装对象,一个User就够了(登录、付帐、管理系统配置、上传文件、修改记录等等)

真心请教下.关于我对面向对象的错误理解,能否另外举个例子呢?
这个例子我没能明白..thx


哈,是呀,理论上来说是需要一个User就够了,
但是也就是这样充血,会导致太多的耦合.呵
0 请登录后投票
   发表时间:2009-01-10   最后修改:2009-01-10
kakac001 写道
pipilu 写道
楼主你说的:
引用
原本是想说pay作为User的一个行为,会更oo一些.

既然这么认为,那你又为什么把pay封装到PayService中呢??跟你的说法不矛盾么?


呵 把pay封装到PayService中,pay是作为User的一个行为,至于自己的实现是怎样,
跟User应该没多大关系吧?
主要是因为pay的实现复杂了些些
所以才把它放到一个相应的service中来处理.呵

pipilu 写道

    奇怪!怎么更oo了呢???所谓的面向对象,并不是从概念上说这个对象有什么属性或行为,就都要封装到这个对象里。这是对面向对象错误的理解。主要取决这个对象要怎么用!
    举例说,比如正方形这个类,如果我们使用它的目的是计算面积,那它的父类就是平行四边形,可以把它看作是平行四边形的派生。而如果你只是用来表示图形,那它应该是多边形的子类。

    系统就是给客户(User)用的,如果按你那种思路来封装对象,一个User就够了(登录、付帐、管理系统配置、上传文件、修改记录等等)

真心请教下.关于我对面向对象的错误理解,能否另外举个例子呢?
这个例子我没能明白..thx


哈,是呀,理论上来说是需要一个User就够了,
但是也就是这样充血,会导致太多的耦合.呵


    呵呵,其实这个问题,如果从依赖性或耦合程度上来解释,肯定很容易给出结论。
    但我只是想从面向对象的设计上说一说(因为你是从面向对象的角度来提出那个想法的)
    你的那个PayService应该不是一个通用的工具类(跟业务无关,处于依赖关系的最下游)。如果pay被划分为User的形为,那么就在User里封装好了,不要再在PayService里也可以pay——使用PayService的pay和使用User的pay有什么区别么??莫非,业务以后可能有这样的扩展:通过User来pay时,会有一些额外的处理(pay前或pay后)??如果不是,为什么它俩职责一样,却在不同的类里呢?
    根据使用来划分对象,我记得以前看书,书上讲面向对象时,总是举动物的例子:动物,子类是哺乳动物,哺乳动物子类有猫,而猫又分为黑猫和白猫。那我就以猫为例来说明吧。
    如果我们买猫是作为宠物的,那我们肯定关心它的:毛色、品种及是不是纯种、打没打疫苗、擅不擅长滚线球。
    而如果我们买猫是为了吃肉(罪过,,我有一次问一个瑞典女孩儿她对中国的印象,她说:They eat their cats and dogs),那我们更关心是老猫还是小猫(枚举类型)、公母、重量。
    这样在你的程序里,如果猫是作为食物的,那毛色和会不会滚线球就不是Cat这个类的属性了。抓耗子也不会是Cat的成员函数了(虽然抓耗子是猫的一个行为,但不是你用这个猫的目的)

    那个User你打算怎么用呢??你是打算把它当作UserInfo来用,还是打算当作付帐机器人来用?或者是专管缴费的公司行政人员?
   
0 请登录后投票
   发表时间:2009-01-10  
   我觉得领域对象的方法,应该只涉及到改变自身状态行为

   如果还涉及到其他领域对象的状态改变
 
   那么这个方法都应该放到service中!

   所以就楼主的例子来说:
 
   pay 一般来讲 都至少应该涉及到 支付方 和 接受方 两个领域 对象的, 那么pay方法放在   service层是必须的!

    那么如果我假设 楼主 你 的系统 只关心把钱付出去了,对于之外的事情你系统不毫不关心,那么此时你把pay方法放在user中也不无不可,并指定自己的事务规则,不过建议这个时候你改变你的方法名:deduct 这样更为合理。

   那么我又假设,如果有一天你的系统升级了,要求关心 这个钱 的去向或则至少
要记录一下,那么deduct你就应该建立一个payServcice,里面有领域对象的deduct的调用和 其他的调用,当然也包括事务的设置。

     



0 请登录后投票
   发表时间:2009-01-10   最后修改:2009-01-10
czx566 写道
   我觉得领域对象的方法,应该只涉及到改变自身状态行为

   如果还涉及到其他领域对象的状态改变
 
   那么这个方法都应该放到service中!

   所以就楼主的例子来说:
 
   pay 一般来讲 都至少应该涉及到 支付方 和 接受方 两个领域 对象的, 那么pay方法放在   service层是必须的!

    那么如果我假设 楼主 你 的系统 只关心把钱付出去了,对于之外的事情你系统不毫不关心,那么此时你把pay方法放在user中也不无不可,并指定自己的事务规则,不过建议这个时候你改变你的方法名:deduct 这样更为合理。

   那么我又假设,如果有一天你的系统升级了,要求关心 这个钱 的去向或则至少
要记录一下,那么deduct你就应该建立一个payServcice,里面有领域对象的deduct的调用和 其他的调用,当然也包括事务的设置。

     




同意楼上的说法,建议去看看《POJO in Action》,上面讲的很清楚,关于对象自身状态的改变,应该是本对象负责,有关集合操作或者其他,还是在service中
0 请登录后投票
论坛首页 Java企业应用版

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