面向对象设计准则1

面向对象设计

    如前所述,分析是提取和整理用户需求,并建立问题域精确模型的过程。设计准则*是把分析阶段得到的需求转变成符合成本和质量要求的、抽象的系统实现方案的过程。从面向对象分析到面向对象设计(OOD),是一个逐渐扩充模型的过程。或者说,面向对象设计就是用面向对象观点建立求解域模型的过程。

    尽管分析和设计的定义有明显区别,但是在实际的软件开发过程中二者的界限是模糊的。许多分析结果可以直接映射成设计结果,而在设计过程中又往往会加深和补充对系统需求的理解,从而进一步完善分析结果。因此,分析和设计活动是一个多次反复迭代的过程。面向对象方法学在概念和表示方法上的一致性,保证了在各项开发活动之间的平滑(无缝)过渡,领域专家和开发人员能够比较容易地跟踪整个系统开发过程,这是面向对象方法与传统方法比较起来所具有的一大优势。

    生命周期方法学把设计进一步划分成总体设计和详细设计两个阶段,类似地,也可以把面向对象设计再细分为系统设计和对象设计。系统设计确定实现系统的策略和目标系统的高层结构。对象设计确定解空间中的类、关联、接口形式及实现服务的算法。系统设计与对象设计之间的界限,比分析与设计之间的界限更模糊,本书不再对它们加以区分。
    
    本章首先讲述为获得优秀设计结果应该遵循的准则,然后具体讲述面向对象设计的任务和方法。*

    11.1 面向对象设计的准则*

    所谓优秀设计,就是权衡了各种因素,从而使得系统在其整个生命周期中的总开销最小的设计。对大多数软件系统而言,60%以上的软件费用都用于软件维护,因此,优秀软件设计的一个主要特点就是容易维护。

    本书第5章曾经讲述了指导软件设计的几条基本原理,这些原理在进行面向对象设计时仍然成立,但是增加了一些与面向对象方法密切相关的新特点,从而具体化为下列的面向对象设计准则。*

1.模块化

    面向对象软件开发模式,很自然地支持了把系统分解成模块的设计原理:对象就是模块。它是把数据结构和操作这些数据的方法紧密地结合在一起所构成的模块。

2.抽象

    面向对象方法不仅支持过程抽象 而且支持数据抽象,类实际上是一种抽象数据类型,它对外开放的公共接口构成了类的规格说明(即协议),这种接口规定了外界可以使用的合法操作符,利用这些操作符可以对类实例中包含的数据进行操作,使用者无须知道这些操作符的实现算法和类中数据元素的具体表示方法,就可以通过这些操作符使用类中定义的数据。通常把这类抽象称为规格说明抽象。
    此外,某些面向对象的程序设计语言还支持参数化抽象。所谓参数化抽象,是指当描述类的规格说明时并不具体指定所要操作的数据类型,而是把数据类型作为参数。这使得类的抽象程度更高,应用范围更广,可重用性更高。例如,C++语言提供的“模板”机制就是一种参数化抽象机制。

3.信息隐藏

    在面向对象方法中,信息隐藏通过对象的装性现:类结构分离了接口与实现,从而支持了信息隐藏。对于类的用户来说,属性的表示方法和操作的实现算法都应该是隐藏的。


4.弱耦合

    耦合是指一个软件结构内不同模块之间互连的紧密程度。在面向对象方法中,对象是最基本的模块,因此,耦合主要指不同对象之间相互关联的紧密程度。弱耦合是优秀设计的一个重要标准,因为这有助于使得系统中某一部分的变化对其他部分的影响降到最低程度。在理想情况下,对某一部分的理解、测试或修改,无须涉及系统的其他部分。
    如果一类对象过多地依赖其他类对象来完成自己的工作,则不仅给理解、测试或修改这个类带来很大困难,而且还将大大降低该类的可重用性和可移植性。显然,类之间的这种相互依赖关系是紧耦合的。
    当然,对象不可能是完全孤立的,当两个对象必须相互联系相互依赖时,应该通过类的协议(即公共接口)实现耦合,而不应该依赖于类的具体实现细节。
    一般说来,对象之间的耦合可分为两大类,下面分别讨论这两类耦合。

(1)交互耦合

    如果对象之间的概合通过消息连接来实现,则这种耦合就是交互耦合,为使交互耦合尽可能松散,应该違守下述准则。*

    尽量降低消息连接的复杂程度应该尽量减少消息中包含的参数个数,降低参数的复杂程度。

    减少对象发送(或接收)的消息数
2)继承耦合
    与交互耦合相反,应该提高继承耦合程度,继承是一般化类与特殊类之间耦合的一种形式。从本质上看,通过继承关系结合起来的基类和派生类,构成了系统中粒度更大的模块。因此,它们被此之间应该结合得越紧密越好。
    为获得紧密的继承耦合,特殊类应该确实是对它的一般化类的一种具体化,因此,如果一个派生类摒弃了它基类的许多属性,则它们之间是松耦合的。在设计时应该使特殊类尽量多继承并使用其一般化类的属性和服务,从而更紧密地合到其一般化类。

5.强内聚

    内聚衡量一个模块内各个元素彼此结合的紧密程度。也可以把内聚定义为:设计中使用的一个构件内的各个元素,对完成一个定义明确的目的所做出的贡献程度。在设计时应该力求做到高内聚。在面向对象设计中存在下述3种内聚:

1)服务内聚。一个服务应该完成一个且仅完成一个功能。

2)类内聚。设计类的原则是,一个类应该只有一个用途,它的属性和服务应该是高内聚的,类的属性和服务应该全都是完成该类对象的任务所必需的,其中不包含无用的属性或务。如果某个类有多个用途,通常应该把它分解成多个专用的类

3)一般特殊内聚,设计出的一般特殊结构,应该符合多数人的概念,更准确地说这种结构应该是对相应的领域知识的正确抽取。
    例如,虽然表面看来飞机与汽车有相似的地方(都用发动机驱动,都有轮子,……),但是,如果把飞机和汽车都作为“机动车”类的子类,则明显违背了人们的常识,这样的一般特殊结构是低内聚的。正确的作法是,设置一个抽象类“交通工具”,把飞机和机动车作为交通工具类的子类,而汽车又是机动车类的子类。
    一般说来,紧密的继承合与高度的一般特殊内聚是一致的。

6.可重用

    软件重用是提高软件开发生产率和目标系统质量的重要途径。重用基本上从设计阶段开始。重用有两方面的含义*:一是尽量使用已有的类(包括开发环境提供的类库,及以往开发类似系统时创建的类),二是如果确实需要创建新类,则在设计这些新类的协议时应该考虑将来的可重复使用性,关子软件重用向题,将在11.3节进一步讨论。

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

猜你喜欢

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