面向对象的软件系统开发方法
1.1 面向对象的软件系统开发方法
1.1.1 面向对象方法概述
1、面向对象方法的基本思想
是从现实世界客观存在的事物(即对象)出发,尽可能地运用人类的自然思维方式如抽象、分类、继承、聚合、封装等来构造软件系统,并以人们易于理解的方式表达出来——以人的自然思维为基准进行程序设计。
2、面向对象的基本观点
(1)客观世界是由相互联系、相互通讯的对象组成的,复杂的对象可以由简单的对象组合而成
将世界看成是一组彼此相关并相互通信的实体即对象组成,每个对象有一个名字来标识,这是人们通常看待世界的方式。
(2)对象可以分类组织和管理,具有相同特征和相同行为的对象属于一个类,对象是对象类的一个实例
从人类的认知说起,人们为了更好的判断事物,总是自觉或者不自觉地在给事物进行归类。
(3)类型之间具有父子相关型,子类继承父类的特性但又可以根据需要进行扩展新的特性
(4)对象之间通过消息传递而产生相互交互。
对象之间的通信被称为发送消息,即一个对象请求另一个对象执行某种方式的操作。例如,交叉路口的红灯“请求”驾驶员停车,驾驶员在接受到消息之后,他所执行的动作是踏下制动踏板,这又向汽车发送了一条消息,汽车在接受到此消息之后,又将该消息分解之后发送到相关的对象上:制动器作用于车轮上,将动能转变成为势能,使车速降下来;尾灯又向它后面的其它车辆的驾驶员发送消息;各种仪表盘向驾驶员反馈出所发送的消息的动作结果。
3、面向对象方法主要的优点
(1)按照人类的自然思维方式,面向客观世界建立软件系统模型,有利于开发人员对问题域的理解
(2)对象所具有的封装性和信息隐蔽等特性,使其容易实现软件复用;
(3)在面向对象的方法中,系统由对象构成,对象是一个包含属性和操作两方面的独立单元,对象之间通过消息联系。这样的系统一旦出错,很容易定位和修改,系统的可维护性好。
(4)由于采用了数据抽象和封装技术,面向对象的程序设计降低了各模块间的关联程度,这就相对减少了程序员之间的相互影响。
1.1.2 面向对象分析(OOA)和面向对象设计(OOD)
1、面向对象方法
面向对象方法实际上是一整套的软件开发方法,它包括面向对象的分析OOA、面向对象的设计OOD、面向对象的编程OOP、面向对象的测试OOT等,可以看出面向对象方法可以贯穿软件开发的整个过程。下面首先解释几个术语:
1) 面向对象分析(OOA):定义在系统中工作的所有类型的对象,并显示这些对象如
何通过相互作用来完成任务,主要工具是统一建模语言(UML)。
2) 面向对象设计(OOD):定义在系统中人机进行通讯所必需的所有类型的对象,并
对每种类型的对象进行细化,以便可以用一种具体的语言来实现这些对象。这里的
关键是类图:用面向对象的方法显示系统中所有对象所属类的图形模型。
3) 面向对象编程(OOP):用某种具体语言(C++、Java、C#、C的对象模块等)来
实现各种对象的行为,包括对象间的消息传递。
面向对象编程以数据为中心,类作为表现数据的工具,是划分程序的基本单位。而函数(方法)在面向对象设计中成为了类的接口。
2、什么是面向对象的分析
运用面向对象方法,对问题域和系统所应该满足的功能进行分析和理解,找出描述问题域和系统功能所需的各个对象,并提取出这些对象所应具有的属性和行为以及建立出这些对象之间的关系;最后达到建立一个符合问题域,满足用户需求的OOA模型的过程。
3、面向对象分析的首要任务
由于在OOA阶段是不考虑与系统具体实现有关的各种因素的——如实现的平台、工具和具体所采用的技术等,而将这些留给OOD去处理,因此主要是识别问题域内的各个对象、并分析出它们相互间的关系,最终建立起问题域的简洁、精确、可理解的正确模型。
4、如何实施OOA
OOA的实施首先是根据需求定义出用例并绘出用例图、分析用户需求,然后再识别出类与对象并确定属性与服务,其后再识别出对象之间的关系,最后建立出系统的静态结构模型和建立系统的动态行为模型(对象之间的交互图)等。
注意面向对象的分析过程实际上是反复迭代的。大体的过程是依次建立对象模型、动态模型、功能模型。之后可以根据需要,按此过程逐渐迭代细化;但在实际开发中,这些步骤也并不是线性的,特别是大型应用系统;OOA方法中的各个步骤可能是以某种交织、迭代或并行的方式进行的。这是因为对于一个大型系统是不可能一次性地完成对复杂软件需求的对象、类、消息等的识别和描述。
(1)首先分析用户需求,从而达到建立出系统中的各个Use Case并利用用例图来描述用户的需求。
(2)再通过建立域模型以识别出问题域中的各个类,从而发现出系统中的各种对象。
(3)确定出对象的内部特征,从而定义出各个属性与服务以进一步细化类的结构、并识别出对象之间的关系,最终产生出静态结构模型。
(4)获得对象之间的行为关系,产生出对象之间的动态行为模型(各种动态交互图形,如顺序图、协作图、状态图等)。
5、主要的面向对象分析方法
面向对象分析方法的核心是利用面向对象的概念和方法为软件需求建造模型。它包含面向对象的图形语言机制以及用于指导需求分析的面向对象的方法学。
(1)Peter Coard和Edward Yourdon的OOA和OOD方法
(2)Booth的OOD方法
(3)OMT(Object Modeling Technique)方法
这种方法是James Rumbaugh等人在General Electric’s Research and Development Center开发的。
6、OMT(对象建模技术)定义了三种模型
OMT是一种通过建立出相关模型来辅助开发人员思考问题的方法,而且这些模型都是基于真实世界的各种概念建立出的。
OMT方法的模型是一组面向对象的概念及图形符号,开发人员可以利用这些概念及符号来分析系统的需求、完成系统设计、代码实现。它可以应用于整个软件开发的过程中的各个环节,并且从三个相关的角度对系统进行建模,获得功能模型、对象模型和动态模型。其中的功能模型确定发生了什么,动态模型确定什么时候发生,对象模型决定了对谁发生。
(1)功能模型
功能模型表明了系统中数据之间的依赖关系,以及有关数据的处理功能,它由一组数据流图来体现数据之间的依赖关系。而其中的处理功能可以用IPO图(或表)和伪码等多种方式进一步描述。
注意:IPO图是输入/处理/输出图的简称,描述输入数据、对数据的处理和输出数据之间的关系;IPO图在系统流程图的详细设计过程中用来描述每个模块的输入/输出数据、处理功能及模块调用的详细情况。
用例图也是建立功能模型的有力工具, 在UML中用用例图建立起来的系统功能模型成为用例模型。下面为某个网上商城项目中的面向注册用户的系统用例图。
注意:功能模型没有显示系统的控制信息和对象结构信息。
(2)对象模型
对象模型描述了系统的静态结构,它提供了系统中的对象、对象之间的关系、标识每一对象类的属性及行为等。
在第一轮迭代中可能只能确定类的名称和类间的关系,等到动态模型和功能模型都建立完再回过头来细化类图中的属性和方法。UML中的类图能够表示对象模型,下面为某个网上商城项目中的业务层中的类图。
注意:功能模型没有显示系统的控制信息和对象结构信息。
(2)对象模型
对象模型描述了系统的静态结构,它提供了系统中的对象、对象之间的关系、标识每一对象类的属性及行为等。
在第一轮迭代中可能只能确定类的名称和类间的关系,等到动态模型和功能模型都建立完再回过头来细化类图中的属性和方法。UML中的类图能够表示对象模型,下面为某个网上商城项目中的业务层中的类图。
(3)动态模型
动态模型表示对象及其相互关系随时间发生的变化。可以采用UML中的顺序图、状态图、活动图等进行描述。下面为某个网上商城项目中的用户登录的时序图。
7、实施OOA时所涉及的OO的主要原则
(1)抽象
从许多事物中舍弃个别的、非本质的特征,抽取共同的、本质性的特征,就叫作抽象。抽象是形成概念的必须手段。
抽象原则有两方面的意义:第一,尽管问题域中的事物是很复杂的,但是分析员并不需要了解和描述它们的一切,只需要分析研究其中与系统目标有关的事物及其本质性特征。第二,通过舍弃个体事物在细节上的差异,抽取其共同特征而得到一批事物的抽象概念。
(2)封装就是把对象的属性和服务结合为一个不可分的系统单位,并尽可能隐蔽对象的内部细节。
以防止程序被无关部分错误修改或错误地使用了对象的私有部分。当从对象外部试图直接对受保护的内部数据进行修改时,将被程序拒绝,只有通过对象所提供的对外服务函数才能够对其内部数据进行必要的加工,从而保证了数据加工的合法性。
(3)分类
就是把具有相同属性和服务的对象划分为一类,用类作为这些对象的抽象描述。分类原则实际上是抽象原则运用于对象描述时的一种表现形式。
(4)继承:特殊类的对象拥有的其一般类的全部属性与服务,称作特殊类对一般类的继承。
在OOA中运用继承原则,就是在每个由一般类和特殊类形成的一般—特殊结构中,把
一般类的对象实例和所有特殊类的对象实例都共同具有的属性和服务,一次性地在一般类中进行显式的定义。在特殊类中不再重复地定义一般类中已定义的东西,但是在语义上,特殊类却自动地、隐含地拥有它的一般类(以及所有更上层的一般类)中定义的全部属性和服务。
继承原则的好处是:使系统模型比较简练也比较清晰。
(5)聚合
又称组装,其原则是:把一个复杂的事物看成若干比较简单的事物的组装体,从而简化对复杂事物的描述。
(6)关联
是人类思考问题时经常运用的思想方法:通过一个事物联想到另外的事物。能使人发生联想的原因是事物之间确实存在着某些联系。
(7)消息通信
这一原则要求对象之间只能通过消息进行通信,而不允许在对象之外直接地存取对象内部的属性。通过消息进行通信是由于封装原则而引起的。在OOA中要求用消息连接表示出对象之间的动态联系。
(8)粒度控制
一般来讲,人在面对一个复杂的问题域时,不可能在同一时刻既能纵观全局,又能洞察秋毫。因此需要控制自己的视野:考虑全局时,注意其大的组成部分,暂时不详察每一部分的具体的细节;考虑某部分的细节时则暂时撇开其余的部分。这就是粒度控制原则。
(9)行为分析
现实世界中事物的行为是复杂的。由大量的事物所构成的问题域中各种行为往往相互依赖、相互交织。
1.1.3 面向对象程序设计方法(OOP)概述
程序设计的基本目标是用算法对问题的原始数据进行处理,从而获得所期望的效果。但这仅仅是程序设计的基本要求。要全面提高程序的质量,提高编程效率,使程序具有良好的可读性、可靠性、可维护性以及良好的结构,编制出好的程序来,应当是每位程序设计工作者追求的目标。
1、面向对象程序设计方法
(1)应用面向对象设计方法时所体现出的主要特点
1) OO的方法具有“抽象性、封装性、继承性、多态性”等特性。
2) 并且面向对象是一种“自下而上”的设计方法,而这与面向过程的设计方法刚好相
反。有利于系统的后期扩展和维护。
(2)“自下而上”的程序设计方法所带来的优点——形成一种螺旋式的开发方式
面向对象的设计方法往往从问题的一部分(局部)着手,一点一点地应用“堆积方式”构建出整个系统。随着开发者在开发过程中逐步加深对系统需求的理解,可以达到分阶段和分层次地添加对这些新的功能的实现。
2、应用面向对象程序设计方法与面向过程程序设计方法在开发方面所体现出的根本区别
(1)整个系统是一个对象集
把应用系统看成是由一组相互“配合”、“协同”来完成某项任务的对象集。
(2)关注的核心是“它如何做出反应”而不是“它该做什么”
面向对象设计方法中最值得关注的不再是系统应该要做什么(而在OOA已经明确了!),而是系统如何做出反应。
(3)在面向对象程序设计(当然也包括编程实现)中更多地看重类之间的关系——如“关联”、“继承”和“内聚”等形式
1) 在结构化设计中模块和模块之间的关系,被紧紧局限于信息流,这限制了对模块之
间众多关系的表达,也无法体现模块和模块之间其他的众多关系,包含各种各样的结构、行为、依赖、包含(在结构化设计中这种关系隐含在分层中)、继承、关联关系等等。
2) 而面向对象设计则充分地运用类之间的各种关系来组织系统中的各个部分(件),
每两个部件之间的关系都非常简单,不过相互组合在一起后能够表达复杂的关系。
3、面向对象程序设计的工具
利用UML语言和对UML进行良好的支持的Rose工具。
4、面向对象程序设计的应用场合
(1)设计中强调的是软件的重用和重构
面向对象的设计,更倾向于建立一种灵活机变,便于修改便于升级的体系,设计中强调的是软件的重用和重构。
(2)设计中强调的是软件的可扩展性
同时由于面向对象设计的成熟和发展,已经形成了一系列的重要设计原则和方法,这些原则和方法可以大大地提高系统的设计质量。
5、面向对象程序设计中的类设计原则
6、如何应用面向对象的基本思想
从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。
(1)找出问题——应用“抽象”
1) 找出“类型”——“学生”
2) 找出“类型”(学生)的“共性”
姓名、年级、学校、专业、性别。。。。
学习、运动、参加社会、研究
(2)封装——利用类的定义
遵守某种编程语言如Java语言中类的定义语法,定义出Student类
class Student{
private int ID;
private String name;
private int age;
private String department;
private int level;
public Student(){
}
public void setName(String newName){
name=newName;
}
public void studyCourse(String courseContent){
}
public void trainSelf(String item){
}
public static void main(String[] args) {
Student zhang =new Student();
zhang. studyCourse (“面向对象技术”);
zhang.trainSelf(“跑步”);
}
}
从此示例可以了解到,面向对象的编程着眼于它的数据(即对象,本示例为zhang)和为此数据严格定义的接口(studyCourse和trainSelf等方法)来组织程序。
这种方式的最大特点是代码与其相关数据被分离开来进行处理,有利于程序规模的扩大,而程序的可维护性得到增强。
7、面向对象程序设计方法的编程语言
(1)Smalltalk:由美国加州的Xeror公司于70年代初研制的纯OOP语言,适用于小型机;
(2)C++:是在面向过程程序设计方法基础上新增OOP成分,因而是一种混合型语言。其流行的原因归功于C语言的普及;但它具有与平台(CPU、OS类型)有关性。
(3)Java:由Sun公司于1995年发布,适用于Internet网开发和应用的纯OOP语言。
8、面向对象程序设计方法与面向过程程序设计方法的对比
9、面向对象程序设计方法的编程优点
可重用性、可扩充性、可管理性。
10、面向对象编程中的封装性
(1)封装性
提供将所抽象出的问题的属性(数据成员)和行为(代码成员)相组合的一种机制
----并尽可能隐蔽对象的内部细节
它能将这二类成员再组合在一起,形成对象或实体。
(2)如何达到封装性(基本的要求)
把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象)。
class Student
{
//描述学生的各个属性(特征)
//体现学生所应该实现的行为或者服务(对外而言)
}
(3)目的
1) 增强使用的安全性,使用者不必了解具体的实现细节,而只需要通过设计者提供的
外部接口来操作它;
2) 实现高度模块化,从而产生出软件构件(控件);利用控件快速地组装程序。
(4)封装的基本要求:
①有一个特定的边界:所有的内部变化都限制在此边界内(类定义的{ });
②有外部接口:此对象利用它与其它对象发生关联(public成员);
③有特定的访问权限:在对象外部不能访问或修改受保护的内部实现细节(private成员)。 class Student
{
private int ID;
//…….其它的属性定义
public void studyCourse(String courseContent)
{
}
//……….其它的行为定义
}
public class Watch
{ public void SetTime(int NewH, int NewM, int NewS);
public void ShowTime();
}
(5)在编程中如何遵守封装的原则
要求使对象以外的部分不能随意存取对象的内部数据(属性),从而有效的避免了外
private int Hour, minute, Second;
部错误对它的“交叉感染”,使软件错误能够局部化,大大减少查错和排错的难度。
Student zhang=new Student();
zhang.setName(“张三”);
(6)在Java中是如何实现封装
通过定义出某类问题所在的类型,并对该类型进行描述其成员。
class SomeClass
{
//描述该类所对应的问题的各个属性(特征)
//体现该类所应该实现的行为或者服务(对外而言)
}
11、面向对象思维是宏观,而面向过程思维是微观的
面向对象和面向过程两者之间并不“冲突”,彼此也不是完全“替换”。比如在面向对象领域中的一个用户(UserInfo)类型的对象实例(oneUserInfo),它不仅有注册、登录、退出等接口行为方法,也还有姓名、年龄等特征属性。
但是具体到一个接口行为方法的内部功能实现中,如登录方法的功能具体编程实现,其实还是一个面向过程的方式。如先检查验证码,再检查密码,如果登录成功后系统将如何反应,如果登录失败后系统又将如何反应等,这其实是典型的过程式思维及实现。