软件重用——类构件

11.3.2    类构件

    利用面向对象技术,可以更方便更有效地实现软件重用。面向对象技术中的“类”,是比较理想的可重用软构件,不妨称之为类构件。类构件有3种重用方式,分别是实例重用、继承重用和多态重用。下面进一步讲述与类构件有关的内容。

1.可重用软构件应具备的特点

    为使软构件也像硬件集成电路那样,能在构造各种各样的软件系统时方便地重复使用,就必须使它们满足下列要求:

(1)模块独立性强,具有单一完整的功能,且经过反复测试被确认是正确的。它应该是一个不受或很少受外界干扰的封装体,其内部实现在外面是不可见的。

(2)具有高度可塑性。软构件的应用环境比集成电路更广、更复杂。显然,要求一个款构件能满足任何一个系统的设计需求是不现实的,因此,可重用的软构件必须具有高度可裁剪性,也就是说,必须提供为适应特定需求而扩充或修改已有构件的机制,而且所提供的机制必须使用起来非常简单方便。

(3)接口清晰、简明、可靠。软构件应该提供清断、简明、可靠的对外接口,而且还应有详尽的文档说明,以方便用户使用。

    从本书第9章讲述的面向对象基本概念可以知道,精心设计的“类”基本上能满足上述要求,可以认为它是可重用软构件的雏形

2.类构件的重用方式

(1)实例重用

    由于类的封装性,使用者无须了解实现细节就可以使用适当的构造函数,按照需要创建类的实例,然后向所创建的实例发送适当的消息,启动相应的服务,完成需要完成的工作,这是最基本的重用方式。此外,还可以用几个简单的对象作为类的成员创建出一个更复杂的类,这是实例重用的另一种形式。

    虽然实例重用是最基本的重用方式,但是,设计出一个理想的类构件并不是一件容易的事情。例如,决定一个类对外提供多少服务就是一件相当困难的事,提供的服务过多会增加接口复杂度,也会使类构件变得难于理解;提供的服务过少,则会因为过分一般化失去重用价值。每个类构件的合理服务数都与具体应用环境密切相关,因此找到一个合理的折衷值是相当困难的

(2)继承重用

    面向对象方法特有的继承性提供了一种对已有的类构件进行裁剪的机制,当已有的类构件不能通过实例重用完全满足当前系统需求时,继承重用提供了一种安全地修改已有类构件,以便在当前系统中重用的手段。

    为提高承重用的效果,关键是设计一个合理的、具有一定深度的类构件继承层次结构。这样做有下述两个好处:

    *每个子类在继承父类的属性和服务的基础上,只加入少量新属性和新服务,这不仅降低了每个类构件的接口复杂度,表现出一个清晰的进化过程,提高了每个子类的可理解性,面且为软件开发人员提供了更多可重用的类构件。因此,在软件开发过程中,应该时刻注意提取这种潜在的可重用构件,必要时应在领域专家帮助下,建立符合领域知识的继承层次。

    *为多态重用奠定良好基础

(3)多态重用

    利用多态性不仅可以使对象的对外接口更加一般化(基类与派生类的许多对外接口是相同的),从而降低了消息连接的复杂程度,而且还提供了一种简便可靠的软构件组合机制,系统运行时,根据接收消息的对象类型,由多态性机制启动正确的方法,去响应一个一般化的清息,从而简化了消息界面和软构件连接过程。

    为充分实现多态重用,在设计类构件时,应该把注意力集中在下列一些可能影响重用性的操作上。

    *与表示方法有关的操作,例如,不同实例的比较、显示、擦除等。

    *与数据结构、数据大小等有关的操作。

    *与外部设备有关的操作,例如,设备控制

    *实现算法在将来可能会改进(或改变)的核心操作。

    如果不预先采取适当措施,上述这些操作会妨碍类构件的重用。因此,必须把它们从类的操作中分离出来,作为“适配接口”,例如,假设类C具有操作M1M2,…,MN和作A1,A2,…,Ak,其中Aj,(1≤j≤k)是上面列出的可能影响类C重用的几类操作,Mi(1≤i≤n)是其他操作,如果Mi通过调用适配接口Aj而实现,则实际上M被A参数化了。在不同应用环境下,用户只需在派生定义Aj(1≤j≤k)就可以重用类C。

    还可以把适配接口再进一步细分为转换接口和扩充接口,转换接口,是为了克服与表示方法、数据结构或硬件特点相关的操作给重用带来的困难面设计的,这类接口是每个类构件在重用时都必须重新定义的服务的集合,当使用C++语言编程时,应该在根类(或适当的基类)中,把属于转换接口的服务定义为纯虚函数。如果某个服务有多种可能的实现算法,则应该把它当作扩充接口。扩充接口与转換接口不同,并不需要强迫用户在派生类中重新定义它们,相反,如果派对生类中没有给出扩展接口的新算法,刚将继承父类中的算法。当用C++语言实现时,在基类中把这类服务定义为普通的虚函数。
 

发布了39 篇原创文章 · 获赞 38 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/FRESHET/article/details/105474604