锁定老帖子 主题:贫血就贫血,咂地?
精华帖 (1) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-11-02
partech:
AOP可以声明在领域模型上的话,似乎开了一个潘多拉盒子哦。 过渡和适度的说法会很让人在选择AOP时犹豫再三, 如果说他是语法规范,那就好办了。 |
|
返回顶楼 | |
发表时间:2005-11-03
firebody 写道 partech:
AOP可以声明在领域模型上的话,似乎开了一个潘多拉盒子哦。 过渡和适度的说法会很让人在选择AOP时犹豫再三, 如果说他是语法规范,那就好办了。 这就要看个人的性格了,是冲锋的,还是随大流,这确实是个问题。 |
|
返回顶楼 | |
发表时间: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补救要更灵活,更容易测试。 |
|
返回顶楼 | |
发表时间:2005-11-03
partech 写道 你认为你的那部分依赖框架的组装代码,就很简洁,很容易理解?
不需要熟悉框架? 我在说框架结构,不是某个语法是否容易理解。我也没有批评aop的语法不好看不容易理解不是?也没有说spring需要熟悉它的xml配置语法不是?不要转移话题。 我那部分框架组装代码,就像用pico一样,为了明确表明逻辑用java裸写的。其实,这部分用xml封装起来然后象spring那样去配置也是可行的。我现在正在考虑制作一个xml wrapper的事情。 框架上,我的方法,所有domain相关的代码,包括持久曾,dao,都不依赖任何第三方库,没有aspectj, 没有spring,没有yan。这才是inversion of control,你自己绝对不主动控制什么,而是把控制权留给组装者。 如果愿意,你在单元测试的时候完全可以mock。 |
|
返回顶楼 | |
发表时间:2005-11-03
firebody 写道 partech:
AOP可以声明在领域模型上的话,似乎开了一个潘多拉盒子哦。 过渡和适度的说法会很让人在选择AOP时犹豫再三, 如果说他是语法规范,那就好办了。 也不是说有个语法规范,sun一高兴把aspectj放进java就行了的问题。这涉及到程序语言学的。能不能让aspect无缝地融合进java的对象模型,而不是另外再加一个模型,是个很棘手的问题。而且,就算成为语言的一部分又如何?goto还是语言的一部分呢。 看看这片文章:AOP Considered Harmful http://www.javalobby.org/java/forums/t18398.html |
|
返回顶楼 | |
发表时间: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类或/和方法。 |
|
返回顶楼 | |
发表时间: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而已。),而采用的方法缺陷又太明显。大家自己抉择呗。 |
|
返回顶楼 | |
发表时间: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很自然,简明吗? |
|
返回顶楼 | |
发表时间: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] |
|
返回顶楼 | |
发表时间:2005-11-03
partech 写道 如图虽然不是存款,含义一样。
你这个例子,从图上就可以看出,room, reservation, bill是三件各自可以独立的事情。任何一件事都不依赖另外两件事就可以成为一个逻辑上完整的动作。aop只不过用来把三件事情穿起来而已。虽然这种东西用传统的oo的封装就可以做,用aop倒也不算多么滥用。 但是这个domain object injection却不同。aspect里面做的事情和domain里面的逻辑密切相关,没有aspect,domain里面的逻辑根本就不完整。这种东西和这个例子却是本质上就不同。 |
|
返回顶楼 | |