软件工程概论(第3版)教学课件第8章 面向对象设计-new

举报
资源描述
第8章 面向对象设计面向对象设计过程与准则面向对象设计过程与准则体系结构模块及依赖性体系结构模块及依赖性系统分解系统分解问题域部分的设计问题域部分的设计人机交互部分的设计人机交互部分的设计任务管理部分的设计任务管理部分的设计数据管理部分的设计数据管理部分的设计对象设计对象设计8.1 面向对象设计过程与准则面向对象设计过程面向对象设计过程(1)建立系统环境模型。在设计的初始阶段,系统设计师用建立系统环境模型。在设计的初始阶段,系统设计师用系统环境图对软件与外部实体交互的方式进行建模。下图系统环境图对软件与外部实体交互的方式进行建模。下图给出了系统环境图的一般的结构。给出了系统环境图的一般的结构。8.1 面向对象设计过程与准则(2)设计系统体系结构。体系结构设计可以自底向上进行,设计系统体系结构。体系结构设计可以自底向上进行,如将关系紧密的对象组织成子系统或层;也可以自顶向如将关系紧密的对象组织成子系统或层;也可以自顶向下进行,尤其是使用设计模式或遗产系统时,会从子系下进行,尤其是使用设计模式或遗产系统时,会从子系统的划分入手。统的划分入手。(3)对各个子系统进行设计。对于面向对象的系统,典型的对各个子系统进行设计。对于面向对象的系统,典型的子系统有问题域子系统、人机交互子系统和任务管理子子系统有问题域子系统、人机交互子系统和任务管理子系统。系统。(4)对象设计及优化。对象设计以问题领域的对象设计为核对象设计及优化。对象设计以问题领域的对象设计为核心,其结果是一个详细的对象模型。对象设计过程包括心,其结果是一个详细的对象模型。对象设计过程包括使用模式设计对象、接口规格说明、对象模型重构、对使用模式设计对象、接口规格说明、对象模型重构、对象模型优化象模型优化4组活动。组活动。8.1 面向对象设计过程与准则面向对象设计准则面向对象设计准则(1)模块化模块化传统的面向过程方法中的模块通常是函数、过程及子程传统的面向过程方法中的模块通常是函数、过程及子程序等,而面向对象方法中的模块则是类、对象、接口、序等,而面向对象方法中的模块则是类、对象、接口、构件等。构件等。在面向过程的方法中,数据及在数据上的处理是分离的;在面向过程的方法中,数据及在数据上的处理是分离的;而在面向对象方法中,数据及其上的处理是封装在一起而在面向对象方法中,数据及其上的处理是封装在一起的,具有更好的独立性,也能够更好地支持复用。的,具有更好的独立性,也能够更好地支持复用。8.1 面向对象设计过程与准则(2)抽象抽象面向对象方法不仅支持过程抽象,而且支持数据抽象。面向对象方法不仅支持过程抽象,而且支持数据抽象。类实际上就是一种抽象数据类型。可以将类的抽象分为类实际上就是一种抽象数据类型。可以将类的抽象分为规格说明抽象及参数化抽象。规格说明抽象及参数化抽象。类对外开放的公共接口构成了类的规格说明,即协议。类对外开放的公共接口构成了类的规格说明,即协议。这种接口规定了外部可以使用的服务,使用者无需知道这种接口规定了外部可以使用的服务,使用者无需知道这些服务的具体实现算法。通常将这类抽象称为规格说这些服务的具体实现算法。通常将这类抽象称为规格说明抽象。明抽象。参数化抽象是指当描述类的规格说明时并不具体指定所参数化抽象是指当描述类的规格说明时并不具体指定所要操作的数据类型,而是将数据类型作为参数。要操作的数据类型,而是将数据类型作为参数。8.1 面向对象设计过程与准则(3)信息隐藏信息隐藏在面向对象方法中,信息隐藏通过对象的封装性实现。对在面向对象方法中,信息隐藏通过对象的封装性实现。对于类的用户来说,属性的表示方法和操作的实现算法都应于类的用户来说,属性的表示方法和操作的实现算法都应该是隐藏的。该是隐藏的。(4)弱耦合弱耦合耦合是指一个软件结构内不同模块之间互连的紧密程度。耦合是指一个软件结构内不同模块之间互连的紧密程度。在面向对象方法中,对象是最基本的模块,因此,耦合主在面向对象方法中,对象是最基本的模块,因此,耦合主要指不同对象之间相互关联的紧密程度。要指不同对象之间相互关联的紧密程度。8.1 面向对象设计过程与准则(5)强内聚强内聚内聚衡量一个模块内各个元素彼此结合的紧密程度。在面内聚衡量一个模块内各个元素彼此结合的紧密程度。在面向对象设计中存在以下向对象设计中存在以下3种内聚:种内聚:(1)服务内聚服务内聚:一个服务应该完成一个且仅完成一个功能。:一个服务应该完成一个且仅完成一个功能。(2)类内聚类内聚:设计类的原则是,一个类应该只有一个用途,:设计类的原则是,一个类应该只有一个用途,它的属性和服务应该是高内聚的。类的属性和服务应该全它的属性和服务应该是高内聚的。类的属性和服务应该全都是完成该类对象的任务所必需的,其中不包含无用的属都是完成该类对象的任务所必需的,其中不包含无用的属性或服务。如果某个类有多个用途,通常应该把它分解成性或服务。如果某个类有多个用途,通常应该把它分解成多个专用的类。多个专用的类。(3)一般一般特殊内聚特殊内聚:设计出的一般:设计出的一般特殊结构,应该符合特殊结构,应该符合多数人的概念,更准确地说,这种结构应该是对相应的领多数人的概念,更准确地说,这种结构应该是对相应的领域知识的正确抽取。域知识的正确抽取。8.1 面向对象设计过程与准则(6)(6)可重用可重用软件重用是提高软件开发生产率和目标系统质量软件重用是提高软件开发生产率和目标系统质量的重要途径。的重要途径。重用基本上从设计阶段开始。重用有两方面的含重用基本上从设计阶段开始。重用有两方面的含义:义:一是尽量使用已有的类一是尽量使用已有的类(包括开发环境提供的类库,及以包括开发环境提供的类库,及以往开发类似系统时创建的类往开发类似系统时创建的类),二是如果确实需要创建新类,则在设计这些新类的协议时,二是如果确实需要创建新类,则在设计这些新类的协议时,应该考虑将来的可重复使用性。应该考虑将来的可重复使用性。l体系结构设计描述了建立计算机系统所需的数据结构和程体系结构设计描述了建立计算机系统所需的数据结构和程序构件。一个好的体系结构设计要求软件模块的分层及编序构件。一个好的体系结构设计要求软件模块的分层及编程标准的执行。程标准的执行。l在面向对象软件中,常见的软件模块有在面向对象软件中,常见的软件模块有类类、接口接口、包包和和构构件件。l在在设计阶段设计阶段我们往往我们往往关注类、接口和包关注类、接口和包,在,在实现阶段实现阶段关注关注构件构件,而在,而在部署阶段部署阶段则关注则关注构件的部署构件的部署,也就是将构件部,也就是将构件部署在哪些结点上。署在哪些结点上。8.2 体系结构模块及依赖性1.类类 在面向对象的程序设计中,在面向对象的程序设计中,类和接口是程序的基本组成单类和接口是程序的基本组成单元元。一个典型程序需要界面类专门负责表示用户界面信息,一个典型程序需要界面类专门负责表示用户界面信息,需要数据库类负责与数据库进行交互,需要有业务逻辑类需要数据库类负责与数据库进行交互,需要有业务逻辑类负责算法计算等。负责算法计算等。在计算机程序中,要设计和实现的所有类都具有唯一的在计算机程序中,要设计和实现的所有类都具有唯一的名字,在不同的阶段或从不同的角度可以将它们称为名字,在不同的阶段或从不同的角度可以将它们称为设计设计类类、实现类实现类、系统类系统类、应用类应用类等。等。类及其依赖性类及其依赖性2继承依赖性继承依赖性依赖性管理中最棘手的问题是由于继承所引起的依赖依赖性管理中最棘手的问题是由于继承所引起的依赖性。性。继承是一种在父类和子类之间共享属性和行为的方式继承是一种在父类和子类之间共享属性和行为的方式,所以运行时可以用一个子类对象代替其父类对象。程序中凡所以运行时可以用一个子类对象代替其父类对象。程序中凡是使用父类对象的地方,都可以用子类对象来代替。一个子是使用父类对象的地方,都可以用子类对象来代替。一个子类对象是一种特殊的父类对象,它继承父类的所有特征,同类对象是一种特殊的父类对象,它继承父类的所有特征,同时它又可以覆盖父类的方法,从而改变从父类继承的一些特时它又可以覆盖父类的方法,从而改变从父类继承的一些特征,并可以在子类中增加一些新的功能。这样,从客户的角征,并可以在子类中增加一些新的功能。这样,从客户的角度看,在继承树中为请求提供服务的特定对象不同,系统的度看,在继承树中为请求提供服务的特定对象不同,系统的运行行为可能会有所不同。运行行为可能会有所不同。类及其依赖性类及其依赖性(1)多态继承)多态继承根据为请求提供服务的对象不同可以得到不同的行为,这根据为请求提供服务的对象不同可以得到不同的行为,这种现象称为种现象称为多态多态。在运行时对类进行实例化,并调用与实例。在运行时对类进行实例化,并调用与实例化对象相应的方法,称为化对象相应的方法,称为动态绑定动态绑定、后期绑定或运行时绑、后期绑定或运行时绑定。相应地,如果方法的调用是在编译时确定的,则称为是定。相应地,如果方法的调用是在编译时确定的,则称为是静态绑定静态绑定、前期绑定或编译时绑定。、前期绑定或编译时绑定。多态并不是伴随着继承而出现。如果在子类中不覆盖父类多态并不是伴随着继承而出现。如果在子类中不覆盖父类中的任何方法,就不会产生多态行为。中的任何方法,就不会产生多态行为。很明显,继承会带来类和方法之间的依赖性。继承带来的很明显,继承会带来类和方法之间的依赖性。继承带来的依赖性有依赖性有编译时继承依赖性编译时继承依赖性和和运行时继承依赖性运行时继承依赖性。类及其依赖性类及其依赖性类及其依赖性类及其依赖性编译时继承依赖性编译时继承依赖性右图所示的例子说明了一棵树中类之间的编右图所示的例子说明了一棵树中类之间的编译时依赖性。在这个例子中,译时依赖性。在这个例子中,B继承继承A,但没有,但没有覆盖覆盖A中的方法中的方法do1()。因此,。因此,B和和A之间没有之间没有运行时继承依赖性。也就是说,由于编译时依运行时继承依赖性。也就是说,由于编译时依赖性的存在,赖性的存在,A中中do1()方法的任何变化,都会方法的任何变化,都会被被B在编译时(静态地)继承。在编译时(静态地)继承。一般来说,一般来说,所有的继承都会引入编译时依赖所有的继承都会引入编译时依赖性性。依赖性是。依赖性是可传递的可传递的,也就是说,如果,也就是说,如果C依赖依赖B,B依赖依赖A,那么,那么C也依赖也依赖A。运行时继承依赖性运行时继承依赖性下图举例说明了在一棵继承树中涉及客户对象访问类服务的运行时下图举例说明了在一棵继承树中涉及客户对象访问类服务的运行时继承依赖性。图中类继承依赖性。图中类B的的do1()方法是从父类方法是从父类A继承来的,因此继承来的,因此Test与与B没有运行时继承依赖性,只是一个静态依赖性,通过从没有运行时继承依赖性,只是一个静态依赖性,通过从Test到到A的关的关联来表明。如果在联来表明。如果在doTest方法中调用的是方法中调用的是do2()方法,或者在方法,或者在B中覆盖中覆盖了了A的的do1()方法,则从方法,则从Test到到A和和B就会存在运行时依赖性。就会存在运行时依赖性。类及其依赖性类及其依赖性(2)无多态继承)无多态继承使用继承最简单的方式是子类不覆盖从父类继承来的方法,使用继承最简单的方式是子类不覆盖从父类继承来的方法,这样就不存在多态性继承问题。虽然无多态的继承有时并不这样就不存在多态性继承问题。虽然无多态的继承有时并不是十分有用,但理解和管理起来是最容易的。是十分有用,但理解和管理起来是最容易的。(3)扩展继承和约束继承)扩展继承和约束继承扩展继承扩展继承是指子类继承父类的属性,并且提供额外属性来是指子类继承父类的属性,并且提供额外属性来增强类定义。子类是父类的一种,如果子类覆盖了父类的方增强类定义。子类是父类的一种,如果子类覆盖了父类的方法,那么被覆盖的方法应该实现该方法的定义,并且能够在法,那么被覆盖的方法应该实现该方法的定义,并且能够在子类的语境中工作。子类的语境中工作。当一个类覆盖了继承来
展开阅读全文
温馨提示:
金锄头文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
相关搜索

当前位置:首页 > 高等教育 > 大学课件


电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号