论坛首页 Java企业应用论坛

贫血就贫血,咂地?

浏览 54132 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-11-02  
partech:
AOP可以声明在领域模型上的话,似乎开了一个潘多拉盒子哦。
过渡和适度的说法会很让人在选择AOP时犹豫再三,
如果说他是语法规范,那就好办了。
0 请登录后投票
   发表时间:2005-11-03  
firebody 写道
partech:
AOP可以声明在领域模型上的话,似乎开了一个潘多拉盒子哦。
过渡和适度的说法会很让人在选择AOP时犹豫再三,
如果说他是语法规范,那就好办了。

这就要看个人的性格了,是冲锋的,还是随大流,这确实是个问题。
0 请登录后投票
   发表时间:2005-11-03  
firebody 写道


你说的是这片文章吗:
http://docs.codehaus.org/display/YAN/Dependency+Injection+For+Rich+Domain+Objects

,如果是这篇文章的话,那么我还真没看出其中有什么新意。
无非就是返回对象前,autowire了一遍。
new Account()生成后的对象,Service还是空的,可是你已经暴露了业务方法在上面。不会口头声明领域对象必须是Service返回到对象才能调用业务逻辑方法吧。

莫非你说的"autowire"另有新意?
我那个例子是用了autowire,不过你看这个描述注射逻辑的Binder对象
Binder injection = new Binder();{
  public Creator bind(Object obj);{
    return Components.value(obj);
      .bean(new String[]{"smtpService"});;
  }
};

如果要改成manualwire,跟其它的容器注射一样处理:
Binder injection = new Binder();{
  public Creator bind(Object obj);{
    return Components.value(obj);
      .bean(new String[]{"smtpService"});
      .withProperty("smtpService", 
         Components.ctor(SmtpService.class);
      );
    );;
  }
};

我本来以为这是一目了然的,不须赘述。
其实那个aop方法也一样需要调用容器亚。

new的话,我的文章里建议注射一个factory进去,不用new。没办法,这是充血模型先天的缺陷造成的,用factory补救,我认为比用aop补救要更灵活,更容易测试。
0 请登录后投票
   发表时间:2005-11-03  
partech 写道
你认为你的那部分依赖框架的组装代码,就很简洁,很容易理解?
不需要熟悉框架?


我在说框架结构,不是某个语法是否容易理解。我也没有批评aop的语法不好看不容易理解不是?也没有说spring需要熟悉它的xml配置语法不是?不要转移话题。

我那部分框架组装代码,就像用pico一样,为了明确表明逻辑用java裸写的。其实,这部分用xml封装起来然后象spring那样去配置也是可行的。我现在正在考虑制作一个xml wrapper的事情。

框架上,我的方法,所有domain相关的代码,包括持久曾,dao,都不依赖任何第三方库,没有aspectj, 没有spring,没有yan。这才是inversion of control,你自己绝对不主动控制什么,而是把控制权留给组装者。

如果愿意,你在单元测试的时候完全可以mock。
0 请登录后投票
   发表时间:2005-11-03  
firebody 写道
partech:
AOP可以声明在领域模型上的话,似乎开了一个潘多拉盒子哦。
过渡和适度的说法会很让人在选择AOP时犹豫再三,
如果说他是语法规范,那就好办了。

也不是说有个语法规范,sun一高兴把aspectj放进java就行了的问题。这涉及到程序语言学的。能不能让aspect无缝地融合进java的对象模型,而不是另外再加一个模型,是个很棘手的问题。而且,就算成为语言的一部分又如何?goto还是语言的一部分呢。
看看这片文章:AOP Considered Harmful

http://www.javalobby.org/java/forums/t18398.html
0 请登录后投票
   发表时间:2005-11-03  
ajoo 写道
partech 写道
你认为你的那部分依赖框架的组装代码,就很简洁,很容易理解?
不需要熟悉框架?


我在说框架结构,不是某个语法是否容易理解。我也没有批评aop的语法不好看不容易理解不是?也没有说spring需要熟悉它的xml配置语法不是?不要转移话题。

我那部分框架组装代码,就像用pico一样,为了明确表明逻辑用java裸写的。其实,这部分用xml封装起来然后象spring那样去配置也是可行的。我现在正在考虑制作一个xml wrapper的事情。

框架上,我的方法,所有domain相关的代码,包括持久曾,dao,都不依赖任何第三方库,没有aspectj, 没有spring,没有yan。这才是inversion of control,你自己绝对不主动控制什么,而是把控制权留给组装者。

如果愿意,你在单元测试的时候完全可以mock。

但是不能做到单点维护。

