StupidBeauty
Read times:3199Posted at:Wed May 31 08:26:57 2017 - no title specified

《C++面向对象软件设计及构建》文章翻译:1.3分离性,1.3 Separation

分离性,是指,将以下两个事物区分开来:目标或效果;以及,用来实现该目标或效果的手段或机制。通常,将这件事称之为:将要办的事情( what )和如何办这件事情( how )分离开来。下表中,展示了,通常用来反映这种分离概念的术语对。


用来反映分离概念的术语

what(什么)

how(如何)

goals(目标)

plans(计划)

policy(策略)

mechanism(机制)

product(产品)

process(过程)

interface(接口)、specification(规范)、requirement(要求)

implementation(实现)

ends(结果)

means(手段)

分离性,对于在将复杂系统简化的过程狠有用,因为,目标或效果通常比较容易解释,而对应的用于达到目标或实现效果的手段,却不那么容易解释。例如,对于一个迷宫谜题,要解释其目标就比较容易("找到一条从入口处通往出口处的路。"),而要找到实际的解决方法或者描述用于找到实际解决方法的算法,则比较困难。

程序猿们,对于分离性,狠熟悉,因为,所有的手册和文档中都是这么做的。例如,对于 read(f, buffer, nbytes) 命令的一个典型描述是,这个命令,会将 nbytes 的数据从文件 f 传送到指定的缓冲区 buffer 。为了实现这个效果,其背后的机制比较复杂,牵涉到磁盘硬件、软件的设备驱动程序、文件系统、磁盘块管理代码和运行时的输入/输出库,这些东西,都不需要在 read 命令的说明文档中提及。

软件设计中,对于分离性的良好使用,体现在,将接口与实现区分开来。接口,被看作是软件的可见的、外在的外观,用户需要知道这个东西才能使用这个软件;实现,被看作是软件的隐藏的、内在的实质,它只对实现者来说狠重要。定义中,就是使用的这种形式的分离性:

分离

在面向对象编程中,将接口与它的一个或多个实现单独进行说明。

如果某个接口所指定的行为,由某个实现提供,那么,该实现就 满足 该接口。

下图中所建议的接口实现相分离的概念,在多种不同级别都出现过。各个软件库的手册页面中,仅仅会说明各个接口的接口属性,而不会说明各个操作具体是如何实现的。更复杂的软件(例如,一个窗口系统,或一个网络环境),可能会通过应用程序编程接口(API)来进行说明。应用程序编程接口中,定义了,有哪些数据结构和工具对于程序猿是可用的,但不会说明那些数据结构和工具是如何实现的。再举一个例子,一个软件标准,是指,对于某个服务的一个公认可接受的定义(例如,TCP/IP通信协议标准),它定义了,一个符合标准的系统应当向外界展现出来的行为,但是,并不限制具体实现者以何种方式来实现该行为。

接口与实现相分离

除了简便性这个优点之外,分离性还为实现者提供了灵活性。因为,不同的实现可能都会满足相同的接口。多种不同的实现,可能会在以下方有所区别:时间及空间效率;购买价格;可维护性;文档质量;可靠性;或其它的非功能性因素。如果达到了完整的分离性,那么,对于某个接口,可将一个实现替换成另一个实现,还不会改变其所置身于其中的整体系统的运作方式。下图展示了,将相同的接口关联到不同的实现的能力。

不同实现之间的可替换性

对于同一个接口的两个不同的可替换的实现,被称为“可插拔兼容性”;拔出当前实现,再插入它的替换实现。显然,狠多非软件产品都利用到了这种可替换能力的优点:汽车轮胎;音箱;电脑显示器;等等。

单个实现中,可以同时满足多个接口。这种情况下,该个实现中,会包含,所有的接口中所要求的全部方法的并集(并且,还可能包含额外的并未被任何一个接口所使用的方法)。下图中,所展示的实现,名为Graphics,其中包含了两个方法,DrawTextDrawShape。同时也显示了两个接口:TextInterface,其中仅仅定义了DrawText 方法;和ShapeInterface,其中仅仅定义了DrawShape 方 法。显然,Graphics这个实现,同时满足两个接口。

不同实现之间的可替换性

正如图中所示,每个接口,为该个实现提供了不同的视图:每个视图,可能只会暴露出该个实现的完整能力中的一部分。这种受到限制的视图,是狠有用的,可用来在指定情况下或者是系统中特定部分的要求下将多种能力分隔开来。将能力分隔出最需要的受限集合,就能够做到:将一个能力更广泛的实现(例如,Graphics)(其中可能会包含一些并不需要的操作(例如,DrawShape)),替换成一个较小规模的实现(其中仅仅包含在这个更有限的接口中定义的方法)。例如,假设系统中某个部分仅仅需要由TextInterface 所定义的方法。这种需求,可以由比较通用的Graphics 实现来满足,也可以由一个更专用的仅仅实现了TextInterface 接口而未实现ShapeInterface 接口的实现来满足。由于它是专用的,所以,较小的那个实现,可能在运行时会更快速,或者占用较少的内存。

Your opinions

Your name:Email:Website url:Opinion content: