会计考友 发表于 2012-8-4 12:37:27

JAVA基础:最大化Java代码的可重用性(2)

 第二步:将非原始的输入参数类型改为接口类型   在面向对象编程中,代码重用的真正基础在于通过接口参数类型利用多态性,而不是通过类继承,正如Allen Holub在 “Build User Interfaces for Object-Oriented System, Part 2”中所述:
  “……你应该通过对接口而不是类编程实现重用。如果一个方法的所有参数都是某个已知接口的引用,这个接口由一些你所不知道的类实现,那么这个方法就能够操作这样一些对象:当编写方法的代码时,这些对象的类甚至还不存在。从技术上讲,可重用的是方法,而不是传递给方法的对象。”
  将Holub所讲的方法应用于第一步所得到的结果,只要某块功能代码能够作为一个全局可见的过程而独立存在,你就可以将其每个类类型(class- type)的输入参数改为一个接口类型,这样便能进一步提高其重用的潜力。那么,实现此接口类型的任何类的对象都可以作为参数使用,而不仅仅局限于原始类。由此,这个过程对可能存在的大量的对象类型都成为可用的。
  例如,有这样一个全局可见的静态过程
  static public boolean contains(Rectangle rect, int x, int y) {…}
  这个方法用于检查给定的矩形是否包含某个给定的点。在这个例子中,rect参数的类型可以从Rectangle类改变为接口类型,如下所示:
  static public boolean contains(Rectangular rect, int x, int y){…}
  Rectangular可以是下面形式的接口:
  public interface Rectangular{
  Rectangle getBounds();
  }
  现在,所有可以被描述为矩形的类(也就意味着实现了Rectangular接口)的对象都可以作为传递给pRectangular.contains()的rect参数。通过放宽所传递的参数类型的限制,我们使方法具有更好的可重用性。
  不过,在上面这个例子中,Rectangular接口的getBounds方法返回一个Rectangle类型,你可能会怀疑使用这个接口是否具有真正的价值;换句话说,如果我们知道传入过程的对象会在被调用时返回一个Rectangle,为什么不直接传入Rectangle取代接口类型呢?不这样做的最重要原因与集合有关,假设有这样一个方法:
  static public boolean areAnyOverlapping(Collection rects) {…}
  这个方法的目的在于检查给定集合中的任意矩形对象是否存在重叠。那么,在方法内部遍历集合中的每个对象时,如果无法将对象造型(cast)成如 Rectangular这样的接口类型,那么将如何能够访问对象的矩形区域呢?唯一的选择是将对象造型成为其特定的类型(我们直到它有一个能够返回 rectangle的方法),这意味着方法必须事先知道其所要操作的是什么类型。这恰恰是这一步骤力图首先要避免的问题!
页: [1]
查看完整版本: JAVA基础:最大化Java代码的可重用性(2)