锁定老帖子 主题:Domain Model 探索
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2004-12-30
partech 写道 唉,老兄,不知道是我没有描述清楚,还是你没理解
都说了Act在于封装业务活动,属于业务层的控制类。 它是独立于具体应用层而存在的。它执行业务的行为怎么可以 放到实现应用层接口的服务层中呢? 再不明白,真的是服了you。 我怎么看这些ACTs就象一个一个过程(只不过加了点回调),那算什么面向对象啊 |
|
返回顶楼 | |
发表时间:2004-12-30
引用 执行业务的行为 这个行为不是有业务主体来完成阿,为什么要把它拿出来?看见了一堆数据和很贫血的方法,然后去要这个act再去操作它? openService -->openAct->step1,step2,step3...?为什么不是openSercie openMehtod (1,2,3)? 实在看出去act的必要!one method one class 是为了什么?完全是过程化的思想 |
|
返回顶楼 | |
发表时间:2004-12-30
你说的没错。Act之所以是一个个过程是因为这样一个事实,
各种业务本来就是一个个过程。 Command模式本来就是如此,都只有一个Run方法。 建议去看看Bob大叔的《敏捷软件开发》中的有关Command的 相关阐述。 |
|
返回顶楼 | |
发表时间:2004-12-30
Command模式是不错,问题是为什么要用,在什么场合下用,我承认业务是一个过程:开户;它描述的对象是“户“这个名词,他有自己的属性 由开户这个动作,我为什么不能操作自己的属性去做事情的,每动一下非得请个act大叔来做?累不累阿?
|
|
返回顶楼 | |
发表时间:2004-12-30
partech 写道 你说的没错。Act之所以是一个个过程是因为这样一个事实,
各种业务本来就是一个个过程。 Command模式本来就是如此,都只有一个Run方法。 建议去看看Bob大叔的《敏捷软件开发》中的有关Command的 相关阐述。 我晕,Command模式被用来帮这种事了,这不是绕了个大圈做过程,哪有面象对象的好处啊,那还不如直接用一个个过程来得直观,比如AccountHelper.xxx。 举个例子:一个系统有很多种类Order对象,以Order为基类,Order类有一个确认定单动作Order.confirm()。不同子类的订单会执行不同的动作,比如是供应商Order就会发直接生成发货单对象及xxx,是个人用户Order就会yyy等等。按你的方法用Act,是不是要在act中来一堆if来判是什么Order再用作什么处理?还是有一堆Act,比如供应商OrderACT,个人用户OrderACT等等。把而用对象法就可以在查询得到一堆Order后(Hibernate不是可以多态查询吗),直接order.comfirm()就ok了,具体动作由order自已处理,这是多态的好处,比用回调好多了吧。 |
|
返回顶楼 | |
发表时间:2004-12-30
如果子类中的order.confirm(),需要知道当前的业务类别或当前正在执行该项操作的员工。
你如何得到? Act的主要目的是提供当前业务运行的上下文。同时完成操作多个业务对象的任务,因为该 操作需要跨越多个对象,这样该方法放入那个对象都不合适。 |
|
返回顶楼 | |
发表时间:2004-12-30
partech 写道 如果子类中的order.confirm(),需要知道当前的业务类别或当前正在执行该项操作的员工。
你如何得到? Act的主要目的是提供当前业务运行的上下文。同时完成操作多个业务对象的任务,因为该 操作需要跨越多个对象,这样该方法放入那个对象都不合适。 这看程序需要啊,设计业务类和设计别的应用程序的类(比如文本编辑器)没什么不同啊,也可以在类上应用多态继承策略等,而不是做很多act。当前业务类别不是当前类嘛,操作的员工么要不是有个全局的当前操作者(放在session或是一个类的TheadLocal中),要不就成一个参数传入confirm。 |
|
返回顶楼 | |
发表时间:2004-12-30
towjzhou 写道 当前业务类别不是当前类嘛。 同样一个存钱Act我可以存定期,也可以存活期,两种业务类别。 按照你的说法。不是要弄两个类? towjzhou 写道 操作的员工么要不是有个全局的当前操作者(放在session或是一个类的TheadLocal中) 你设计的Session中会包含getEmployee()这样的方法吗? 这样你的Session就不得不同业务层中的Party关联了。 towjzhou 写道 要不就成一个参数传入confirm。 前面讨论Facade时已经讨论过,这种做法不可行。 |
|
返回顶楼 | |
发表时间:2004-12-30
引用 Act的主要目的是提供当前业务运行的上下文。同时完成操作多个业务对象的任务,因为该 操作需要跨越多个对象,这样该方法放入那个对象都不合适。 在DDD中也有这么个说法,但是完全可以由service层来实现,换个立场考虑问题:用户的角度,他要的是对某个service 对象操作,他说我要开户:呢就把open这个动作放到accountService里面,虽然open 可能操作多个对象,他仍探是开户阿:开汽车,不能说要东道方向盘,发动机,轮子,就要每一个都要一个acttion把,那些只是这个打对象车子的component.由车子来调用协调对象的关系。看离子 引用 class 车{ 开(){ 方向盘.trun(); 上下文。。。 发动机.fire(); 上下文。。。 轮子.trun(); } } 或者这样“: class 车{ 开(){ 上下文。。。 开ACT.run() } 开ACTAct :run(){ 轴承。run(); ...... } } 这样一层层调下去? 那一种更好? |
|
返回顶楼 | |
发表时间:2004-12-30
Act在于封装业务活动, 这个概念很重要,
通过act之间的关系,就构成了业务活动骨架。 但我觉得 只要把act理解成为一种 概念原型(Archetype)就可以了。没有必要做成Interface 或基类之类, 继承的耦合性太高了,实际也不方便。 建议看看color Uml 第1章,可能应该会有收获。 |
|
返回顶楼 | |