1.15k likes | 1.34k Views
面向对象方法. 福州大学 · 软件学院 · 计算机教研室. 王灿辉. 面向对象软件开发方法. 面向对象的软件开发方法 OOSD(Object-Oriented Software Development) 是一种新的软件工程方法,其基本思想就是尽可能按照人类认识世界的方法和思维方式来分析和解决问题,这种方法能够提供更加清晰的需求分析和设计。 OOSD 已成为当今软件开发的主流方法。. 面向对象软件开发方法.
E N D
面向对象方法 福州大学·软件学院·计算机教研室 王灿辉 SOFTWARE ENGINEERING
面向对象软件开发方法 • 面向对象的软件开发方法OOSD(Object-Oriented Software Development)是一种新的软件工程方法,其基本思想就是尽可能按照人类认识世界的方法和思维方式来分析和解决问题,这种方法能够提供更加清晰的需求分析和设计。 • OOSD已成为当今软件开发的主流方法。 SOFTWARE ENGINEERING
面向对象软件开发方法 • 面向对象方法学的出发点和基本原则,是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程,也就是使描述问题的问题空间(也称为问题域)与实现解法的解空间(也称为求解域)在结构上尽可能一致。 SOFTWARE ENGINEERING
面向对象软件开发方法 • 客观世界的问题都是由客观世界中的实体及实体相互间的关系构成的。我们把客观世界中的实体抽象为问题域中的对象(Object)。因为所要解决的问题具有特殊性,因此,对象是不固定的。一个雇员可以作为一个对象,一家雇用了许多雇员的公司也可以作为一个对象,到底应该把什么抽象为对象,由所要解决的问题决定。 SOFTWARE ENGINEERING
面向对象软件开发方法 • 面向对象的软件开发方法OOSD的形成最初是从面向对象程序设计语言开始的,随之才逐步形成面向对象分析(OOA)和面向对象设计(OOD) • 在开发软件中,采用面向对象范型的主要优点是软件可以进化(evolved),软件可以一步接一步地分阶段建造。事实上,我们可以根据需要,在面向对象软件开发过程的各阶段间来回移动(move back and forth)。 SOFTWARE ENGINEERING
面向对象软件开发方法 • 面向对象编程(OOP):新兴的程序设计方法。至今在面向对象的领域,大多数工作都集中在编程语言上。 • 面向对象设计(OOD) • 面向对象分析(OOA) • OO方法:认识(OOA)、描述(UML、OOPL)对象 SOFTWARE ENGINEERING
面向对象软件开发方法 • 概括地说,面向对象方法具有下述四个要点:1)认为客观世界是由各种对象组成的,任何事物都是对象,复杂的对象可以由比较简单的对象以某种方式组合而成。按照这种观点,可以认为整个世界就是一个最复杂的对象。因此,面向对象的软件系统是由对象组成的,软件中的任何元素都是对象,复杂的软件对象由比较简单的对象组合而成。 SOFTWARE ENGINEERING
面向对象软件开发方法 • 2)把所有对象都划分成各种对象类(简称为类Class),每个对象类都定义了一组数据和一组方法。数据用于表示对象的静态属性,是对象的状态信息。因此,每当建立该对象类的一个新实例时,就按照类中对数据的定义为这个新对象生成一组专用的数据,以便描述该对象独特的属性值。 SOFTWARE ENGINEERING
面向对象软件开发方法 • 例如,荧光屏上不同位置显示的半径不同的几个圆,虽然都是Circle类的对象,但是,各自都有自己专用的数据,以便记录各自的圆心位置、半径等等。 • 类中定义的方法,是允许施加于该类对象上的操作,是该类所有对象共享的,并不需要为每个对象都复制操作的代码。 SOFTWARE ENGINEERING
面向对象软件开发方法 • 3)按照子类(或称为派生类)与父类(或称为基类)的关系,把若干个对象类组成一个层次结构的系统(也称为类等级)。在这种层次结构中,通常下层的派生类具有和上层的基类相同的特性(包括数据和方法),这种现象称为继承(Inheritance)。但是,如果在派生类中对某些特性又做了重新描述,则在派生类中的这些特性将以新描述为准,也就是说,低层的特性将屏蔽高层的同名特性。 SOFTWARE ENGINEERING
面向对象软件开发方法 • 4)对象彼此之间仅能通过传递消息互相联系。对象与传统的数据有本质区别,它不是被动地等待外界对它施加操作,相反它是进行处理的主体,必须发消息请求它执行某个操作,处理它的私有数据,而不能从外界直接对其私有数据进行操作。即,一切局部于该对象的私有信息,都被封装在该对象类的定义中,就好像装在一个不透明的黑盒子中一样,在外界是看不见的,更不能直接使用,这就是“封装性”。 SOFTWARE ENGINEERING
面向对象软件开发方法 • 综上所述,面向对象的方法学可以用下列方程来概括: • 面向对象=对象+类+继承+消息通信 • 也就是说,面向对象方法就是,既使用对象又使用类和继承等机制,而且对象彼此之间只能通过传递消息互相联系的方法。 SOFTWARE ENGINEERING
设计算法 构造系统 领域分析 面向对象方法 • 传统的软件工程方法是面向过程的,将数据和处理过程分离,增加了软件开发的难度。其开发过程如下: 逻辑模型 复杂转换 解空间 问题空间 • 面向对象的方法将软件系统看做一系列离散的解空间对象的集合,问题空间与解空间的结构、描述模型一致,减少了软件系统开发的复杂度。 SOFTWARE ENGINEERING
面向对象方法的特点 • 按照人类习惯的思维方法,对软件开发过程所有阶段进行综合考虑。 • 软件生存期各阶段所使用的方法、技术具有高度的连续性。使用喷泉模型作为其工作模型,软件生存期各阶段没有明显的界限,开发过程回溯重叠,使用相同的描述方法和模型。 • 软件开发各个阶段(OOA、OOD、OOP)有机集成,有利于系统的稳定性。 • 具有良好的重用性。由于对象所具有的封装性和信息隐蔽,使得对象的内部实现与外界隔离,具有较强的独立性,易于实现可重用性。 SOFTWARE ENGINEERING
面向对象软件开发方法 • 不论采用什么方法学开发软件,都必须完成一系列性质各异的工作。这些必须完成的工作要素是:确定“做什么”,确定“怎样做”,“实现”和“完善”。使用不同的方法学开发软件的时候,完成这些工作要素的顺序、工作要素的名称和相对重要性有可能也不相同,但是却不能忽略其中任何一个工作要素。 SOFTWARE ENGINEERING
面向对象建模 • 用面向对象方法成功地开发软件的关键,同样是对问题域的理解。面向对象方法最基本的原则,是按照人们习惯的思维方式,用面向对象观点建立问题域的模型,开发出尽可能自然地表现求解方法的软件。 • 用面向对象方法开发软件,通常需要建立三种形式的模型,它们分别是描述系统数据结构的对象模型,描述系统控制结构的动态模型和描述系统功能的功能模型。 SOFTWARE ENGINEERING
面向对象建模 • 这三种模型都涉及到数据、控制和操作等共同的概念,只不过每种模型描述的侧重点不同。这三种模型从三个不同但又密切相关的角度模拟目标系统,它们各自从不同侧面反映了系统的实质性内容,综合起来则全面地反映了对目标系统的需求。一个典型的软件系统组合了上述三方面内容:它使用数据结构(对象模型),执行操作(动态模型),并且完成数据值的变化(功能模型)。 SOFTWARE ENGINEERING
面向对象建模 • 为了全面地理解问题域,对任何大系统来说,上述三种模型都是必不可少的。当然,在不同的应用问题中,这三种模型的相对重要程度会有所不同,但是,用面向对象方法开发软件,在任何情况下,对象模型始终都是最重要、最基本、最核心的。在整个开发过程中,三种模型一直都在发展、完善。在面向对象分析过程中,构造出完全独立于实现的应用域模型;在面向对象设计过程中,把求解域的结构逐渐加入到模型中;在实现阶段,把求解域的模型编成程序代码并进行严格的测试验证。 SOFTWARE ENGINEERING
面向对象的软件过程 • 一般说来,使用面向对象方法学开发软件时,工作重点应该放在生命周期中的分析阶段。这种方法在开发的早期阶段定义了一系列面向问题的对象,并且在整个开发过程中不断充实和扩充这些对象。 SOFTWARE ENGINEERING
面向对象的软件过程 • 由于在整个开发过程中都使用统一的软件概念“对象”,所有其他概念(例如功能、关系、事件等)都是围绕对象组成的,目的是保证分析工作中得到的信息不会丢失或改变,因此,对生命周期各阶段的区分自然就不重要、不明显了。分析阶段得到的对象模型也适用于设计阶段和实现阶段。 SOFTWARE ENGINEERING
面向对象的软件过程 • 由于各阶段都使用统一的概念和表示符号,因此,整个开发过程都是吻合一致的,或者说是“无缝”连接的,这自然就很容易实现各个开发步骤的多次反复迭代,达到认识的逐步深化。每次反复都会增加或明确一些目标系统的性质,但却不是对先前工作结果的本质性改动,这样就减少了不一致性,降低了出错的可能性。 SOFTWARE ENGINEERING
喷泉模型 面向对象的软件过程 • 迭代是软件开发过程中普遍存在的一种内在属性。经验表明,软件过程各个阶段之间的迭代或一个阶段内各个工作步骤之间的迭代,在面向对象范型中比在结构化范型中更常见,也更容易实现。图5.6所示的喷泉模型是典型的面向对象生命周期模型。 SOFTWARE ENGINEERING
面向对象方法:RUP • 软件开发是个复杂的问题,每个阶段要彻底解决相关问题是不可能的,项目的开发必须要有回溯要求,即重复性开发。在面向对象过程中,重复多次进行分析、设计、开发、测试、和部署的阶段。Rational统一过程( RUP,Rational Unified Process)就是一种重复开发方法。 SOFTWARE ENGINEERING
面向对象方法:RUP • RUP开发周期经历四个阶段:开始、细化、构造和交接。开始就是项目的开头,要收集信息和进行概念验证。开始阶段得出项目行或不行的决策。细化阶段要细化使用案例和作出结构性决策。细化包括分析、设计、编码和测试文件。而构造阶段则进行大量的编码。交接是系统向用户进行最后准备和部署的阶段。 SOFTWARE ENGINEERING
RUP:开始阶段 • 基本需求的说明 • 建立商业用例(环境、预算、可行性) • 建立用例模型(<20%)和项目词汇 • 初步的项目规划和风险评估 • 使用Rose:开始阶段使用业务模型。Rose可以建立Business Use Case模型,包括业务用例、业务角色和业务工人。接着要确定角色和使用案例,并对这些使用案例和角色建档,可以创建显示其关系的框图。 SOFTWARE ENGINEERING
RUP:细化阶段 • 完善用例模型(80%) • 多次迭代,构造软件架构和可执行原型 • 提供完整的项目规划、风险评估 • 使用Rose:由于细化阶段要细化系统的需求,因此可能要更新用例模型。细化阶段的主要任务是细化用例。Rose可以创建活动图,演示用例事件流程。 SOFTWARE ENGINEERING
RUP:细化阶段 • 使用Rose:细化用例处理流程时,可以利用顺序图和协作图,它们还有助于设计系统所要的对象。细化要涉及系统的设计准备,以便开发人员能开始开发,可通过创建类图和状态图实现。最后,细化要确定许多系统构件,创建构件图,显示这些组成及其关系。 SOFTWARE ENGINEERING
RUP:构造阶段 • 系统实现、开发构件 • 系统测试、系统集成 • 提交软件测试版、用户手册 • 使用Rose:和细化阶段一样,Rose在构造阶段创建顺序图、协作图、类图、状态图与构件图。Rose可以根据对象设计创建构件。构件图显示构件间的编译相关性。 SOFTWARE ENGINEERING
RUP:构造阶段 • 使用Rose:选择每个构件语言后,可以产生框架代码。开发人员创建代码后,可以通过逆向转出工程代码让软件与模型同步。Rose必在构造阶段创建部署图,描述部署中如何使用构件。 SOFTWARE ENGINEERING
RUP:交接阶段 • 软件测试版的测试 • 替换旧系统运行 • 用户培训和支持服务 • 软件需求规范、用例图、类图、构件图与部署图要根据最终改变进行更新,一定要让软件与模型同步,因为软件进入维护方式时,模型非常重要。模型对改进软件非常有用。Rose在交接阶段主要用于软件产品完成时更新模型。 SOFTWARE ENGINEERING
RUP:迭代递增开发模型 最初需求与分析 设计 编码 维护请求 更多需求与分析 测试 产品 SOFTWARE ENGINEERING
面向对象的基本概念 • 抽象(Abstration) • 对象(Object) • 类(Class) • 继承( Inheritance ) • 封装( Encapsulation ) • 消息( Message ) • 多态性、重载、动态绑定 • 永久对象 • 结构与连接 面向对象技术 SOFTWARE ENGINEERING
面向对象的基本概念 • 抽象(Abstration):在解决或者寻找解决问题的方案之前,通常都要将实际系统进行一定的简化,抽取出实际系统中对于问题研究来说比较重要的部分,忽略许多细节部分。是解决和处理复杂问题采用的基本方法之一。 SOFTWARE ENGINEERING
面向对象的基本概念 • 对象(Object)是系统中用来描述客观事物的一个实体,是构成系统的一个基本单位,由一组属性和对这些属性进行操作的一组服务构成。 • 对象是指一个属性(数据)集及其操作(行为)的封装体。 • 对象的属性是指描述对象的数据,对象的属性值的集合成为对象的状态。对象的行为是定义在对象属性上的一组操作方法的集合。 SOFTWARE ENGINEERING
面向对象的基本概念 • 对象(Object)是客观事物或概念的抽象表述,每个对象都存在一定的状态(state),内部标识(identity),可以给对象定义一组运算(operation),对象通过其运算所展示的特定行为称为对象行为(behavior),对象本身的性质称为属性(attribute),对象将它自身的属性及运算“包装起来”,称为“封装”(encapsulation)。 • 对象都有自己的运动状态及运动规律,不同对象间的相互作用和相互通信构成了完整的客观世界。 SOFTWARE ENGINEERING
面向对象的基本概念 • 类(Class)又称对象类是指一组具有相同属性和运算的对象的抽象,一组具有相同数据结构和相同操作的对象的集合。在一个类中,每个对象都是类的实例(instance),它们都可以使用类中提供的函数。 • 类具有属性,用数据结构来描述类的属性,类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法(method),即操作实现的过程来描述。 SOFTWARE ENGINEERING
面向对象的基本概念 • 继承(Inheritance)是使用现存的定义作为基础,建立新定义的技术。是父类和子类之间共享数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新内容。 SOFTWARE ENGINEERING
父类 子类B 子类A 面向对象的基本概念 单重继承:一个子类只有一个父类,即子类只继 承一个父类的数据结构和方法。 多重继承:一个子类可有多个父类,继承多个父 类的数据结构和方法。 继承性分 • 继承性通常又称为概括,表示基类与子类的关系。子类的公共属性和操作归属于基类,并为每个子类共享,子类继承了基类的特征。 SOFTWARE ENGINEERING
面向对象的基本概念 • 多态性(Polymorphism)是指相同的操作、函数或过程作用于多种类型的对象上并获得不同的结果。即不同的对象,收到同一消息产生完全不同的结果,这种现象称为多态性。 • 重载(Overload)即在特殊类对继承来的属性或服务进行重新定义。 • 动态绑定(Dynamic Binding)即在运行时根据对象接收的消息动态地确定要连接哪一部分服务代码。 SOFTWARE ENGINEERING
面向对象的基本概念 • 多态性增强了软件的灵活性和重用性,允许用更为明确、易懂的方式去建立通用软件,多态性和继承性相结合使软件具有更广泛的重用性和可扩充性。 • 多态性的实现需要OOPL提供相应的支持。如:C++使用虚函数、重载函数、模板等来支持。 SOFTWARE ENGINEERING
面向对象的基本概念 • 消息(Message)是指对象之间在交互中所传送的通信信息。一个消息应该包含以下信息:消息名、接收消息对象的标识、服务标识 、消息和方法、输入信息、回答信息。使对象之间互相联系、协同工作,实现系统的各种服务。 • 通常一个对象向另一个对象发送信息请求某项服务,接受对象响应该消息,激发所要求的服务操作,并将操作结果返回给请求服务的对象。 SOFTWARE ENGINEERING
面向对象的基本概念 • 类中的操作实现的过程称为方法(method),方法描述了类与对象的行为。 • 每一个对象都封装了数据和算法两个方面,数据由一组属性表示,而算法即是当一个对象接收到一条消息后,它所包含的方法决定对象如何动作。 • 方法通常是在某种编程语言(如Java、C++)下实施的运算。一个方法包括方法名、参数及方法体。 SOFTWARE ENGINEERING
面向对象的基本概念 • 永久对象(Persistent object)是当前OO领域的一个技术热点。所谓永久对象是指生存期可以超越程序的执行时间而长期存在的对象。 • 目前,大多数OOPL不支持永久对象,如果一个对象要长期保存,必须依靠于文件系统或数据库管理系统实现,程序员需要作对象与文件系统或数据库之间数据格式的转换,以及保存和恢复所需的操作等烦琐的工作。 SOFTWARE ENGINEERING
交通工具 轮船 客运工具 客轮 一般-特殊结构 面向对象的基本概念 • 一般-特殊的结构:又称为分类结构(classification structure),由一组具有“一般-特殊”关系(继承关系)的类构成。是一个以类为结点,以继承关系为边的连通有向图。 SOFTWARE ENGINEERING
汽车 车身 发动机 气缸 整体-部分结构 面向对象的基本概念 • 整体-部分的关系有两种: ⑴ 一个部分对象只隶属于惟一的整体对象。部分与整体对象同时存在。 ⑵ 一个部分对象可属于多个整体对象。部分与整体对象之间的的关系比较松散。 SOFTWARE ENGINEERING
面向对象的基本概念 • 实例连接:反映对象之间的静态联系。如:教师和学生之间的任课关系。 • 消息连接:描述对象之间的动态联系,连接是有向的。 • 主动对象:是一组属性和一组服务的封装体,其中至少有一个服务不需要接收消息就能够主动执行。 SOFTWARE ENGINEERING
面向对象需求分析(OOA) • 不论采用哪种方法学开发软件,分析过程都是提取用户需求的过程。面向对象分析(通常缩写为OOA),就是抽取和整理用户需求并用面向对象观点建立问题域模型的过程。 • 分析工作主要包括三项内容,这就是理解、表达和验证。 SOFTWARE ENGINEERING
面向对象需求分析(OOA) • 面向对象的分析OOA(Object-Oriented Analysis)是软件开发过程中的问题定义阶段。目标是完成对所求解问题的分析,确定系统“作什么”,并建立系统的模型。 • 面向对象的分析过程分为论域分析和应用分析,该阶段的目标是获得对问题论域的清晰、精确的定义。产生描述系统功能和问题论域的基本特征的综合文档。 SOFTWARE ENGINEERING
面向对象需求分析(OOA) • OOA的目的是完成对问题空间的分析并建立系统模型,具体任务是确定和描述系统中的对象、对象的静态特征和动态特征,对象之间的关系以及对象的行为约束等。 • 面向对象分析的关键,是识别出问题域内的对象,并分析确定它们相互之间的关系,最终建立起问题域的简洁、精确、可理解的正确模型。 SOFTWARE ENGINEERING
面向对象需求分析(OOA) • OOA的任务是采用面向对象方法,把对问题论域和系统的认识理解,正确地抽象为规范的对象(包括类和继承层次)和消息传递联系,形成面向对象模型,为后续的OOD和OOP提供指导。OOA和OOD能够自然过渡和结合是OO方法的一个优点。 SOFTWARE ENGINEERING