理论不懂就实践,实践不会就学理论!
昨天在fog讨论到这个问题,fog认为Extension Point是按照IoC的思路实现出来的,我来谈谈我的观点,我却认为Extension Point并不是按照IoC思路来实现的,甚至可以说两者没有关系。首先来说说IoC,IoC,全称Inversion of Control,Martin Fowler认为这个词有些不恰当,建议改为DI,为什么呢?其实这是因为IoC的本质决定的,IoC是什么,其主要作用是解耦,分离关注点,通俗点说就是使得调用者和被调用者之间没有直接的耦合,而只是接口的耦合,举例来说:在没用IoC实现的时候是这样的:
可见在这里造成的一个问题就是调用者A和被调用者B的实现构成了一个直接的依赖,为什么Martin Fowler要建议改名成DI呢,原因就在这了,这里造成的是抽象对实现的依赖,这不用说,是严重违反OO中依赖抽象而不依赖实现这一原则的,所以称为DI确实更符合一些。
再来看一下使用了IoC后是这样的:
可见在这里调用者A和被调用者B是接口的依赖,而不是实现的依赖,这就实现了调用者对于被调用者具体实现依赖的解耦。当然,也许诸位看官会说可以用Factory之类的模式来实现对具体依赖的解耦,但那样同样造成一个问题就是调用者和被调用者的Factory耦合,而在IoC中是不会有这个问题的,调用者和被调用者之间只有清晰的接口依赖。根据上面这些解释,我们可以看出IoC最大的好处在于解耦调用者对于被调用者具体实现的依赖。
现在来说说Extension Point,Extension Point是Eclipse为支持Plugin扩展而做的一种设计,举例来说吧,在工具栏这个Plugin中,必然需要提供某种方法能使得其他Plugin可加入按钮至工具栏中,那么该怎么去做呢,在Extension Point中是这么实现的,工具栏Plugin提供了一个这样的Extension Point,其他的Plugin只需要实现这个Extension Point即可加入按钮至工具栏中,工具栏的Plugin在可扩展的地方通过对于容器中Extension Point注册信息的获取来取得所有实现了当前Extension Point的类,并相应的进行调用。这里还是得罗嗦一下Extension Point的实现思路,在Eclipse中是这么做的,首先它会根据各Plugin提供的Extension Point构成一个Extension Point的信息集合,之后根据各Plugin提供的Extension Point的实现构成Extension Point Registry,而各提供了Extension Point的Plugin必然会在可扩展的地方调用这个Registry获取相应实现了此Extension Point的集合,通过所提供的Extension Point Interface做相应的callback来实现扩展。首先我们来看,如果Extension Point是采用IoC思想来实现的,那么我们可以按照IoC思想来进行分析,那么提供Extension Point的Plugin就是调用者,提供Extension Point实现的Plugin就是被调用者,按照IoC思想是为了解耦调用者对于被调用者实现的依赖,那么我们可以看出这个命题是不成立的,这里的关键在于提供Extension Point的Plugin并不依赖于实现Extension Point的Plugin,它才不关心哪些Plugin实现了它的Extension Point,没有直接的依赖关系又何来IoC一说。其次我们来看Extension Point的设计目的是为了什么?它设计的目的是为了Plugin可被扩展,而不是说用于解除Plugin之间依赖的问题。其实Extension Point的设计思路很简单,是类似Template的模式,只是它把所有实现了此Template的信息都集中存储了,并且由提供了Template的类去获取了所有的这些信息,鉴于此我还是坚持自己的观点Extension Point并不是按照IoC的思想来设计的,两者并没什么关系。
posted on 2005-07-15 10:47 BlueDavy 阅读(953) 评论(2) 编辑 收藏 所属分类: Java
我认同fog的观点 而且DI和Template模式正是IoC在面向对象领域的表现形式 DI和模板方法模式的区别在于 DI用于解除创建依赖 模板方法用于解除行为依赖 你的这几句似乎有逻辑问题: “我们可以按照IoC思想来进行分析,那么提供Extension Point的Plugin就是调用者,提供Extension Point实现的Plugin就是被调用者,按照IoC思想是为了解耦调用者对于被调用者实现的依赖,那么我们可以看出这个命题是不成立的,这里的关键在于提供Extension Point的Plugin并不依赖于实现Extension Point的Plugin” 真是因为EP的提供者不依赖于EP的实现者,所以才符合IoC的思想 也就是组件IoC 而不是因为EP中没有IoC要解耦的那种依赖所以不叫IoC 因为它符合IoC,所以不存在IoC要解决的问题,这个是不是有点绕? ^_^ 因为符合IoC,所以问题已经被解决掉了,自然不存在了 回复 更多评论
恩,说的是,那个逻辑分析我写的是有问题的,应该从EP解决的问题点来分析 回复 更多评论