浅谈面向对象设计的接口隔离原则

(整期优先)网络出版时间:2009-03-13
/ 3

浅谈面向对象设计的接口隔离原则

谭琼玲

摘要:面向对象(ObjectOriented,OO)是当前计算机界关心的重点,它是20世纪90年代软件开发方法的主流。面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围。如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。

关键词:面向对象;类;JAVA;OOD;接口隔离;ISP

中图分类号:TB13文献标志码:A文章编号:1000-8772(2009)06-0144-03

面向对象(ObjectOriented,OO)是当前计算机界关心的重点,它是20世纪90年代软件开发方法的主流。面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围。如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。

对象的概念最早出现于50年代人工智能的早期著作中,而OO(面向对象)的实际发展始于1966年的KistenNygaard和Ole-JohanDahl开发的Simula语言。正如名字昭示的,Simula可以模拟客观世界。比如在著名的银行出纳问题中,你可以创建若干个出纳员对象,若干个客户对象,还有若干钱对象以及交易对象(即把存款、提款等交易动作看成一个对象)——这个世界是由对象组成的。所有出纳员对象,除了各自的状态不同,都是属于出纳员这个抽象类别。出纳员对象和客户对象之间通过消息传递进行交互,并且最终生成若干个交易对象,而交易对象可以操纵钱对象,完成存款或者提款的动作。

一、面向对象的基本概念

1.对象。对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。

2.对象的状态和行为。对象具有状态,一个对象用数据值来描述它的状态。对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。

3.类。具有相同或相似性质的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象。类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。

4.类的结构。在客观世界中有若干类,这些类之间有一定的结构关系。通常有两种主要的结构关系,即一般─具体结构关系,整体─部分结构关系。

(1)一般─具体结构称为分类结构,或者是“isa”关系。

(2)整体─部分结构称为组装结构,或者是“hasa”关系。

5.消息和方法。对象之间进行通信的结构叫做消息。在对象的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。发送一条消息至少要包括说明接受消息的对象名、发送给该对象的消息名(即对象名、方法名)。一般还要对参数加以说明,参数可以是认识该消息的对象所知道的变量名,或者是所有对象都知道的全局变量名。

6.类的特性:类具有以下5个特性:抽象、继承

(1)抽象:类的定义中明确指出类是一组具有内部状态和运动规律对象的抽象,抽象是一种从一般的观点看待事物的方法,它要求我们集中于事物的本质特征(内部状态和运动规律),而非具体细节或具体实现。面向对象鼓励我们用抽象的观点来看待现实世界,也就是说,现实世界是一组抽象的对象─类组成的。

(2)继承:继承是类不同抽象级别之间的关系。类的定义主要有两种办法归纳和演绎;由一些特殊类归纳出来的一般类称为这些特殊类的父类,特殊类称为一般类的子类,同样父类可演绎出子类;父类是子类更高级别的抽象。子类可以继承父类的所有内部状态和运动规律。在计算机软件开发中采用继承性,提供了类的规范的等级结构;通过类的继承关系,使公共的特性能够共享,提高了软件的重用性。

二、接口隔离原则(ISP)

(一)面向对象分析和设计

先看下Booch对面向对象分析和设计的经典论述:

OOP:面向对象编程是一种实现方法,程序被组织成对象的协作集合,每一个对象代表某个类的实例,对象的类是通过继承关系联合在一起的类层次中的所以成员。

OOD:面向对象设计是一种设计方法,它包含面向对象的分解过程,以及一种表示方法,用来描写设计中的系统的逻辑模型与物理模型,以及静态模型与动态模型。

OOA:面向对象分析是一种分析方法,它可以在问题域的词汇表中找到的类和对象的观点来审视需求。

按照自己的理解,面向对象分析和面向对象设计的区别小结如下:

1.面向对象分析的关键点,是其产出物能够映射到业务系统的需求。因此,面向对象分析的产物称为业务模型(BusinessModel)和业务行为,关注在:领域对象(DomainModel),领域服务(DomainService),以及相关的边界对象(BoundaryObject)和控制对象(ControllerObject);以及在此之上业务模型交互视图,包括了测量观察行为,以及账目(或类账目)处理行为。此时的设计不涉及任何具体的框架,工具包以及相关处理具体实现技术的对象。

2.面向对象设计的关键是,其产出物能映射到计算机系统的要求。因为,面向对象设计建立在面向对象分析之上,细化业务模型和业务行为,给出面向对象技术的技术实现。表现为结合了大量具体框架,工具包以及相关技术实现对象(以Factory为代表,Factory对象是处理实例化的,而这是计算机系统的概念)。

虽然面向对象分析和设计存在重大区别,然后它们有时并不能被明显区分。面向对象设计是对面向对象分析有限制作用。从实用角度讲,如果分析的成果在转化为设计的成果存在巨大困难时,分析成果的价值是有限的。

(二)接口隔离原则

接口隔离原则(ISP):使用多个专门的接口比使用单一的总接口要好。也就是说,一个类对另外一个类的依赖性应当是建立在最小的接口上的。

