面向对象分析与设计讲.docx
《面向对象分析与设计讲.docx》由会员分享,可在线阅读,更多相关《面向对象分析与设计讲.docx(95页珍藏版)》请在冰豆网上搜索。
面向对象分析与设计讲
第一章面向对象方法概念
介绍面向对象方法的基本原理与概念,
论述它成为当今计算机软件领域主流技术的原因。
了解面向对象方法的主要内容,并从理论上掌握其基本知识。
1.1什么是面向对象
1.1定义
1.应用范围
1)程序设计与分析;
面向对象是一种新兴的程序设计方法,或者说它是一种新的程序设计范型(paradigm),其基本思想是使用对象、类、继承、封装、消息等基本概念来进行程序设计。
2)软件设计与分析;
自80年代以来,面向对象方法已深入计算机软件领域的几乎所有分支,远远超出了程序设计语言和编程技术的范畴。
但是,即使我们在“计算机软件”范围内定义什么是面向对象也仍然是不完整的,因为面向对象方法还发展到计算机软件以外的一些领域,如计算机体系结构和人工智能等。
3)软件以外
而面向对象方法已在其中产生巨大影响并发展为较完整的理论与技术体系的领域也主要是计算机软件,所以我们就在这个范围内讨论什么是面向对象。
2.思维方式
1)以事物为中心;
面向对象(object-oriented或object-orientation)不仅是一些具体的软件开发技术与策略,而且是一整套关于如何看待软件系统与现实世界的关系,以什么观点来研究问题并进行求解,以及如何进行系统构造的软件方法学。
2)日常思维方法
3.特点:
具体地讲,面向对象方法有如下一些主要特点:
1)从问题域中客观存在的事物出发来构造软件系统,用对象作为对这些事物的抽象表示,并以此作为系统的基本构成单位。
2)事物的静态特征(即可能用一些数据来表达的特征)用对象的属性表示,事物的动态特征(即事物的行为)用对象的服务表示。
3)对象的属性与服务结合为一体,成为一个独立的实体,对外屏蔽其内部细节(称作封装)。
4)对事物进行分类。
把具有相同属性和相同服务的对象归为一类,类是这些对象的抽象描述,每个对象是它的类的一个实例。
A
属性
服务
5)通过在不同程度上运用抽象的原则(较多或较少地忽略事物之间的差异),可以得到较一般的类和较特殊的类。
特殊类继承一般类的属性与服务,面向对象方法支持对这种继承关系的描述与实现,从而简化系统的构造过程及其文档。
6)复杂的对象可以用简单的对象作为其构成部分(称作聚合)。
7)对象之间通过消息进行通信,以实现对象之间的动态联系。
8)通过关联表达对象之间的静态关系。
老师与学生
↓↓
指导被指导
4.传统的定义:
通过以上的介绍,读者可以对什么是“面向对象”有一个大致的了解。
词典中收集的定义有:
(1)一种使用对象(它将属性与操作封装一体)、消息传送、类、继承、多态和动态绑定来开发问题域模型之解的范型。
(2)一种基于对象、类、实例和继承等概念的技术。
(3)用对象作为建模的原子。
对于“面向对象”的形容词条目(object—oriented),该词典收集的定义有:
(1)用来描述一些基于下述概念的东西:
封装、对象(对象的标识、属性和操作)消息传送、类、继承、多态、动态绑定。
(2)用来描述一种把软件组织成对象集合的软件开发策略,对象中既包括数据也包括操作。
5.定义:
“面向对象方法”作如下定义:
面向对象方法是一种运用对象、类、继承、封装、聚合、消息传送、多态性等概念来构造系统的软件开发方法。
1.2面向对象方法的形成
1.2.1认识和描述
1)认识
所谓“认识”是指,在系统所要处理的问题域范围内,通过人的思维对该问题域客观存在的事物,以及对所要解决的问题产生正确的认识和理解,包括弄清事物的属性、行为及彼此之间的关系,并找出解决问题的方法。
2)描述
所谓“描述”是指,用一种语言把人们对问题域中事物的认识、对问题及其解决方法的认识描述出来。
最终的描述必须使用一种能够被机器读得懂的语言,即编程语言。
1.2.2语言
人们习惯使用的自然语言和计算机能够理解和执行的编程语言之间存在着很大的差距。
这种差距被称作“语言的鸿沟”(图1.1)。
语言的鸿沟,实际上也就是认识描述之间的鸿沟。
1、一方面,人借助自然语言所产生的对问题域的认识远远不能被机器理解和执行;
2、另一方面机器能够理解的编程语言又很不符合人的思维方式。
3、开发人员需要跨越这条语言之间的鸿沟,即从思维语言过渡到描述语言。
4、这种过渡并没有一种准确可靠的方法。
因此往往要耗费开发人员的许多精力,并且是许多错误的发源地。
1.2.3改善鸿沟
几个主要阶段可以明显地看到这一点。
1.机器语言
2.汇编语言
3.高级语言
4.面向对象的语言
1.2.4作用
软件开发是对问题域的认识和描述,
它在分析和设计阶段提供了一些从问题域逐步过渡到编程语言的描述手段。
这如同在语言的鸿沟上铺设了一些平坦的路段。
但是在传统的软件工程方法中,这些路段并不连续。
而在面向对象的软件工程方法中,从面向对象的分析到面向对象的设计,再到面向对象的编程、面向对象的测试(OOT)都是紧密衔接的。
1.传统的软件工程方法
(1)需求分析
(2)总体设计和详细设计
(3)编程和测试
(4)软件维护
2.面向对象的软件工程方法
(1)面向对象的分析
OOA用对象的属性和服务分别描述事物的静态特征和行为。
用一般-特殊结构描述类之间的关系;
用整体-部分结构描述事物间的组成关系;
用实例连接和消息连接表示事物之间的静态联系,动态联系。
原则:
保留原貌
独立于具体实现方法,是为了维护原型。
(2)面向对象设计
OOA针对问题域运用OO方法,建立一个反映问题域的OOA模型,不考虑与系统的具体实现有关的因素,从而使OOA模型独立于具体的实现。
OOD则是针对系统的一个具体的实现运用OO方法。
其中包括两方面的工作,一是把OOA模型直接搬到OOD(不经过转换,仅作某些必要的修改和调整),作为OOD的一个部分;另外是针对具体实现中的人机界面、数据存储、任务管理等因素补充一些与实现有关的部分。
这些部分与OOA采用相同的表示法和模型结构。
(3)面向对象的编程
OOP工作就是用同一种面向对象的编程语言把OOD模型中的每个成分书写出来。
(4)面向对象的测试
对于OO技术开发的软件,在测试过程中继续运用OO技术,进行以对象概念为中心的软件测试。
通过捕捉OOA/OOD模型信息,检查程序与模型不匹配的错误。
(5)面向对象的软件维护
面向对象的程序与问题域是一致的,各个阶段的表示是一致的,从而大大减少了理解的难度。
1.3面向对象方法的主要概念
内容:
对象–––属性、服务、对象标识
类–––抽象、一般类、特殊类
封装–––信息隐蔽、封装机制、可见性
继承–––多继承、继承机制
消息–––消息协议
结构与连接–––一般-特殊结构、整体-部分结构、实例接连、消息连接
多态性
永久对象
主动对象
1.3.1对象
对象定义:
对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。
一个对象由一组属性和对这组属性进行操作的一组服务构成。
附属定义:
属性:
是用来描述对象静态特征的一个数据项。
服务:
是用来描述对象动态特征(行为)的一个操作序列。
需要说明:
第一,对象只描述客观事物本质的、与系统目标有关的特征,而不考虑那些非本质的、与系统目标无关的特征。
第二,对象是属性和服务的结合体,二者是不可分的;而且对象的属性值只能由这个对象的服务来读取和修改,这就是后文将要讲述的封装概念。
特例:
1、有属性,没有服务。
例如信息系统中的人员信息,物质信息。
2、有服务,没有属性。
例如操作系统中的屏幕中断:
disable();
控制结束检查:
getclork();
1.3.2类
类的定义:
类是具有相同属性和服务的一组对象的集合。
类与对象的关系如同一个模具与用这个模具铸造出来的铸件之间的关系。
1.3.3封装
定义:
封装就是把对象的属性服务结合成为一个独立的系统单位,并尽可能隐蔽对象的内部细节。
涵义:
1)把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象)。
2)“信息隐蔽”,即尽可能隐蔽对象的内部细节,对外形成一个边界(或者说形成一道屏障)、只保留有限的对外接口使之与外部发生联系。
举例:
我们用“售报亭”对象描述现实中的一个售报亭。
它的属性是亭内的各种报刊(其名称、定价)和钱箱(总金额),它有两个服务–––报刊零售和款货清点。
目的:
减少了内部的修改对外部的影响,即减少了修改引起的“波动效应”。
1.3.4继承
1.定义:
特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。
例:
classcl1{……
}
classcl2继承访问控制cl1{
public:
公有成员说明表
protected:
受保护成员说明表
private:
私有成员说明表
};
过程描述:
当CL2继承了CL1后,则CL2除拥有自己的属性与服务外,还如一指针一样指向CL1,把CL1的属性与服务继承;同理,若有CL3也一样。
ClassDATE{
DATE(intyy=0;
intmm=0;
intdd=0;)
voideset_date(intyy,intmm,intdd);
voidget_date(int&yy,int&mm,int&dd);
voidprinted();
protected:
intyear,
monthday
}
classE-DATE:
publicDATE{
voidprinted-de();
}
2.意义:
软件复用
3.注意事项与问题
1)变量命名冲突
例:
ClassBASE{Public:
Inta,b;}
Classde:
publicbase{Public:
Intb,c;}
Voidf(){ded;d.a=1;d.b=2;//这样写不行,改为:
d.base:
:
b=2;才可以
d.b=3;d.c=4;BASE*dp=&d;//这样写也不行。
}
2)函数名冲突
例:
classdease1{Public:
Voidshow(){Cout<
Protected:
IntI;}
classBASE2{Public:
Voidshow(){Cout<Protected:
Intj;}
Classde:
publicBASE1,publicBASE2{
Voidset(intx,inty){i=x;j=y;}}
Main()
{deobj;Obj.set(5,7);
Obj.show();//有二义性
Obj.BASE1:
:
show();
Obj.BASE2:
:
show();
Return;}
3)避免太多层次的继承,应在3、4层内
例如:
一般化后的情况:
1.3.5消息
定义:
消息就是向对象发出的服务请求。
内容:
提供服务的对象标识、服务标识、输入信息和回答信息。
消息的格式,这种规定称作消息协议。
1.3.6结构与连接
关键:
一般-特殊结构(generalization-specializationstructure)
整体-部分结构(whole-partstructure)
实例连接(instanceconnection)
消息连接(messageconnection)
1.一般-特殊结构
一般-特殊结构又称作分类结构,是由一组具有一般-特殊关系的类所组成的结构。
它是一个以类为结合,以继承关系为边的连通有向图。
2.整体-部分结构
整体-部分结构又称作组装结构(compositionstructure),它描述对象之间的组成关系,
3.实例连接
实例连接反映对象与对象之间的静态联系。
例如教师和学生之间的任课关系,
4.消息连接
消息连接描述对象之间的动态联系,即:
若一个对象在执行自己的服务时,需要请求另一个对象为它完成某个服务。
消息连接是有向的,从消息发送者指向消息接收者。
1.3.7多态性
1、特性:
一般类中定义的属性或服务被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。
使得同一个属性或服务名在一般类及其各个特殊类中具有不同的语义。
2、语言支持(C++)
1)重载
例:
#include<…>
:
:
Intabs(intx)
{
:
:
}
Doubleabs(doublex)
{
:
:
}
Longabs(longx)
{
:
:
}
Main()
{
Cout<Cout<Cout<Return;
}
2)绑定
例:
#include“…”虚函数
:
:
Classmen{
Public:
Virtualvoidans()
{cout<<”Iamamember”<<”\n”;
}
}
Classte:
publicmen{
Public:
Virtualvoidans()
{cout<<”Iamateacher”<<”\n”;
}
}
Classst:
publicmen{
Public:
Virtualvoidans()
{cout<<”Iamastudent”<<”\n”;
}
}
Main()
{
Menmember;
Teteacher;
Ststudent;
Men*who;
Who=&member;
Who->ans();
Who=&teacher;
Who->ans();
Who=&student;
Who->ans();
Return0;
}
得出结果:
Iamamember
Iamateacher
Iamastudent
把virtual主体,输出:
Iamamember
Iamamember
Iamamember
a、静态绑定
b、动态绑定(需要用指针实现)
3)类属类:
(服务参量的类型可以是参数化的)
例:
定义链表类属类GLIST的界面
Template
Classle{
Public:
List(intlenth)//构造
{v=newELE[LENTH];
:
}
≈list()//析构
{
:
:
}
ELE—operator{}(intindex)
{:
:
}
Private:
ELE*V;…………
}
1.3.8永久对象
1、定义:
就是生存期可以超越程序的执行时间而长期存在的对象。
程序中定义的对象,其生存期都不超过程序的运行时间。
即当程序运行结束时,它所定义的对象也都消失了。
3、状况:
目前大多数商品化的OOPL是不支持永久对象的。
1.3.9主动对象
1、被动对象
2、主动对象(activeobject)
3、定义:
主动对象是一组属性和一组服务的封装体,其中至少有一个服务不需要接收消息就能主动执行(称作主动服务)。
1.4发展及现状
1.4.1过程
1.初期阶段
语言引入了类的概念和继承机制。
2.深入研究阶段
应用尚不够广泛:
(1)面向对象作为一种崭新的软件方法学被广泛接受需要一定的时间。
(2)追求纯OO的宗旨使许多讲究实效的软件开发人员感到不便。
3.繁荣阶段
大批比较实用的OOPL的涌现,例如C++,Objective-C,ObjectPascal,CLOS(CommonLispObjectSystem),Eiffel,Actor等等。
1.4.2研究及实践领域
1.面向对象的编程语言
有许多问题需要研究和解决。
例如:
对象语义、永久对象的表示及处理、对象之间关系的永久性存储、主动对象的表示及处理、分布式对象及其消息、与数据库管理系统的接口等等。
2.分析和设计
需求分析和系统设计。
其理论及工程体系开始形成,目前仍在不断地发展和健全。
3.面向对象的数据库
OODB的研究与开发有三种途径:
·在传统的数据库管理系统中增加面向对象的功能;
·在面向对象的编程语言中增加数据库的功能;
·开发全新的、自成体系的面向对象的数据库。
OODB是目前的一个研究热点。
4.开发环境
理想的环境应该具有下述功能:
·有一个支持复用和共享的类库及其浏览、维护界面;
·有一个存储并管理永久对象的对象管理系统(OMS);
·有一个或多个基于类库和OMS的面向对象的编程语言
·提供一套覆盖软件生命周期各阶段的面向对象的开发工具;
·提供面向对象的编程语言与数据库的接口机制;
·支持面向对象的用户界面开发;
·具有传统的软件工程开发环境中所具有的必要功能,如配置管理、版本管理、权限管理等。
·支持软件工具的紧密集成并具有开放性。
5.用户界面开发技术
主要途径有:
·使用户掌握面向对象的界面的设计技能,在现有的技术支持下尽可能提高应用程序的对象化程度;
·研制面向对象的GUI开发系统及界面描述语言;
·以现有的GUI开发系统为基础,为常用的界划成分开发符合流行的OOPL语法的界面类,建立界面类库;
·提供相应的界面辅助生成工具。
6.智能程序设计
把面向对象方法运用于智能程序设计领域。
更接近事物的本来面貌和人类的自然思维方式。
7.体系结构
研究能够支持对象的存储、管理及协同运行的计算机体系结构。
第二章为什么需要OOA
2.1OOA
1、必然性。
2、基本任务是:
A、问题域:
例如:
1)人员的工作分配(属问题域)
2)数据的备份(没有要求的/系统责任)
B、系统责:
1)功能
2)性能(时间、空间)。
2.2分析面临的主要问题
一、问题的定义:
确定范围:
例如:
传真与E-mail、管理、短讯,其中变化最多的是功能范围。
二、系统责任:
…安全
三、难点:
1.文化差异:
软件专家之间
软件专家与领域专家之间
2.分析员的水平差异:
3.面临的系统更复杂
4.分析模型不能与问题域形成良好的映射
四、交流问题:
1.技术
2.非技术
五、需求的变化
功能:
最易变
名部接口:
很易变
属性:
较易变
对象:
较稳定
六、复用的要求
有效地组织复用必须解决如下基本问题:
(1)可复用构件的提取与制作
(2)可复用构件的组织
(3)可复用构件的检索
(4)可复用构件的组装
2.3分析方法比较
2.3.1功能分解法
功能分解=功能
+子功能
+功能接口
功能分解法(functiondecomposition)以系统需要提供的功能为中心来组织系统。
2.3.2数据流法
数据流法=数据流
+数据处理(加工)
+数据存储
+端点
+处理说明
+数据字典
数据流法(dataflowapproach)又称作结构化分析。
其基本策略是跟踪数据流,即研究问题域中数据如何流动以及在各个环节上进行何种处理,从而发现数据流和加工(bubble)。
2.3.3信息建模法
信息建模=实体(对象)
+属性
+关系
+父类型/子类型
+关联对象
与典型的OOA方法相比,信息建模法有以下几点差别:
(1)强调的重点是信息建模和状态建模,而不是对象建模。
(2)没有把对于实体属性的操作封装到实体对象中,把以对象只有属性,没有服务。
(3)父类与子类之间只能体现属性的继承,不支持服务(操作)的继承。
(4)没有采用消息通信。
2.3.4面向对象的分析
面向对象=对象、类
+结果与连接
+继承
+封装
+消息通信
2.3.5分析方法的比较
1.是否有利于对问题及系统责任的理解
2.是否有利于人员之间交流
3.对需求变化的适应性
4.是否支持软件复用
2.3.6OOA的主要优点
OOA具有以下优点:
·加强了对问题域和系统责任的理解;
·改进与分析有关的各类人员之间的交流;
·对需求的变化具有较强的适应性;
·支持软件复用。
1.贯穿软件生命周期全过程的一致性
2.实用性
3.有利于用户参与
2.4各种OOA方法
影响较大的十种,如下:
·Berard方法
·Booch方法
·Coad-Yourdon方法
·Friesmith方法
·Jacobson方法(简称OOSE)
·Martin-Odell方法
·Rumbaugh方法(简称OMT)
·Seidewitz-Stark方法
·Shlaer-Mellor方法
·Wirfs-Brock方法
第三章OOA方法
3.1引言
3.2主要概念及表示法
OOA用到的主要概念如下:
一、对象、类
例:
类C:
Classc{
Public:
Voidset(intval);
:
:
Pravite:
Intralue;
:
:
}
voidC:
:
set(intval)
{ralue=val;
┆
ruturn;
}
可以这样来描述结构
2.空间的分配(C++)
例:
┇
ClassCN{
public:
voidset_mode(intmin,intmax);
voidset_value(intvalue);
voidget_value();
voidincrement();
voidderement();
private:
intmin_val;
intmax_val;
intcunment;
};
CN:
:
CNangle,month;
┇
空间状况:
3.表示:
必要时可区分被动对象和主动对象,并用不同的类符号表示。
二、属性
属性:
必要时可区别类属性和对象属性。
服务:
对于主动对象,应该标出它的主动服务。
三、结构
一般-特殊结构
·整体-部分结构
四、连接
1)实例连接
2)消息连接
五、主题
1.展开式
2.半展开式
3.压缩
3.3主要原则
1.抽象
(1)过程抽象
(2)数据抽象
a.数据类型
b.抽象数据类型
通过定义数据结构上允许的操作性质来定义一种数据类型。
抽象:
不给出数据的具体表示只给出值域,不给出操作的细节,只给出性质。
实现:
给出数据的结构表示,用语言给出完成操作的语句序列。
2.封装
封装就是把对象的属性和服务结合为一个不可分的系统单位,并尽可能隐蔽对象的内部细节。
3.继承
特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。
4.分类
分类(classification)就是把具有相同属性和服务的对象划分为一类,用类作为这些对象的抽象描述。
分类原则实际上是抽象原则运用于对象描述的一种表现形式。
对象:
教师在职研究生
研究生
5.聚合
聚合(aggergation)又称为组装(compositio