APP下载

面向对象软件开发中代码重用的实现策略

2015-03-23

电子科技 2015年5期
关键词:通用性子类面向对象

赵 焱

(昆明船舶设备研究试验中心人事处,云南昆明 650000)

为提高软件的开发效率,软件工程师们越来越追求开发更多、更有通用性的可重用构件。传统的结构化方法是将系统功能分解编写模块,每个模块实现特定的功能,可重用的单位只能是模块,且用户需求的变化需花费较大代价去实现。为了适应软件开发的更高要求,提高软件产品的稳定性和可修改性,从而产生了面向对象[1]。

1 面向对象的软件开发

面向对象(Object Oriented,OO)是一种软件开发的方法。起初,其专指在程序设计中采用封装、继承和多态等设计方法。但如今,面向对象开发方法的研究已日趋成熟,面向对象的思想已涉及到软件开发的各个方面。

面向对象的软件开发包括3个阶段:面向对象的分析(Object Oriented Analysis,OOA),面向对象的设计(Object Oriented Design,OOD)、以及面向对象的实现(Object Oriented Programming,OOP)。面向对象分析的目的是对客观世界的系统进行建模,用分析模型来明确问题需求,为用户和开发人员提供一个协商的基础,同时为面向对象设计和实现提供了一个基本框架。面向对象的设计以面向对象的分析为基础,通过系统设计和对象设计将分析阶段得到的需求转变成符合成本和质量要求的、抽象的系统实现方案。面向对象的实现即选用能最完善、准确地表达问题域语义的面向对象语言开发软件,其基本目的和主要优点是通过重用提高软件的生产率[1]。

2 代码重用的实现策略

在面向对象的软件开发过程中,一般通过对接口编程、改写类的实例方法和代码分离的方式来实现代码重用。

2.1 对接口编程

面向接口编程是实际开发过程中实现代码重用的一个重要方法,其根本思想是将一个接口或抽象类从一组功能相同的组件中进行抽象形成。通过面向接口编程,当任务中需要其他组件时,无需对程序代码进行更改,而只需更改该接口的实现即可。现存的组件不能满足设计需求时,通常有两种方法来完成:一是创建一组新的组件;二是对现存的相关组件进行扩展,通过新的子类来完成所需的扩展功能[2]。

继承是代码重用的一个基本方法,但在面向对象编程中,类继承不是代码重用的真正要点,可通过对接口编程来达到代码重用的目的[3]。在实际应用过程中,当某块代码能编写成独立的全局过程时,只要将其所有类形式的参数改为接口的形式,就可进一步提高的可重用能力。经此改动后,过程的参数就不仅是原来类所创建的对象,而是实现了该接口所有类的对象。例如,假设有这样一个全局静态方法contains():

static public bollean contains(Rectangle rect,int x,int y){…}

该方法用于检查指定的点是否包含在矩形内,若将rect的参数类型Rectangle改成接口:

static public oolean contains(Rectangular rect,int x,int y){…}

其中,Rectangular接口的定义如下

public interface Rectangular{Rectangle getBounds();}

经此改动后,contains方法的参数变成所有实现了Rectangular接口类的对象。通过将参数类型改为接口的形式,可放宽对参数类型的限制,扩大过程所使用参数的范围,从而大幅提高方法的可重用能力。

通过上述分析可知,将参数类型改为接口可提高代码的可重用能力,但在实际应用过程中,将参数类型改成接口可能有多种方式,不同的更改方式其实现所需的代码、数据和容易程度均不相同。因此,首先需确保方法对参数的要求,然后尽量将参数类型改为简单的接口。接口越简单,类实现接口时就越容易,能将其作为参数进行使用的类也就越多,代码的可重用能力则越大[4]。

2.2 改写类的实例方法

在实际编程过程中,对于那些能执行某个单一任务的方法,可进行重用来节省编程的成本。为此,可通过将相关的实例方法组织成为独立的类,使其成为一个公用的全局性静态过程。为了提高这种过程的可重用性,过程代码应同静态工具方法编写一致:即只能使用自身的输入参数,仅可调用其他全局性的过程,不能使用任何非局部的变量[5]。这种对外部依赖关系的限制简化了过程的应用,使得过程能方便地用于任何地方。这种组织方式的使用使得代码结构更加清晰。因此,即使不考虑重用性的代码也能从中获益。

众所周知,Java中的方法不能脱离类而单独存在。所以为实现代码重用,可将相关过程定义为公用的静态方法,并组织为独立的类。例如,对于Polygon有:

class Polygon{…

public int getPerimeter(){…}

public boolean isConvex(){…}

public boolean containsPoint(Point p){…}..

}可将其改写为:

public int getPerimeter(){return pPolygon.computePerimeter(this);}

public boolean isConvex(){return pPolygon.isConvex(this);}

public boolean containsPoint(Point p){return pPolygon.containsPoint(this,p);}