人们所说的接口往往指的是两种不同的东西:一种是JAVA中有严格定义的Interface结构,比如java.lang.Runnable就是一个java接口;另一种就是一个类型所具有的方法特征的集合,也称作“接口”,但这仅是一种逻辑上的抽象。

一个接口相当于剧本中的一个角色,而此角色有哪个演员来扮演相当于接口的实现。因此,一个接口应当简单地代表一个角色,而不是多个角色。如果系统涉及到多个角色的话,那么每一个角色都应该由一个特定的接口代表。

如果将接口理解成狭义的java接口,这样一来,ISP讲的就是为同一个角色提供宽窄不一的接口,以对付不同的客户端。这种办法在服务行业中叫做定制服务。也就是说,我们只提供给客户端需要的方法。一个没有经验的设计师往往想节省接口的数目,将一些功能相近或功能相关的接口合并,并将这看成是代码优化的一部分,实际上这是一种错误的做法,提供给客户多余的方法,使接口变得臃肿,造成接口污染。从一个客户类的角度来讲,一个类对另外一个类的依赖性应当是建立在最小的接口上的。使用多个专门的接口比使用单一的总接口要好。

接口污染介绍如下:比如,一个Door接口具有了lock、unlock的功能,另外一个门的对象需要监听超时时间,如果一个门开的时间太长,要自动关闭,错误的做法就是在Door接口中加入超时部分的代码。因为这样做以后,就会使得所有实现Door接口的对象都有了超时部分的功能,如果不需要就要提供null实现。一个对象从接口中获取了自己不需要的方法或者属性,并使得原来的Door接口变得越来越肥,这就是接口污染。解决的办法有两个:(1)就是适配器模式(Adapter);(2)使用多个专门的接口。

定制化服务设计原则的好处在于:这样做很整洁;有利于系统的维护,向客户端提供public接口是一种承诺,我们应尽量减少这种承诺。将接口隔离出来,有利于降低成本。

接口隔离原则指出:“ClientsShouldNotBeForcedToDependUponInterfacesThatTheyDoNotUse.在我们进行OOD的时候,一个重要的工作就是恰当的划分角色和角色对应的接口。将没有关系的接口合并在一起,是对角色和接口的污染。如果将一些看上去差不多的接口合并,并认为这是一种代码优化,这是错误的。不同的角色应该交给不同的接口,而不能都交给一个接口。对于定制服务,这样做最大的好处就是系统的可维护性。向客户端提供接口是一种承诺,public接口后是不能改变的,因此不必要的承诺就不要作出,承诺越少越好。

(三)接口隔离(ISP)举例

假设开发的一个软件系统,其后台数据源可能是关系数据库、一般的文件,还可能是另一个私有数据库。既然接口可以隔离变化,我们可以定义一个单一的接口,为所有的数据客户类提供服务。但是,上面的设计根本不能保证“实现该接口的类的实例对象可以只呈现为单一的角色”,这会带来一些问题。比如,有一个数据客户类,不需要插入、更新等功能,而仅仅需要对数据进行读操作,这时显然一个提供“读”服务的“角色”是最合理的设计,但RowSetManager却是如此之“宽”的一个接口。

接口隔离原则(InterfaceSeparationPrinciple)信奉“多个专用接口优于一个单一的通用接口”的思想,因为“任何接口都应当具有高内聚性”,以便“保证实现该接口的类的实例对象可以只呈现为单一的角色”。这样,当客户类只需要某些服务时,就只实现其中相关的接口,从而避免出现它不使用的方法的实现,同时,当某一部分需要发生变化时,我们需要修改和重新编译发布的也只是其相关的部分,不至于像上面的设计一样,所有即使实际上不会用到修改部分的类都要牵涉。

三、小结

面向对象要求以对象化的思想来分析与设计,在使用面向对象语言与工具时,要打破以前面向过程观念的影响,从对象的角度出发来思想问题,一切都是对象,从大到小,每个对象有着自己的属性与方法,它们之间有消息传递。接口隔离原则(ISP)实际上强调了在进行面向对象设计过程中要注意的对象的划分或者是角色的划分。接口专一化实际更符合对象这个概念本身的特点,因此接口隔离是我们在进行面向对象设计(OOD)中需要坚持的基本原则。

参考文献:

[1]库伯,.Java设计模式[M].王宇,林琪.林志秀,译.北京:中国

电力出版社,2003.

[2]孙立红.隔离的变送器信号调理电路[J].传感器世界,2006,

(8):22-23.

[3]吴军辉,林开颜,徐立鸿.RS485总线通信避障及其多主发

送的研究[J].测控技术,2002,(8):41-43.

[4]余永权,汤荣江.计算机接口与通信[M].广州:华南理工大

学出版社,2004.

(责任编辑:吴鹏辉)收稿日期:2009-03-11

作者简介:谭琼玲(1971-),女,湖南衡山人,讲师,从事计算机应用技术教学与研究。