胡文娟
【摘要】 计算机软件开发的代码重用是一个终极目标。本论文以JAVA软件开发为例,说明了组成支持代码重用的一种方法的三个步骤。
【关键词】 JAVA 代码重用
一、引言
计算机软件开发的代码重用是一个终极目标,然而,重用可能难以实现,因为传统面向对象编程方法在可重用性方面存在一些不足。本论文以JAVA软件开发为例,说明了组成支持代码重用的一种方法的三个步骤。
二、JAVA软件代码重用的三个步骤
第一步
将功能移出类实例方法:由于类继承机制缺乏精确性,因此对于代码重用来说它并不是一种最理想的机制。执行单一概念性任务的任何方法都应该是独立的,并应将其作为要重用的首选方法。
要实现这一点,必须返回到过程式编程,将代码移出类实例方法并将其移入全局可见的过程中。
在 Java 中,方法不能脱离类而存在。但是,可以使方法成为单个类的、公共可见的静态方法。如可以采用类似下面的一个类:
class Polygon {..
public int getPerimeter() {...}
public boolean isConvex() {...}
public boolean containsPoint(Point p) {...}
.. }
并将其更改为类似以下的形式:
class Polygon {..
public int getPerimeter() {return pPolygon
computePerimeter(this);}
public boolean isConvex() {return pPolygon.isConvex(this);}
public boolean containsPoint(Point p)
{return pPolygon.containsPoint(this, p);}
..}
以上事例中所實现效果就是,客户端代码不再非要通过继承 Polygon 来重用其功能。现在这一功能在 pPolygon 类中是以过程为单位提供的。
第二步
将非基本数据类型的输入参数类型转换为接口类型:通过接口参数类型而非通过类继承利用多态性,这是在面向对象编程方法中实现可重用性的真正基础。可重用性是通过编写接口,而不是通过编写类来实现的。
将以上的论述应用到第一步的结果,一旦某个功能块可作为一个全局可见的独立过程,就可以通过将它的每个类级输入参数类型转换为接口类型,从而进一步提高它的可重用性。
例如,假定有一个全局可见的静态方法:
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 的类的对象都可作为 rect 的参数传递给 pRectangular.contains()。通过放宽对可传递给方法的参数的约束来提高方法的可重用性。
第三步
选择耦合性较小的输入参数接口类型:在执行第二步时,应该选择能充分描述过程对参数的要求且累赘最少的任何接口来替代给定的类类型。参数对象要实现的接口越小,任一特定类能实现该接口的机会就越大。如果有如下这样一个方法:
static public boolean areOverlapping(Window window1, Window window2) {...}
该方法旨在判断两个(假定为 rectangular)窗口是否重叠,如果该方法仅要求它的两个参数提供它们各自的 rectangular坐标,则简化这两个参数的类型以反映这一事实:
static public boolean areOverlapping(Rectangular rect1, Rectangular rect2) {...}
以上代码假定前面的 Window 类型对象也能实现Rectangular。现在可以重用任何 rectangular 对象的第一个方法中所包含的功能。
三、小结
以上三步旨在改进用更传统的面向对象方法编写的现有代码。将这三个步骤与面向对象编程结合使用即可构建一种新的方法,可用这种新方法编写以后的JAVA代码,这样编写代码将提高方法的可重用性和内聚性,同时也会减少方法的相互耦合及复杂性。