锁定老帖子 主题:Extension设计
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-10-31
jimmy_c 写道 bradwoo8621 写道 比较赞同7楼的意见, eclipse的extension point做的的确很好, 理论上可以无限扩展, 不过他的设计我没有搞的很明白, 7楼如果有时间和兴趣可以指点一下吗?
这个扯得比较远了。一直觉得楼主是在讨论设计模式层面的东西,而不是eclipse式的framework甚至是architecture设计的问题。这种设计,一般水平的程序员还是不要模仿为好。因为:1. 水平。设计架构遇到的很多问题我想多数人可能还想不清楚;2. 需求。其实多数情况我们需要的只是一点小技巧,用不上这种层面的技术。孔子说,不要用大炮打蚊子。 其实技术不是越大越好,大在更多选择的同时,往往也意味着更多的约束(这还没有讨论到随着指数增长的工作量)。 咳,这些问题,还是把《设计模式》和《敏捷软件开发》两本书读通了再来讨论吧。 另外我恰恰认为这是关于framework的问题, 为什么会扯到设计模式呢? 我觉得设计模式的确在很多地方给我们带来了好处, 但是没有一个好的框架,即使小技巧再好, 对于一个公司来说可能获益也不会很明显. |
|
返回顶楼 | |
发表时间:2007-10-31
bradwoo8621 写道 jimmy_c 写道 bradwoo8621 写道 比较赞同7楼的意见, eclipse的extension point做的的确很好, 理论上可以无限扩展, 不过他的设计我没有搞的很明白, 7楼如果有时间和兴趣可以指点一下吗?
这个扯得比较远了。一直觉得楼主是在讨论设计模式层面的东西,而不是eclipse式的framework甚至是architecture设计的问题。这种设计,一般水平的程序员还是不要模仿为好。因为:1. 水平。设计架构遇到的很多问题我想多数人可能还想不清楚;2. 需求。其实多数情况我们需要的只是一点小技巧,用不上这种层面的技术。孔子说,不要用大炮打蚊子。 其实技术不是越大越好,大在更多选择的同时,往往也意味着更多的约束(这还没有讨论到随着指数增长的工作量)。 咳,这些问题,还是把《设计模式》和《敏捷软件开发》两本书读通了再来讨论吧。 另外我恰恰认为这是关于framework的问题, 为什么会扯到设计模式呢? 我觉得设计模式的确在很多地方给我们带来了好处, 但是没有一个好的框架,即使小技巧再好, 对于一个公司来说可能获益也不会很明显. 既然楼主比较认同我在9楼说的,就继续这个思路往下说吧。很多时候,是否采用interface也是由需求决定的,或者时髦地说,由需求驱动的。我觉得,在多数引入interface的时候,我们要想一想,这个interface是否是必须的?我的想法是,如果你不能保证这个接口以后80%会被使用的话,那么这个interface的引用就是有问题的。我们的代码,应该是最快最简洁地完成手头的story。以后的需求变更,还是由新的story来保证比较好。 说到这里,你可能已经意识到了我能这样做是因为我使用了XP的开发模式。不错,其实我一再想强调的是: 1. 更改代码和设计实际上不是最time-costing的工作,我们不能怕代码以后会有改动,而要时刻做好改动的准备(XP所说的拥抱变化)。而这种保证并不是“过渡设计”带来的,而是比如:更好的测试,更好的代码风格,等等。 2. 对于多数人来说,适当的设计要好于过渡设计。我真的不明白为什么扩展性的问题不能“扯到”设计模式。不夸张的说,每一个设计模式,100%都和扩展性问题有关。 3. 框架是什么,我想楼主似乎也不太理解。它其实往往意味着更多的依赖。设计都是两面性的,当你引入更大自由度的同时,必然会引入与此相当的约束性。小的设计有小的约束,大的框架性的东西有大的约束。设计约束的内容种类繁杂,诸如,你使用何种平台?数据库?你的文件格式如何?你的扩展模块如何工作?代码格式如何?类的设计有何限制?你的性能要求是哪个数量级的?是否支持国际化?等等,等等。很多动辄说要引入一个“框架”的人,往往是些初学者。因为他们根本没有意识到这些约束的存在。他们谈论“框架”,往往只是因为一些诸如通用,远程,并发之类的大词,让他们觉得“爽”,而根本不是权衡利害之后的结论。 而做到“权衡利害”的一个基本前提就是:你的需求是什么? 相反,一个小的、适当的设计是比较容易找到的,即使对很多初学者。 建议初学者先学会了设计模式,超越了设计模式之后,再来考虑框架性的问题,不然你写出来的,只能是毫无价值的习作。 |
|
返回顶楼 | |
发表时间:2007-10-31
bradwoo8621 写道 第一种方案或许约束了以后的发挥, 但是这个接口可以看到一个明确的需求的体现, 而不再是泛泛而谈.
做了这么多年编程,感受是:能够真正体现“一个明确的需求”的合适的方法,目前只有Unit Test。 interface?很多interface并不能给你足够多的信息,还是需要通读源码才能获得自己想知道的东西,即使这接口是高手设计的。至于初学者设计的接口么,咳咳,我就不说了。 |
|
返回顶楼 | |
发表时间:2007-10-31
老兄的意思我已明白了. 就此打住, 这样争论不会有什么结果的. 不知道还有没有其他声音可以听到?
说句题外话, 不知道按照现在的行业水准, XP如何才能实现? 另外有个建议, 不要动则"不理解", 这或许不是讨论问题的态度. |
|
返回顶楼 | |
发表时间:2007-10-31
bradwoo8621 写道 老兄的意思我已明白了. 就此打住, 这样争论不会有什么结果的. 不知道还有没有其他声音可以听到?.
其实未必。比如,我一再强调:明确你的需求。我希望的是,对明确的问题进行讨论。而你的答复一再回避这一点。你的AOP的例子和你的问题并不是一回事,不是么? bradwoo8621 写道 说句题外话, 不知道按照现在的行业水准, XP如何才能实现?
XP不能实现?至少我现在在用。javaeye上很多大拿都有这样的实践吧!我就跟他们学到不少。 bradwoo8621 写道 另外有个建议, 不要动则"不理解", 这或许不是讨论问题的态度.
我想这是楼主动怒的原因了。其实这也是我自勉的话。承认"不理解"没什么可耻的,至少我觉得自己还处于一个“半瓶醋”的状态。怕的是不理解而不自知。不过javaeye上的大拿们也只是达到了“理解”和“超越”设计模式的状态吧。有谁说自己已经很牛,能够独立设计一个通用“框架”的,能够创造“architecture”的,站出来让兄弟敬仰一下。我想他们大多也只处于探索和讨论阶段吧。 |
|
返回顶楼 | |
发表时间:2007-10-31
我明白了楼主的意思。其实楼主你把你的扩展点想像成接口或方法签名、将你的所谓贡献者想像成实现该接口的类或实现该方法的方法体,你的一二三四不就很容易理解了吗?你那样说太抽象了,有几个知道你自己的一套术语是什么意思。
这两套方案分别对应由上往下和由下往上的两种不同设计模式,一种是解析,一种是综合,一种是J2EE,一种是IoC,一种是类似于Eclipse平台的插件体系,一种是大杂烩应用程序,一种是Micro kernel操作系统,一种是monolithic操作系统。这些不同的对比分别对应于你所说的所谓方案A和方案B。别说的那么抽象,本来很简单的问题。 给你分析一下: 引用 1。A:扩展点不依赖贡献者, 也就是扩展点本身除了占位符以外应该有其本身的外观定义。换句话说就是扩展点本身能够提供什么,他想要获取什么。而中间过程不注重, 由贡献者提供。 可翻译为: 接口不依赖于类的定义,也就是接口除了接口的声明(占位符)还应该有其本身方法的签名定义(外观定义)。换句话说,接口本身能够提供什么,它想要获得什么(都体现在方法的签名中,参数和返回值)。而具体接口方法的实现过程不注重,而由实现该接口的类提供。 引用 B:扩展点依赖贡献者,也就是扩展点的生命周期小于贡献者,必须先有贡献者才能有扩展点。 翻译: 接口要根据实现的类定义,也就是现有了类的定义,才能有调用接口。(典型的由下往上上的设计方法,先有实现,再抽取接口) 引用 2。A:贡献者需要有外观定义,内容和扩展点的外观定义一致。因为所有贡献的外观都可以被转化为输入和输出。 翻译: 实现类要有方法签名的定义,其签名和类实现的接口方法定义一致。因为所有的实现类的方法签名都可以转化为方法参数和方法返回 引用 B:贡献者不需要有外观,因为不同类别的贡献者外观很难确定。贡献者的外观将被其实现所决定。 翻译 实现类可以没有事先没有接口方法的签名定义,因为不同实现类开始要实现的接口很难确定。实现类的方法签名需要由其方法体定义所决定。(典型的自下往上的设计方法,先考虑怎么实现,再定义一个描述接口) 引用 3。A:扩展点可以一次拥有多个贡献者,通过组合贡献者的逻辑实现一个更大的贡献。 翻译: 同一个接口可以一次拥有多个实现类,通过组合实现类的逻辑可以实现另外一个实现类(代理机制)。 引用 B:扩展点一次只能拥有一个贡献者,如果逻辑分散在多个贡献者中(已经被实现了),那么需要另一个贡献者先将这些贡献者包含以来提供给扩展点使用。 翻译: 每个类开始定义只能有一个,如果类的实现可以由其他多个组合实现(已经被实现了),那么需要另外一个类将这些类组合起来提供给最终的实现类。(Spring的POJO使用IoC机制进行组合不就是这样吗,由于只有一个实现类,接口和实现类就没必要分开了) 引用 4。A:扩展的位置信息应该单独抽取一个接口来描述, 这样在不更改扩展点外观的前提下可以更换位置信息的描述方式。并且仅需要针对不同的位置信息编写适配器来解析其内容。 翻译: 这儿已经说明了所谓的扩展位置在程序中对应为一个接口。只是不明白你后面说的这些更换位置信息什么意思。 引用 B:位置信息不应当单独抽取,其信息应当出现在扩展点的实现当中。由不同的扩展点适配器来解释。 翻译: 这儿可能的意思是实现类不需要接口,其信息应该出现在实现类(扩展点的实现=贡献者=实现类)的签名中。由不同的代码调用。 这样不就很明白了吗,显然应该使用A方案。 总之实质上来说,你说的A、B两个方案就是设计模式的两个不同方向。 有时这种问题没有必要抽象的来想,找一个对应物进行想像最简单不过了。比所谓各种模式要容易理解多了。 |
|
返回顶楼 | |
发表时间:2007-11-01
16楼翻译的不错. 我说的太过术语化了.
引用 这儿已经说明了所谓的扩展位置在程序中对应为一个接口。只是不明白你后面说的这些更换位置信息什么意思。
更换位置的意思是, 由于扩展点很难说到底会在什么地方, 或许是一个Java类的Method, 或许是JSP中的一个Tag,或许是其他什么东西. 这些位置很难用一个通用的接口来定义清楚, 因此将位置接口从扩展点接口中剥离出去, 而扩展点中除了位置信息不能在接口中定义清楚之外, 其他都可以. 因此在解析的时候, 解析扩展点的适配器不需要更换, 只需要根据位置的实现来更换解析位置的接口就OK了. 除了这个之外, 我还有一个问题比较困扰, 就是外观. 外观到底能不能简单的定义为输入和输出的组合, 不知道老兄有什么见解, 还望赐教. btw, 老兄的名号好熟悉, 经常出没于什么论坛? |
|
返回顶楼 | |