论坛首页 Java企业应用论坛

Domain Model 探索

浏览 104082 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-12-30  
如果就只是存定期和存活期的区别,那是不用单独开一个类的,成为一个参数就够了,但情况很多时候并不是这么简单的,
比如前面的Order,有未知的Order种类,每种Order的confirm操作又有差别,不会要我每加一种Order就来改相关的所有ACT吧。
关于当前操作者为什么不能传进来,我没细看前面的讨论,没理由不能传进来吧。
对于一个系统,我想只要有业务类和一个很薄的Service层就行了,只需把操作转发给业务类以及实现事务等。比如:
class OrderServiceImpl implements OrderService {
   
    public void confirm(ID orderId) {
        Order order = pm.load(Order.class, orderId);
        order.confirm();
    }
}
0 请登录后投票
   发表时间:2004-12-30  
引用

同样一个存钱Act我可以存定期,也可以存活期,两种业务类别。
按照你的说法。不是要弄两个类?

定期和活期完全可以用策略模式,和存钱这个动作无关阿,和账户这个抽象对象无关阿,正好是面向对线么
 account.save();

具体是哪一种定期和活期;这就看account 工厂出来的那种account了
0 请登录后投票
   发表时间:2004-12-30  
partech 写道
将所有的业务活动都建模成一个Act,这非常重要。甚至你可以在Session中放入一个Act来
表示当前正在进行的业务。所有的扩展都是从Act开始的。
假如你要对Act施加某种检查,那么对doRun方法进行拦截可以达到该目的。
用例能够简化到只剩下流程,同样道理Act也可以做到这点。
对于象RichClient的交互模式,通常只在最后才提交业务,中间的交互都是在准备提交的数据。
那么在中间调用的方法中可以只new XXXAct而不执行doRun操作。这样做是因为中间的调用
可能会用到XXXAct来作为上下文。现在我还没有想好在这样的中间过程中,如何能够触发
植入到donRun前的检查?或许可以创建一个空doRun的子类覆盖掉父类实际的操作?

(待续)


呵呵,“以动词为中心”的面向对象?我是不赞成这样来剥离对象的。
面向对象在“以名词为中心”时会比较顺手,也比较容易理解。
不过在碰到涉及多个名词的动作的时候确实会很麻烦。

其本质在于“我们的世界不是面向对象的”

将面向对象调整到“以动词为中心”有点类似于拆东墙补西墙。
0 请登录后投票
   发表时间:2004-12-30  
tuti 写道

但我觉得 只要把act理解成为一种 概念原型(Archetype)就可以了。没有必要做成Interface
或基类之类, 继承的耦合性太高了,实际也不方便。

不使用接口,就没办法DIP了。

towjzhou 写道

如果就只是存定期和存活期的区别,那是不用单独开一个类的,成为一个参数就够了,但情况很多时候并不是这么简单的,
比如前面的Order,有未知的Order种类,每种Order的confirm操作又有差别,不会要我每加一种Order就来改相关的所有ACT吧。
关于当前操作者为什么不能传进来,我没细看前面的讨论,没理由不能传进来吧。
对于一个系统,我想只要有业务类和一个很薄的Service层就行了,只需把操作转发给业务类以及实现事务等。比如:
class OrderServiceImpl implements OrderService {

public void confirm(ID orderId) {
Order order = pm.load(Order.class, orderId);
order.confirm();
}
}

看看我的实现并没有你所说的使用很多if。。
public class OrderAct
{
private Order order;
public override doRun()
{
order.confirm();
}
}
同样道理我也可以使用order的多态。

另外如果在服务层组装业务逻辑,充当控制类。假如同样的业务有不同的应用接口,如:ATM,电话,网上,你如何处理?
再重写一遍?或者调用已经有的?这样你的服务层是相互耦合的。不同的服务,为什么耦合在一起呢?
相反我的实现中只需要给Act添加不同的构造函数就行了。
0 请登录后投票
   发表时间:2004-12-30  
