锁定老帖子 主题:再谈开源框架的“非侵入”还有意义吗?
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-09-01
我这里说到的“入侵”并不仅仅指业务层,一般也是建议业务层是不依赖任何框架和组件的,毕竟是系统的核心处理层。但还有其他各个层,如视图、控制等。我一开始也就阐明了一旦你一开始使用这类框架,就已经实际上被框架隐式入侵了。
前面有朋友提到实现和接口的绑定可以采用其他IOC容器,我想这位朋友根本就没有仔细想这类问题,这里已经不再是简单的IOC问题了,即使你举这样的例子也是不恰当的,你想,如果你使用spring的事务管理(举个例子),你想还有其他实现一样功能的框架来给你用么?这就是标准化于非标准化的问题!所以我的意思是在没有成为标准的前提下谈非入侵都是不必要的,即使是事实标准。而且你也不用刻意的在你的系统中避免导入代码依赖,因为你根本不可能再脱离这个框架了,这就是实质问题!!! |
|
返回顶楼 | |
发表时间:2009-09-01
downpour 写道 ferreousbox 写道 downpour 写道 spring所谈的非入侵的前提是通过IoC容器实现的对象生命周期的管理,从而使得你的程序可以不必依赖你的运行环境。从实现角度来说,spring的非入侵,是基于setter和getter方法的的JavaBean标准。
所以要谈非入侵,必须有一个角度。 诚然你说的spring的IOC意义我不可否认,但这种只是非显示的入侵,即我们通常说的代码的引入。而背后隐式的入侵也正是这些框架的强大,我现在想要说的是,从你开始使用spring的时候你的应用已经被绑定到了spring上,即使你的代码没有引入和使用spring的类。在某个框架的配置格式非标准化时,你还能够指望使用其他框架来实现这样的功能么?(不要跟我说简单的IOC注入自己实现) 而程序不依赖环境的设置可以说是JAVA中面向接口的一大体现,不是非入侵才可以的,即依赖接口不依赖实现。至于整合其他框架的功能则不能够简单的理解为非侵入式。只是认为IOC是接口与实现分离的一个好的实现而已! 因此,我认为从你的程序开始使用像spring、struts等框架时,就抛开所谓的“非侵入”思想吧 和你这种理论家讨论问题真是累人啊。 我写一个普通的Service实现,哪里绑定到Spring上了?既然不绑定在Spring上,我为什么不能使用其他的IoC实现来做我的对象生命周期管理? 我已经很明确的告诉了你: 引用 spring的非入侵,是基于setter和getter方法的的JavaBean标准。 所以,凡是基于setter和getter方法来实现IoC的,都能被我的程序无入侵的使用,甚至自己实现一个也无妨。这东西和所谓的接口、实现没什么很大关系,和使用什么框架更加没有关系。 说到现在,我依然不知道你想要说明什么,是说这些框架归根到底都是有入侵的嘛?我认为你的论据还不能支撑你的观点。 看我上面的回答,如果你的系统只是简单的实用SET和GET特性我也就不说什么了,确实有很多框架可以做类似的事情,但你能够想象所有IOC容器都是一样的配置?都是一样功能?不可能,你能够想象使用了spring后再去切换其他的类似框架么?我想你也不会而且也不可能,这就是我要说的问题所在!---隐式绑定! |
|
返回顶楼 | |
发表时间:2009-09-01
ferreousbox 写道 我这里说到的“入侵”并不仅仅指业务层,一般也是建议业务层是不依赖任何框架和组件的,毕竟是系统的核心处理层。但还有其他各个层,如视图、控制等。我一开始也就阐明了一旦你一开始使用这类框架,就已经实际上被框架隐式入侵了。
前面有朋友提到实现和接口的绑定可以采用其他IOC容器,我想这位朋友根本就没有仔细想这类问题,这里已经不再是简单的IOC问题了,即使你举这样的例子也是不恰当的,你想,如果你使用spring的事务管理(举个例子),你想还有其他实现一样功能的框架来给你用么?这就是标准化于非标准化的问题!所以我的意思是在没有成为标准的前提下谈非入侵都是不必要的,即使是事实标准。而且你也不用刻意的在你的系统中避免导入代码依赖,因为你根本不可能再脱离这个框架了,这就是实质问题!!! 你说来说去怎么感觉你总说不到点上呢? 框架到底哪里侵入业务层了?说半天说不出个所以然来。 说不出来就拿代码举例,本来业务层是怎么写的?用了框架后又怎么写了?把框架去了又出现怎么问题了? 友情提示:你举spring例子是最错误的,spring的侵入性是最低的 |
|
返回顶楼 | |
发表时间:2009-09-01
herowzz 写道 ferreousbox 写道 我这里说到的“入侵”并不仅仅指业务层,一般也是建议业务层是不依赖任何框架和组件的,毕竟是系统的核心处理层。但还有其他各个层,如视图、控制等。我一开始也就阐明了一旦你一开始使用这类框架,就已经实际上被框架隐式入侵了。
前面有朋友提到实现和接口的绑定可以采用其他IOC容器,我想这位朋友根本就没有仔细想这类问题,这里已经不再是简单的IOC问题了,即使你举这样的例子也是不恰当的,你想,如果你使用spring的事务管理(举个例子),你想还有其他实现一样功能的框架来给你用么?这就是标准化于非标准化的问题!所以我的意思是在没有成为标准的前提下谈非入侵都是不必要的,即使是事实标准。而且你也不用刻意的在你的系统中避免导入代码依赖,因为你根本不可能再脱离这个框架了,这就是实质问题!!! 你说来说去怎么感觉你总说不到点上呢? 框架到底哪里侵入业务层了?说半天说不出个所以然来。 说不出来就拿代码举例,本来业务层是怎么写的?用了框架后又怎么写了?把框架去了又出现怎么问题了? 友情提示:你举spring例子是最错误的,spring的侵入性是最低的 你也没看懂我的意思,我不是针对业务层来说事,你说的业务层无非是不依赖spring的类而已。难道你的业务层仅仅是来依靠spring做依赖注入?如果你使用了spring特有的功能(可能也不一定是特有的),那么表示已经被入侵了。我也一直强调并非一定是代码级别的入侵,明白不? 简单的说,你的系统离开spring或者简单的换个其他类似框架还能够跑么? 这就是我一开始就提到的:“非侵入”到底是什么意思?我的理解是不仅仅是代码的不侵入,而应该是类似于依赖接口而非实现的意思。 或许大家看问题的角度不一样,所以理解的也不一样。 |
|
返回顶楼 | |
发表时间:2009-09-01
最后修改:2009-09-01
ferreousbox 写道 herowzz 写道 ferreousbox 写道 我这里说到的“入侵”并不仅仅指业务层,一般也是建议业务层是不依赖任何框架和组件的,毕竟是系统的核心处理层。但还有其他各个层,如视图、控制等。我一开始也就阐明了一旦你一开始使用这类框架,就已经实际上被框架隐式入侵了。
前面有朋友提到实现和接口的绑定可以采用其他IOC容器,我想这位朋友根本就没有仔细想这类问题,这里已经不再是简单的IOC问题了,即使你举这样的例子也是不恰当的,你想,如果你使用spring的事务管理(举个例子),你想还有其他实现一样功能的框架来给你用么?这就是标准化于非标准化的问题!所以我的意思是在没有成为标准的前提下谈非入侵都是不必要的,即使是事实标准。而且你也不用刻意的在你的系统中避免导入代码依赖,因为你根本不可能再脱离这个框架了,这就是实质问题!!! 你说来说去怎么感觉你总说不到点上呢? 框架到底哪里侵入业务层了?说半天说不出个所以然来。 说不出来就拿代码举例,本来业务层是怎么写的?用了框架后又怎么写了?把框架去了又出现怎么问题了? 友情提示:你举spring例子是最错误的,spring的侵入性是最低的 你也没看懂我的意思,我不是针对业务层来说事,你说的业务层无非是不依赖spring的类而已。难道你的业务层仅仅是来依靠spring做依赖注入?如果你使用了spring特有的功能(可能也不一定是特有的),那么表示已经被入侵了。我也一直强调并非一定是代码级别的入侵,明白不? 简单的说,你的系统离开spring或者简单的换个其他类似框架还能够跑么? 这就是我一开始就提到的:“非侵入”到底是什么意思?我的理解是不仅仅是代码的不侵入,而应该是类似于依赖接口而非实现的意思。 或许大家看问题的角度不一样,所以理解的也不一样。 其实吧,非侵入性的好处从来就不是方便切换框架,而是方便单元测试, 如果看过他的两本书的话应该知道,Rod是TDD的坚定支持者,它多次强调:好的框架应该让基于它开发的组件容易测。 所以说,即便基存在你说的这个隐式侵入的问题,代码的非侵入性也仍然是有意义的,不是扯淡的。 而且我也看不出来,既然框架代码没有侵入你的组件,为什么离开spring或者简单的换个其他类似框架就不能跑了, 也许妨碍你切换框架的原因是没有一个足够强大的候选项可以代替spring吧,那这也不是侵入性造成的。 |
|
返回顶楼 | |
发表时间:2009-09-01
最后修改:2009-09-01
ferreousbox 写道 我这里说到的“入侵”并不仅仅指业务层,一般也是建议业务层是不依赖任何框架和组件的,毕竟是系统的核心处理层。但还有其他各个层,如视图、控制等。我一开始也就阐明了一旦你一开始使用这类框架,就已经实际上被框架隐式入侵了。
前面有朋友提到实现和接口的绑定可以采用其他IOC容器,我想这位朋友根本就没有仔细想这类问题,这里已经不再是简单的IOC问题了,即使你举这样的例子也是不恰当的,你想,如果你使用spring的事务管理(举个例子),你想还有其他实现一样功能的框架来给你用么?这就是标准化于非标准化的问题!所以我的意思是在没有成为标准的前提下谈非入侵都是不必要的,即使是事实标准。而且你也不用刻意的在你的系统中避免导入代码依赖,因为你根本不可能再脱离这个框架了,这就是实质问题!!! 在《WebWork In Action》中有关于“框架”这个概念的解释,说“框架的强大之处不是源自它能让你做什么,而是它不能让你做什么”,“框架使混乱的东西变的结构化”,“一种极端是框架消失了,一片混乱;另一种极端是框架留给你的选择太少,以至于你无法完成程序”……从这处解释来看,框架就是要你不要有太多的选择。所以不知道你指的“没有侵入”的框架是什么?什么会需要灵活切换框架? 我们用jquery或mootools框架时,它返回的一个Element对象,可能就和DHTML自身的Element对象不一样了,这样我们就不得不继续依赖原来用的框架。想要灵活替换或可以有很多选择?我觉得你可能想要的是一个组件——一个帮你完成一些功能的组件,但又不妨碍你使用什么框架或者不使用框架。 |
|
返回顶楼 | |
发表时间:2009-09-01
ferreousbox 写道 你也没看懂我的意思,我不是针对业务层来说事,你说的业务层无非是不依赖spring的类而已。难道你的业务层仅仅是来依靠spring做依赖注入?如果你使用了spring特有的功能(可能也不一定是特有的),那么表示已经被入侵了。我也一直强调并非一定是代码级别的入侵,明白不? 简单的说,你的系统离开spring或者简单的换个其他类似框架还能够跑么? 这就是我一开始就提到的:“非侵入”到底是什么意思?我的理解是不仅仅是代码的不侵入,而应该是类似于依赖接口而非实现的意思。 或许大家看问题的角度不一样,所以理解的也不一样。 我业务层中为什么要使用spring特有的功能,况且,spring的功能和业务层一点联系都没有? 我的业务层的确是仅仅使用spring的ioc和aop,不知道您还依靠spring做了什么? 简单的说,我的系统离开spring换个类似框架照样可以跑起来。 如果你觉得跑不起来,请举例。 |
|
返回顶楼 | |
发表时间:2009-09-01
引用 我这里说到的“入侵”并不仅仅指业务层,一般也是建议业务层是不依赖任何框架和组件的,毕竟是系统的核心处理层。但还有其他各个层,如视图、控制等。我一开始也就阐明了一旦你一开始使用这类框架,就已经实际上被框架隐式入侵了。
这还是一个如何界“入侵”的问题吧。如果所系统核心不依赖任何框架和组件,那么JDK里面的东西你算不算? 在spring文档里它把自己的声明式的事务作为一个非侵入的典型。所谓的non-invasiveness,就是框架不强迫必须引入一些特定的类型或者借口到你自己的业务或者领域模型里去(也就是说代码里可以没有显式的依赖)。 如果你认为只要运行时需要,就叫入侵了,那么大家对这个“入侵”的界定就有些不同。 |
|
返回顶楼 | |
发表时间:2009-09-01
从代码的角度讲,以减少框架代码依赖和提供可测试性的这种非侵入是有意义的我赞同;
从框架的角度讲,如果没有提供高度可剥离性和无缝切换,那非侵入就是没有意义的(如JPA就是反例); 所以我一开始站的角度是第2种,而非代码; TO:pipilu 你说的这个意义就是一种标准化 TO:herowzz 我说的是站在框架无侵入的角度不做任何修改 |
|
返回顶楼 | |
发表时间:2009-09-01
LZ你所叙述的问题并不是“侵入性”,而是“兼容性”,知道吗,你想从spring框架平滑的过滤到其他框架,这并不是因为spring的“侵入性”问题,而是,框架之间的兼容性。而且我们说的“侵入性”也是从一定角度来说的,并没有绝对的无“侵入性”,但是相比EJB而言,spring在这方面作的是很好的。
|
|
返回顶楼 | |