编程教程
您现在的位置: 中国个人站长站 >> 网络编程 >> Javascript >> 教程正文 最大限制地提高代码的可重用性
推荐位

最大限制地提高代码的可重用性

中国个人站长站 Javascript 点击数: 更新时间:2007-7-28 22:03:23
sp;Interfaces for Object-Oriented Systems, Part 2" 中所讲的那样。

“... 可重用性是通过编写接口,而不是通过编写类来实现的。如果一个方法的所有参数均为一些已知接口的引用,而这些接口又是由您从未听过的一些类实现的,那么该方法可对编写代码时还不存在的类的对象进行操作。从技术上讲,可重用的是方法,而不是传递给该方法的对象。”
将 Holub 的论述应用到第一步的结果,一旦某个功能块可作为一个全局可见的独立过程,您就可以通过将它的每个类级输入参数类型转换为接口类型,从而进一步提高它的可重用性。这样,实现该接口类型的任何类的对象都符合该参数的要求,而不仅仅是符合原始类的要求。这样,该过程便潜在地可用于更多的对象类型。

例如,假定您有一个全局可见的静态方法:

static public boolean contains(Rectangle rect, int x, int y) {...}


该方法旨在判断给定的矩形是否包含给定的位置。此处您应该将 rect 参数的类型从类类型 Rectangle 更改为接口类型,如下所示:

static public boolean contains(Rectangular rect, int x, int y) {...}


Rectangular could be the following interface:

public interface Rectangular {
Rectangle getBounds();
}


现在,可描述为 Rectangular 的类(即可实现 Rectangular 接口)的对象都可作为 rect 的参数传递给 pRectangular.contains()。我们通过放宽对可传递给方法的参数的约束来提高方法的可重用性。

但是,就以上示例而言,当 Rectangle 接口的 getBounds 方法返回一个 Rectangle 时,您可能不知道使用 Rectangular 接口会有什么实际的好处;也就是说,如果我们知道我们要传入的对象在被请求时能返回 Rectangle;为什么不传入 Rectangle 类型而要传入接口类型呢?最重要的原因与集合有关。假定有这样一个方法:

static public boolean areAnyOverlapping(Collection rects) {...}


该方法旨在判断给定集合中的 rectangular 对象是否有重叠。接下来,在方法体中,当您依次处理集合中的每个对象时,如果无法将对象转换为诸如 Rectangular 这样的接口类型,如何才能访问那个对象的 rectangle 呢?唯一的选择是将对象转换为特定的类类型(我们已知该类中有一个方法能提供 rectangle),这意味着该方法必须事先知道它要对何种类类型进行操作,因此重用它时只能使用这些类型。这就是这一步首先要避免的问题!

第三步:选择耦合性较小的输入参数接口类型
在执行第二步时,应该选择何种接口类型来替代给定的类类型呢?答案是:能充分描述过程对参数的要求且累赘最少的任何接口。参数对象要实现的接口越小,任一特定类能实现该接口的机会就越大 -- 因而其对象可用作该参数的类的数量也就越多。很容易看出,如果您有如下这样一个方法:

static public boolean areOverlapping(Window window1, Window window2) {...}


该方法旨在判断两个(假定为 rectangular)窗口是否重叠,如果该方法仅要求它的两个参数提供它们各自的 rectangular 坐标,则最好简化这两个参数的类型以反映这一事实:

static public boolean areOverlapping(Rectangular rect1, Rectangular rect2) {...}


以上代码假定前面的 Window 类型对象也能实现 Rectangular。现在您就可以重用任何 rectangular 对象的第一个方法中所包含的功能。

您可能有过多次这样的经历,即充分指定了参数要求的可用接口包含过多不必要的方法。碰到这种情况时,您就应在全局名称空间中定义一个新的公共接口,以便其他可能面临同样窘境的方法重用这个接口。

您也可能有过多次这样的经历,即最好创建一个独特的接口来指定单个过程对一个参数的要求。您所创建的接口只会用于那个参数。当您希望将参数当作 C 中的函数指针处理时经常会出现这种情况,例如,假定有这样一个过程:

static public void sort(List list, SortComparison comp) {...}


该过程通过使用给定的比较对象 comp 对列表的所有对象进行比较,从而对给定的列表进行排序,sort 对 comp 的全部要求就是调用其单个方法执行比较。因此,SortComparison 应该是仅包含一个方法的接口:

public interface SortComparison {
boolean comesBefore(Object a, Object 

上一页  [1] [2] [3] 下一页

教程录入:swh    责任编辑:swh 
个人站长站与你风雨同舟!
本站所提供的资源均来源于互联网,如有侵权行为,请与本站管理员联系,我们会第一时间删除!
·如果您发现《最大限制地提高代码的可重用性》文章有错误,也请通知我们修改!
联系邮箱chinageren#126.com,谢谢支持!
站内搜索:
广告服务 | 友情链接 | 联系我们 | 免责声明 | 用户留言 | 网站导航
版权所有:中国个人站长站 2007-2008 未经授权禁止复制或建立镜像 客服QQ号:112731235
copyright © 2007-2008 www.ChinaGeRen.com online services. all rights reserved. 苏ICP备05000059号