某个动作足够复杂,就可以建成对象。
看act不顺眼,只要叫成actService.
比如说 “挂失”建成类可以叫 “挂失服务”。
拘泥于以朴素的名词为中心,很难建立起
领域模型。
0 请登录后投票
   发表时间:2004-12-30  
clamp 写道

呵呵,“以动词为中心”的面向对象?我是不赞成这样来剥离对象的。
面向对象在“以名词为中心”时会比较顺手,也比较容易理解。
不过在碰到涉及多个名词的动作的时候确实会很麻烦。

其本质在于“我们的世界不是面向对象的”

将面向对象调整到“以动词为中心”有点类似于拆东墙补西墙。

那你操作多个对象的业务逻辑放在什么名词对象里呢?
0 请登录后投票
   发表时间:2004-12-30  
partech 写道
clamp 写道

呵呵,“以动词为中心”的面向对象?我是不赞成这样来剥离对象的。
面向对象在“以名词为中心”时会比较顺手,也比较容易理解。
不过在碰到涉及多个名词的动作的时候确实会很麻烦。

其本质在于“我们的世界不是面向对象的”

将面向对象调整到“以动词为中心”有点类似于拆东墙补西墙。

那你操作多个对象的业务逻辑放在什么名词对象里呢?

不要把事情绝对化了,事实上操作多个平等对象是很少见的,而万一有这种操作的确是可以作一个独立Helper对象来处理,但
绝大部分操作都是以某个对象为中心的,比如Order.confirm,例如要一个操作者Operator对象,那这个Operator可以
作参数传进来,但这个方法是Order.confirm(Operator op),
而不是Operator.confirm(Order order)或
OrderService.confirm(Order order, Operator op);
0 请登录后投票
   发表时间:2004-12-30  
引用

另外如果在服务层组装业务逻辑,充当控制类。假如同样的业务有不同的应用接口,如:ATM,电话,网上,你如何处理?
再重写一遍?或者调用已经有的?这样你的服务层是相互耦合的。不同的服务,为什么耦合在一起呢?
相反我的实现中只需要给Act添加不同的构造函数就行了。


这种思想是不对的,仅仅是为了重用的话,信息量越少,重用率肯定越高。one method one class的重用率肯定是最高的。但是不易于管理。

"ATM,电话,网上" 作为客户他们 看到的account的样子肯定是不一样的,为什么不让他们自己描述他们希望看到的account的样子那? 最后 atmAccount,telephoneAccount......做出不同的操作,这才叫封装! 而不是
atmAccountOpenService telephonAccountopenService这样的类
0 请登录后投票
   发表时间:2004-12-30  
towjzhou 写道
不要把事情绝对化了,事实上操作多个平等对象是很少见的,而万一有这种操作的确是可以作一个独立Helper对象来处理,但
绝大部分操作都是以某个对象为中心的,比如Order.confirm,例如要一个操作者Operator对象,那这个Operator可以
作参数传进来,但这个方法是Order.confirm(Operator op),
而不是Operator.confirm(Order order)或
OrderService.confirm(Order order, Operator op);


呵呵,还是把前面有关Facade的论述看看好吗?
0 请登录后投票
   发表时间:2004-12-30  
frankensteinlin 写道


这种思想是不对的,仅仅是为了重用的话,信息量越少,重用率肯定越高。one method one class的重用率肯定是最高的。但是不易于管理。

你有没有实践过先?怎么个不易管理?管理什么?

frankensteinlin 写道


"ATM,电话,网上" 作为客户他们 看到的account的样子肯定是不一样的,为什么不让他们自己描述他们希望看到的account的样子那? 最后 atmAccount,telephoneAccount......做出不同的操作,这才叫封装! 而不是
atmAccountOpenService telephonAccountopenService这样的类


我说的同你理解的根本是两回事
0 请登录后投票
论坛首页 Java企业应用版

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