其中,pPolygon类定义如下:

class pPolygon{

static public int computePerimeter(Polygon polygon){…}

static public boolean isConvex(Polygon polygon){…}

static public boolean containsPoint(Polygon polygon,Point p){…}

}

在上述例子中,pPolygon类中封装的公用静态方法参数均与Polygon类型的对象有关,通过改写pPolygon类的实例方法,Polygon类的功能转由pPolygon类以过程为单位进行提供,不继承Polygon类也可使用Polygon类的功能。由此,客户代码只使用自身需要的代码,而无需关心其他不需要的功能。

2.3 代码分离

由于继承会带来一些多余的方法和数据成员,且更改父类时会影响子类功能,子类对父类的依赖关系会使代码变得复杂,子类中的覆盖方法是否要调用父类中的对应方法有时也并不明显。因此,仅通过继承来实现代码重用会存在一定的不足,其并不是最为理想的代码重用机制,所以通常是将继承与代码分离技术相结合来实现代码的重用。所谓代码分离就是将可变部分和不可变部分分离开,其是面向对象设计的一个重要原则。在通过继承进行代码重用时,可在抽象基类中定义好不可变的部分,然后由其子类去实现可变的部分[6]。

3 代码重用的注意事项

尽管代码重用的优势明显,但并非所有的代码均能进行代码重用。代码重用需注意以下几点:(1)只有高通用性的代码才可重用。一般来说,通用性较低的代码不适合进行代码重用。因在多个项目间重用不为通用性设计的代码,反而会使整个开发过程变得复杂,同时会增加开发的时间和成本。(2)依赖度高的代码不适合重用。有些代码与开发人员有较大的依赖性,且无相应的文档来描述程序设计细节。新进项目的人需花费大量的时间和精力才可理清楚代码间的相互关系。类似依赖度高的代码越多,工作难度越大,进行代码重用就越困难。(3)高成本、低使用率的代码不适合重用。代码重用虽有众多优势,但在使用过程中仍需考虑其成本和使用率。若需付出过高的成本,且重用代码的使用率较低,则不适合进行代码重用。

4 结束语

介绍了面向对象的软件开发方法及其3个阶段:面向对象的分析、面向对象的设计和面向对象的实现。并结合实例分析了在该开发方法中代码重用的3种实现策略,即对接口编程、改写类的实例方法和代码分离。通过这3种策略与面向对象编程技术的结合,能简化方法的复杂性和依赖关系,同时可提高方法的可重用性和内聚力。但并非所有的代码均能进行代码重用。因此,在重用过程中要注意代码的通用性和依赖度,同时还需考虑重用的成本和重用代码的使用率,使代码重用在面向对象软件开发中真正发挥其的重要作用。

[1]梁燕来,程裕强.Java面向对象程序设计[M].北京:人民邮电出版社,2013.

[2]Bruce Eckel.Java编程思想[M].3版.陈昊鹏,译.北京:机械工业出版社,2005.

[3]Allen Holub.Build user interfaces for object- oriented systems[EB/OL].(2000 -03)[2014 -10]http://www.javaworld.com/article/2076459/core-java/building-userinterfaces-for-object-oriented-systems- -part-1.html.

[4]马永杰,蒋兆远.基于功能构件的软件复用方法[J].计算机应用与软件,2009,26(8):75 -77.

[5]谢冰,张晨东.面向对象测试代码复用算法与工具[J].计算机工程与科学,2008,30(11):109 -110.

[6]郭志学.易学设计模式[M].北京:人民邮电出版社,2009.

[7]成岳鹏,戴永成.基于面向对象的软件重用技术[J].河北工业科技,2009,26(5):434 -437.

[8]萨默维尔.软件工程[M].9版.北京:机械工业出版社,2011.

[9]Herbert Schildt.Java完全参考手册[M].8版.王德才,吴明飞,唐业军,译.北京:清华大学出版社,2012.

[10]秦小波.设计模式之禅[M].2版.北京:机械工业出版社,2013.

[11]朱福喜.面向对象与Java程序设计[M].北京:清华大学出版社,2009.

[12]Grady Booch.面向对象分析与设计[M].3版.北京:电子工业出版社,2012.

猜你喜欢

通用性子类面向对象
卷入Hohlov算子的某解析双单叶函数子类的系数估计
基于元模型的通用性列控仿真平台基础环境研究
Java类的继承
抛丸机吊具的通用性设计以及抛丸器的布置
提升电网企业制度通用性的应用研究——以“1 + 2 + 3”闭环管理机制构建精益高效的制度管理体系
面向对象的多版本传感器观测服务模式匹配方法
面向对象Web开发编程语言的的评估方法
峰丛洼地农作物面向对象信息提取规则集
高性能扁丝技术及市场的最新进展
基于面向对象的车辆管理软件的研制与开发