使用AOP同样可以做到这些啊。因为通常的java类不会对aspect进行引用,而是aspect依赖java类或/和方法。
0 请登录后投票
   发表时间:2005-11-03  
partech 写道

但是不能做到单点维护。

使用AOP同样可以做到这些啊。因为通常的java类不会对aspect进行引用,而是aspect依赖java类或/和方法。


你做不到。
1。你的程序没有aop织入根本不是一个完整的功能模块,没法单元测试。
2。你的aspect代码直接依赖容器api。弄得整个domain层都不能脱离容器存在。
3。你的java类确实没有明确依赖aop。但是这个“静态调用new BankAccount(),期待构造函数里面没有的依赖注射可以凭空发生”,本身就是对aop的隐含依赖。

至于单点维护,与ioc一个factory的方法相比优势并不大(用factory所有的依赖注入也集中在单点,只不过你要用factory而已。),而采用的方法缺陷又太明显。大家自己抉择呗。
0 请登录后投票
   发表时间:2005-11-03  
ajoo 写道
partech 写道

但是不能做到单点维护。

使用AOP同样可以做到这些啊。因为通常的java类不会对aspect进行引用,而是aspect依赖java类或/和方法。


你做不到。
1。你的程序没有aop织入根本不是一个完整的功能模块,没法单元测试。
2。你的aspect代码直接依赖容器api。弄得整个domain层都不能脱离容器存在。
3。你的java类确实没有直接依赖aop。但是这个“new(),期待构造函数里面没有的依赖注射可以凭空发生”,本身就是对aop的隐含依赖。

至于单点维护,与ioc一个factory的方法相比优势并不大(用factory所有的依赖注入也集中在单点,只不过你要用factory而已。),而采用的方法缺陷又太明显。大家自己抉择呗。

1.正因为是单元测试,所以我可以手工编码注入。
2。aspectJ要依赖啥子容器API?aspect负责注入,不属于domain
3。没有啊,在new后注入,完全是aspect想在这里这样干。难道你的设计domain中的服务接口不是也隐含着,一定必须有一个地方注入吗?
4.你的那个new -----factory很自然,简明吗?
0 请登录后投票
   发表时间:2005-11-03  
partech 写道
ajoo 写道
partech 写道

但是不能做到单点维护。

使用AOP同样可以做到这些啊。因为通常的java类不会对aspect进行引用,而是aspect依赖java类或/和方法。



你做不到。
1。你的程序没有aop织入根本不是一个完整的功能模块,没法单元测试。
2。你的aspect代码直接依赖容器api。弄得整个domain层都不能脱离容器存在。
3。你的java类确实没有直接依赖aop。但是这个“new(),期待构造函数里面没有的依赖注射可以凭空发生”,本身就是对aop的隐含依赖。

至于单点维护,与ioc一个factory的方法相比优势并不大(用factory所有的依赖注入也集中在单点,只不过你要用factory而已。),而采用的方法缺陷又太明显。大家自己抉择呗。

1.正因为是单元测试,所以我可以手工编码注入。
2。aspectJ要依赖啥子容器API?aspect负责注入,不属于domain
3。没有啊,在new后注入,完全是aspect想在这里这样干。难道你的设计domain中的服务接口不是也隐含着,一定必须有一个地方注入吗?

嗯嗯.

[list]1。不可能。你怎么手工intercept深深隐藏在业务代码中的new BankAccount()?没有aspectj你搞得定吗?

2。看看xiecc的那片文章。他就是直接调用application context。这就是依赖。

3。完全是aspect想在这里干?你aspect得敢不想干啊。没有aspect代码就根本不工作。而我的设计不隐含着对任何框架的依赖。只要你给我传入合适的factory,我就可以工作。这个factory你完全可以手工创建。这里我要的是injection,不是interception。injetion任何时候都可以mock,interception不可以。

4。new vs. factory的优势我解释过了,有,但是非常有限。如果你认为“能够用new”是压倒一切的目标的话,那自然万事皆休。其实,在这个目标下,所有ioc设计都是垃圾。应该直接new才是正理。[/list:u]
0 请登录后投票
   发表时间:2005-11-03  
partech 写道
如图虽然不是存款,含义一样。


你这个例子,从图上就可以看出,room, reservation, bill是三件各自可以独立的事情。任何一件事都不依赖另外两件事就可以成为一个逻辑上完整的动作。aop只不过用来把三件事情穿起来而已。虽然这种东西用传统的oo的封装就可以做,用aop倒也不算多么滥用。


但是这个domain object injection却不同。aspect里面做的事情和domain里面的逻辑密切相关,没有aspect,domain里面的逻辑根本就不完整。这种东西和这个例子却是本质上就不同。
0 请登录后投票
论坛首页 Java企业应用版

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