1、面向对象分析与设计课程教学计划(一),一 课程的性质和目的面向对象分析与设计是高等院校计算机软件工程及相关专业的一门必修课。本课主要介绍面向对象技术的基本概念、面向对象分析、设计和编程的一般方法以及用统一建模语言UML建模的方法,目的是使学生通过本课的学习来掌握面向对象技术的基本概念、面向对象分析、设计和编程的一般方法以及用UML进行系统分析与设计的方法。本课程主要包括课堂教学和上机实验。课堂教学着重讲授基本理论、基本知识和基本方法,上机实验着重培养学生的分析、设计和编程技能及其他区上机操作计能。,二 课程总学时本课程开设一学期。课堂教学:64学时(16周, 每周4学时)上机实验:32学时(1
2、6周,每周1次2学时) 三 教材和参考书教材: 面向对象分析设计与编程 OOA/OOD/OOP/AOP( 吴炜煜 编著 清华大学出版社)参考书: UML与系统分析设计(张龙祥 编著 人民邮电出版社 )UML基础与Rose建模实用教程(谢星星等编 清华大学出版社),四 课堂教学内容和进度计划第1章 面向对象技术概述 8学时第2章 C+语言基础 4学时第3章 类与对象的构造设计 4学时第4章 继承性与派生类 4学时第5章 多态性与虚函数 4学时第6章 文件的输入与输出 8学时第7章 统一建模语言UML及其在系统分析与设计中的应用 16学时第8章 UML在数据库分析与设计中的应用 12学时第9章 基
3、于Web的管理信息系统的分析、设计与实现 4学时,五 实验安排安排16次实验,每次2学时,大约每周进行一次实验。 六 成绩考核学完本课的成绩计算方法:平时占50%,期末闭卷考试50%。平时成绩计算方法:平时考勤、课堂纪律、课堂表现、上机实验、练习等。 七 教学方法采用理论联系实际的方法,把课堂理论讲授和上机实验相结合。理论学习:课前预习、上课认真听讲、保质保量完成作业。上机实验:上机前弄清实验规程,严格按实验指导进行操作,保质保量完成实验任务。,八 上课时间和地点理论课: 1班 星期四上午 第1、2大节 W44062班 星期四下午 第3、4大节 W44063班 星期五下午 第3、4大节 W34
4、074班 星期日上午 第1、2大节 W3407实验课:1班 星期一晚上 第5大节 X2407c2班 星期二晚上 第5大节 X25073班 星期二上午 第1大节 X2407b4班 星期日下午 第5大节 X2606 九 教学反馈E-mail: cuixiang_电话: 2759253,第1章 面向对象技术概论,本章的学习目的教学目的是使学生通过本章的学习能够 理解和掌握面向对象技术的基本概念和基本 知识以及基本思想方法,为后续进一步学习 面向对象的分析、设计和编程奠定良好的基 础。,本章的学习内容了解面向对象软件开发方法的发展历程及其重要意义 了解面向对象技术的基本概念 了解面向对象技术的特点和优
5、点,1.1 面向对象方法的提出 (1)软件概念的提出二十世纪四十年代诞生了世界上第一台电子计算机ENIAC,至今才半个来世纪,聚然间发生了巨大而深刻的计算机革命。计算机科学技术已经成为一门系统完善、复杂深刻的工程技术学科,它的应用已从国防、科技、工业、农业渗透到人类生活的各个方面,无处不在。出现了各种各样的计算机,包括巨型机、大型机、小型机、个人电脑、工作站和网络等等,五花八门,应有尽有。但是,无论怎样尖端,怎样高深,一个计算机系统都是由硬件和软件两部分构成。人们在第一台电子计算机上就已实现了冯.诺依曼提出的存储程序思想,即将程序和数据存储在计算机内存中,用程序来控制计算机的运行。这种程序、数
6、据及相关文档 统称为软件(software)。由于计算机是在程序的控制下运行,所以软件成为了计算机的灵魂,是组成计算机系统不可缺少的部分。,(2)软件开发方法的发展计算机诞生之后,计算机技术一直处于高速发展状态,计算机科学技术的发展由原来只依靠硬件的发展逐渐变为更多地依靠软件的发展。事实上,软件技术的发展经历了多代历程。 第一代(20世纪50-60年代),是以FORTRAN和ALGOL等编程语言为标志的算法技术时代。那时,程序设计全靠人们发挥创造才能,全靠技巧和窍门。基于这种算法技术的软件生产率非常低,程序很难看懂,甚至程序员自己写的程序过一段时间后自己也看不懂,这给软件的修改、维护带来极大的
7、困难。于是60年代末出现了 “软件危机”。,第二代(20世纪70年代末开始到80年代盛行的),以PASCAL、COBOL等编程语言和关系数据库管理系统为标志的结构化系统分析和设计技术。由于早期的应用比较简单,开发一个软件来解决一个问题只需编一个简单程序。但当应用变得越来越复杂时,编一个简单的程序就想解决所有问题是不可能的。于是人们提出了结构化软件开发方法。这种方法提倡通过系统分析和设计将该大的系统划分为多个功能模块,每个功能块又可以进一步划分为更小的功能子模块,直到各个子模块容易编程实现为止。在编程实现了各个模块之后,将这些模块组装起来就构成了完整的应用系统。这就是结构化方法的基本思想。,另外
8、,早期程序处理的数据也很杂乱,数据结构不 统一,实现相同功能的不同程序处理的数据结构或数 据模型可能相差很大,这对于软件的统一化和标准化 以及软件的集成和推广应用很不利。于是人们提出 了对数据结构化的要求。要求将同种类型的数据用字 段个数相同、字段类型相同、字段宽度也相同的记录 来表示和存储,以便于对数据记录进行统一处理,有 利于数据的共享和软件的集成。后来还出现了关系数 据库管理系统,用来对结构化数据进行有效管理。这种技术主要强调程序模块化结构和数据结构,采 用自顶向下逐步求精的设计方法和单入口单出口的控 制结构,从而大大改善了程序的可读性。,伴随着结构化软件开发技术的出现,人们还提出了软件
9、工程方法,使软件开发工作从以前只考虑程序的编写技巧转变到利用软件工程的方法,使软件系统的生产过程遵循一系列的规范化步骤,包括需求分析、总体设计、详细设计、编程实现、软件测试、软件维护等。从而大大改善了软件的质量与可维护性,但软件开发的成本却大大增加了,未能完全克服软件危机。,第三代 (上个世纪80年代开始至今还盛行的) 以Smalltalk、C+等为代表的面向对象软件开发方法(OO)。 传统的结构化程序设计以算法为核心,把本来密切相关的数据和对数据的操作程序分离开来,很难保持数据和操作的一致性,其软件开发方法也不符合人们的自然思维习惯,设计出来的软件系统其解空间与问题空间不一致,致使程序难以理
10、解、修改和扩充,最终导致程序复杂性问题和软件危机。为了超越程序复杂性障碍,克服软件危机,人们提出了面向对象软件开发方法。面向对象开发方法一改过去传统的以功能分析和功能分解为基础的面向过程的结构化分析与设计方法,,面向对象开发方法模拟人们理解和处理客观世界的方式来分析问题,把系统视为一系列对象的集合,其面向对象的设计又将分析的结果映射到某种面向对象实现工具的结构上,使映射过程有着比较直接的对应关系,使分析者、设计者和编程者都可使用相同的概念,从而使面向对象的软件开发能比较自然地模拟客观世界的活动,使问题描述空间与解空间在结构上尽可能一致。因此,采用面向对象方法可以更有效地开发大型软件系统。面向对
11、象方法的封装、继承、多态等机制不仅支持软件复用,而且使软件维护工作可靠有效,可实现软件系统的柔性制造,更好地克服软件危机。因此,它已成为成熟的广为采用的软件开发方法。到20世纪末,面向对象软件工程逐渐发展成熟,特别是统一建模语言(UML)标准的形成和广泛使用,使面向对象软件开发方法已成为软件开发的主流技术。,(3)面向对象软件开发方法的发展 面向对象软件开发方法始于面向对象语言的研究和发展。面向对象语言的发展有三个重要的里程碑: 20世纪70年代的Simula-67 是第一个面向对象的语言 ,对后来的许多面向对象语言的出现产生了很大的影响。它首次提出了对象和类的概念和方法,启示了一种崭新软件思
12、维方法的出现。 80年代初的 Smalltalk 语言,它的广泛使用掀起了一场 “ 面向对象运动 ” ,随之诞生了多种面向对象的语言,可分为几类。 对流行的语言进行面向对象的扩充得到的语言,如混合性语言C+和纯面向对象语言Java.,自80年代末期到90年代 ,面向对象技术的研究和应用不再局限于编程阶段 ,而是向着系统分析和系统设计阶段发展,即系统分析和系统设计阶段也开始采用面向对象方法。这标志着面向对象方法已经发展成一种完整的方法论和系统化的技术体系面向对象软件工程。 我们用面向对象语言编程求解问题之前需要先按面向对象的方法进行分析和设计,然后才能根据设计模型进行有效编程。所以我们在学习用面
13、向对象技术求解实际问题之前应该先学习面向对象的基本概念,再学习面向对象的分析和设计,然后再学习面向对象的编程实现,这样才能全面掌握用面向对象技术求解问题的方法。,1.2 面向对象的基本概念为了更好地理解面向对象的思想和方法,有必要先介绍一些面向对象的基本概念。面向对象开发方法的主要创新点在于模拟人们理解和处理客观世界的方式来分析问题和解决问题。它认为客观世界是由各种各样的事物或实体组成,每个事物或实体都可用一个对象来表示。因此,在面向对象的程序中,客观系统自然被描绘成一系列对象,由这些相互联系、相互作用的对象来构成程序系统。因此对象是组成面向对象程序的基本单位。,(1)对象(Object)对象
14、是客观实体的抽象表示,是由描述对象的属性数据和对这些数据进行的操作行为两部分组成。 属性是用来描述对象静态特征的数据项。 行为是用来描述对象动态特征的操作方法或算法。,(2)对象的特征 具有一个状态,由与其相关联的属性值集合所表征。 具有唯一的标识名,可以区别于其他对象。 有一组操作方法,每个操作方法决定对象的一种行为。 对象的状态一般只能被自身的行为所改变。 对象的操作包括自操作(施于自身)和它操作(施于其他对象)。 对象之间以消息传递的方式进行通信。 一个对象的成员仍可以是一个对象。,void display() Person A;cout学号endl; cout姓名endl;cout性别
15、endl;cout成绩endl;A.print(); ,(3)类(Class) 在面向对象程序中,一般不会逐个描述具体对象,而是将注意力集中于一类具有相同特性的对象,抽象出这类对象的共同特性和行为,用“类”进行一般性描述。 类类是具有相同属性和行为的对象集合的抽象描述;类的内部包括属性和行为两个主要部分。,(4) 实例 (instance)类是对具有相同属性和行为的一组对象的抽象描述。因此,类可作为一种用户自定义类型和创建对象的样板,而按照这种样板所创建的一个个具体对象就是类的实际例子,通常称为实例。例如,student S1(051001,李明,男,90),(5)属性(attribute)属
16、性就是类中所定义的数据成员,是对客观实体的静态特性的抽象表示 。例如,学生类中有属性:学号、姓名、性别、成绩等。,(6)方法 (method)方法就是对象所能执行的某项操作,也就是类中定义的服务函数。一个方法描述了对象执行某项操作的算法。在C+中把类中定义的方法称为成员函数。例如,学生类中用于显示学生属性数据的成员函数 display()就是一个方法。,(7)消息(message)消息就是请求某个对象执行它所包含的某项处理操作的指令信息。实质是对某个类对象的操作函数的调用。例如, student S1;S1.display()是一个消息。一个消息一般由三部分组成:接收消息的对象名、操作函数名、
17、函数的参数。消息是对象之间的通信机制。一个对象可以同时向多个对象发送消息,也可以接受多个对象发来的消息。,(8) 封装性(encapsulation) 所谓封装就是把对象的属性和操作结合成一个独立的单位,使外界不能直接访问或修改这些属性数据和操作代码,外界只能通过对象提供的接口函数来改变或获取对象的属性数据,这就实现了消息隐蔽。 封装是面向对象技术的一个基本特征。 封装的目的是实现信息的有效隐蔽。,例如, class Student private:char* id; /学号char* name; /姓名 int age; /年龄 public:void modify() age=age+1;
18、void display() ,封装的优点: (a) 封装起了信息隐蔽作用,增强了对象的独立性,使外界只关心对象对外所提供的接口,忽略其内部细节。(b) 封装使外界不能随意存取对象的内部属性,从而有效地避免外部错误对它的影响,提高了系统的安全性和可靠性。(c) 封装的结果隐蔽了程序的复杂性,提供了代码的重用性,降低了软件开发的难度。,例如, class Student private:char* id; /学号char* name; /姓名 int age; /年龄 public:void modify() age=age+1;void print() main() Student S1;S1
19、. modify() ;S1.print(); ,(9)继承性(inheritance) 如果在一个已定义的类上,增加一些特殊属性或操作,可以形成一个新的类,这个类不仅继承了前一个类的全部特征,而且具有新的特性,因此可看作前一个类的特殊子类,是对前一个类的继承。前一个类称为父类,新产生的类叫做子类。通过继承关系可形成一种类层次结构,叫做继承结构。,继承关系可以分为如下几种: 一代继承:从父类到子类只延伸一次。如图(a)所示。 多代继承:从父类到子类延伸多次。如图(b)所示。 单继承:如果在一个继承层次结构中,每个子类只有一个直接父类,则这种继承称为单继承。如图(a)和(b)所示。 多继承:如果
20、在一个继承层次结构中,每个子类可有不止一个直接父类,则这种继承称为多继承。如图(c)所示。,(10) 多态性 (polymorphism )为了正确反映客观世界的多态性,面向对象程序设计中也采用了多态性,即在同一类层次结构的不同类中,可用相同的函数名实现功能不同的函数。如下图所示。 多态性的优点:高层代码(算法)只需写一次,低层便可多次复用,可提高程序设计的灵活性和效率。,(11)抽象性抽象就是忽略事物中与当前目标无关的非本质特征,更充分地注意与当前目标有关的本质特征,从而找出事物的共性,把具有共性的事物划分为一类。类的定义明确指出类是一组具有相同属性和行为的对象集合的抽象描述。将客观事物抽象
21、成对象和类是面向对象的第一步。因此,抽象性是面向对象的的基本特征。 (12)分类性 分类性是指将具有相同的数据属性和操作行为的对象抽象成一类。,1.4.2 什么是优良的OODOOD的关键工作是进一步确定对象、类及其联系。一个优良的OOD设计方法应具备如下基本条件: (1)继承耦合应尽可能紧密耦合指一个软件结构内不同模块之间互连的紧密程度。继承是一般化类与特殊类之间关联耦合的一种形式。在设计时应该使特殊类尽量多地继承其父类的数据属性和服务函数,即应该提高继承耦合的程度, 而不是摒弃父类的许多数据属性和服务函数去另外定义许多新的数据属性和服务函数,这样就可以节省软件开发工作量,而且使程序更简洁,编
22、程更高效。因此,继承耦合应该尽可能紧密。,(2)无继承关系的类与类之间的耦合应该很松散。如果一个软件系统内不同模块之间的耦合很松散,则系统中某一部分的变化对其他部分的影响会降到最低程度。在理想情况下,对某一部分的理解、测试或修改,无须涉及系统的其他部分。在面向对象方法中,类/对象是最基本的模块,因此类与类之间的耦合应该很松散。一般说来,类/对象之间的耦合可分为两大类:(i) 交互耦合应该尽可能松散对象之间的交互耦合是通过消息连接来实现的。为使交互耦合尽可能松散,应该遵守下述准则:a) 尽量降低消息连接的复杂程度。即应该尽量减少消息中包含的参数个数,降低参数的复杂程度。b) 减少对象发送(或接收
23、)的消息数。(ii) 继承耦合应该尽可能紧密,(ii) 继承耦合尽可能紧密只有一个例外,类的继承关系必须是紧密联系 的,因而子类与父类要紧密耦合。 (3)信息隐藏某个类的数据实现细节对于别的类来说应该是隐藏的。 (4)设计应该具有最优的可重用性软件重用是提高软件开发生产率和目标系统质量的重要途径。重用的实现基本上从设计阶段开始。最优的可重用性有两方面的含义: 一是尽量使用已有的类(包括开发环境提供的类库,及以往开发类似系统时创建的类);二是如果确实需要创建新类,则在设计这些新类的协议或接口函数时,应该考虑将来的可重复使用性。,(5)尽力使类、对象和方法的定义具有简单性; (6)对所设计的类和类
24、族,应注意保持其协议或接口的稳定性; (7)类的层次结构设计规模适度,不要太深或太浅; (8)系统整体规模的最小化。1.4.3 对象标识设计在OOD中,另一个必做的工作是标识对象/类,即给对象一个代名词,以明确地区别其他对象。为适应模拟对象的复杂性,便于对象的组织和使用,要求在一个系统中,对象标识具备唯一性、稳定性、一致性。,1.4.4 复杂对象的设计 在多媒体系统和工程系统的面向对象程序设计中,常常需要定义复杂对象及其联系,对其描述往往导致多层次对象(类)的定义。在设计对象模型或类图的结构时,要注意以对象本身的自然表达方式为出发点,将对象划分成不同层次的类,建立由所有类构成的有向无环图。 一
25、般地讲,复杂对象具有多种数据结构,可分解为多层次低层对象,或者是不同层次的部件,每个部件对象又可参与其它对象的构成,为多方共享,还可按照各种特性定义相应地归入不同的类。,OOD就是使用OO的概念进行设计,这种概念设计的目的就在于定义抽象对象之间的关系结构。常用的方法如下:分类 分类是见将具有相同属性和行为的对象分成一组。如何选择恰当的分类是设计中的一个焦点,这要同系统的总体规划设计一起统筹安排。 概括概括是从某些具有共性的对象或类中抽象出高一层次的类。反之,由高层次类可以衍生出低层次的对象或子类。即高层是低层的泛化,低层是高层的特化,或实例化。例如,对苹果、梨、香蕉、柑橘.,可概括为一个对象类
26、-水果,这是一种语义概括。,聚集 聚集是用有联系的成分对象构造抽象层次更高的对象,表示一个对象可从结构上划分为多个部分(部件),是“拥有”或“由组成”联系,即“整体-部分”关系。这种结构划分可以逐层细化,形成类的层次结构。在设计时,聚集类的命名往往使用联系中的动名词。例如,甲地、乙地、汽车、货物,其联系是汽车在甲地到乙地之间运货物,这四个对象成分的聚集对象,可命名为“运输”;其中,汽车和货物又可进一步分类。,值得注意的是,在刚开始学习进行面向对象设计时,往往容易把类的层次设计得过深,这会带来在实现上的不少困难和其它问题,并不是好的风格,应有意识地力求避免发生这种情况。,1.4.5 一个GIS的
27、OOD模型实例本节以一个多媒体地理信息系统的模型为例,来帮助大家进一步理解OOD的概念和原则。地理信息系统(GIS: Geography Information System)是一个对地理信息进行存储、管理、分析、加工的复杂计算机应用系统。GIS处理的数据信息涉及大量图文表示和空间要素分析,因此传统的程序设计思想已无法适应这样复杂的多媒体系统的开发,而利用面向对象设计方法却可以对GIS要素加以合理的抽象表示,并且这种抽象在概念上是自然的、简洁的、易于理解的。,复杂的地形环境包含多种地形要素(或地形对象),将这些地形要素(或地形对象)进行抽象可得到如下基本类:测量点、障碍物、道路、铁路、河流、湖
28、泊、植被等,由这些类构成计算机中的数字地形模型,表示实际的地形环境。一般地,地形要素包含一些可量度性的数据,即为地形对象的属性,地形要素还包含一些变换操作,即对地形对象的操作(方法描述),因此,在OOA/OOD模型中,地形要素就是包含属性和操作的地形对象。还可以将地形要素(地形对象)按点、线、面等特征进行分类,进而构成一个分层结构的面向对象模型,如下图所示。,按照面向对象的概念和方法,我们把各个对象的共同特征要素都封装在类中,并通过继承机制来获得上一层类的公共性质,避免了属性和操作的重复性描述的开销。,我们还可以利用C+的虚函数机制,将地形对象的各种基本操作(显示、平移、放缩、旋转、修改、定位、查询等)定义在通用类中,并且能够依据具体情况,通过多态性和动态联编的功能,实现用户所需要的不同版本,这样,在该定义的操作接口上,就可以实现对所有地形对象的统一访问管理。,习题 1. 试述面向对象技术发展的动因。 2. 面向对象设计技术具有哪些特性? 3. 解释下列术语的含义: 类 对象 消息 方法 继承性 多态性 封装性 特化 抽象 分类 4.建立一个校园信息管理系统,其主要功能就是对在校人员(包括学生和教师)的信息资料进行管理。 (1)试着按OOA步骤做系统分析; (2)画出类的层次图。,5. 试述面向对象设计的基本策略。 6. 优良OOD应遵循的准则是什么?,