[软件工程] 面向对象方法学引论

面向对象方法学引论

面向对象的思想最初出现于挪威斯陆大学和挪威计算机中心共同研制的Simula 67 语言中,其后,随着位于美国加利福尼亚的Xerox(施乐) 研究中心推出的Smalltalk–76 和80 语言,面向对象的的程序设计技术迅猛的发展。
  到了20世纪90年代,面向对象方法学已经成为人们在开发软件是首选的成熟的范型,成为当前最好的软件开发技术。
  传统的软件工程方法是面向过程的,将数据和处理过程分离,求解过程是先对应用领域(问题空间)进行分析,创建起问题空间的逻辑模型,再经过一系列复杂的转换和算法,构造计算机系统,得到解空间。
  因为问题空间与解空间的模型、描述方式的不一样,存在着复杂的转换过程,需求变化就更难适应。传统的软件工程方法难于支持软件复用。web

9.1 面向对象方法概述

9.1.1 什么是面向对象的开发方法

OOSD(Object-Oriented Software Development)法是一种把面向对象的思想应用于软件开发过程,指导开发活动的系统方法。
  面向对象的方法是一种运用对象、类、继承、封装、聚合、消息传送、多态性等概念来构造系统的软件开发方法。
什么是面向对象
  根据Coad和Yourdon的定义,按照如下4个概念设计和实现的系统,称为是面向对象的。
面向对象: 对象 (object)
      类 (classification)
      继承(inheritance)
      通讯 (communication with messages)
  面向对象技术的特色
   一、对软件开发过程全部阶段进行综合考虑。
   二、软件生存期各阶段所使用的方法、技术具备高度的连续性,用符合人类认识世界的思惟方式来分析、解决问题。
   三、将OOA、OOD、OOP有机地集成在一块儿。 
     OOA(Object-Oriented Analysis)面向对象分析
     OOD( Object-Oriented Design )面向对象设计
     OOP( Object-Oriented Program )面向对象的程序设计算法

9.1.2 面向对象开发方法的组成

OOSD由三部分组成

OOSD由三部分组成:
  OOA(Object-Oriented Analysis)面向对象的分析
    强调的是对一个系统中的对象特征和行为的定义。创建系统的三类(对象、状态、处理)模型。编程

OOD(Object-Oriented Design)面向对象的设计
    与OOA密切配合顺序实现对现实世界的进一步建模。数据结构

OOP (Object-Oriented Program)面向对象的程序设计
    是面向对象的技术中发展最快的,使用面向对象的程序设计语言,进行编码。并发

一、OOA法

就是要解决“作什么”的问题。OOA 法的基本任务就是要创建三种模型:框架

对象模型(信息模型)

定义构成系统的类和对象,它们的属性与操做。编程语言

状态模型(动态模型)

描述任什么时候刻对象的联系及其联系的改变,即时序。经常使用状态图, 事件追踪图描述。
   功能模型(函数模型)
    描述系统内部数据的传送处理。
   显然,在三大模型中,最重要的是对象模型。ide

二、OOD 法

在需求分析的基础上,进一步解决“如何做”的问题,OOD 法也分为概要设计和详细设计。
  概要设计:细化对象行为,添加新对象,认定类,组类库,肯定外部接口及主要数据结构
  详细设计:加细对象描述svg

三、OOP 法

使用面向对象的程序设计语言,如C++进行程序设计。
  Coad和Yourdon给出一个面向对象的定义:
  面向对象=对象+类+继承+消息
  若是一个软件系统是按照这样四个概念设计和实现的,则能够认为这个软件系统是面向对象的。函数

9.2 面向对象的概念

理解面向对象的基本概念对于学习和掌握面向对象的开发方法是十分重要的。

9.2.1 对象

对象(Object)是客观事物或概念的抽象表述,即对客观存在的事物的描述统称为对象,对象能够是事、物、或抽象概念 ,是将一组数据和使用该数据的一组基本操做或过程封装在一块儿的实体。
   对象都存在必定的状态(state),内部标识(identity),能够给对象定义一组运算(operation),对象经过其运算所展现的特定行为称为对象行为(behavior),对象自己的性质称为属性(attribute),对象将它自身的属性及运算“包装起来”,称为“封装”(encapsulation).
   对象的最基本的特征是封装性和继承性。

9.2.2 其它概念

一、 类(Class)

类又称对象类(Object Class),是一组具备相同属性和相同操做的对象的集合。在一个类中,每一个对象都是类的实例(instance) ,它们均可以使用类中提供的函数。
  类具备属性,用数据结构来描述类的属性,类具备操做,它是对象的行为的抽象,操做实现的过程称为方法(method) ,方法有方法名,方法体和参数。
  因为对象是类的实例,在进行分析和设计时,一般把注意力集中在类上,而不是具体的对象上。

二、 继承 (Inheritance)

继承是使用现存的定义做为基础,创建新定义的技术。是父类和子类之间共享数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,能够在一个已经存在的类的基础上来进行,把这个已经存在的类所定义的内容作为本身的内容,并加入若干新内容。
继承性分类:
  单重继承:一个子类只有一个父类。即子类只继承一个父类 的数据结构和方法。
  多重继承:一个子类可有多个父类。继承多个父类的数据结 构和方法。

三、消息(Message)

消息就是向对象发出的服务请求(互相联系、协同工做等)。对象之间的联系可表示为对象间的消息传递,即对象间的通信机制。
  一个消息应该包含如下信息:消息名、接收消息对象的标识、服务标识 、消息和方法、输入信息、回答信息。
  在对象的操做中当一个消息发送给某个对象时,消息包含接收对象去执行某种操做的消息。
注意:在并发系统中,多个控制线程(Thread of Control)并发执行,状况就复杂得多,消息能够是发出服务请求、提交数据、发布事件信息、或是传递同步控制信息。

4. 多态性和动态绑定

多态性(Polymorphism)是指相同的操做或函数,过程做用于不一样的对象上并得到不一样的结果。
即相同的操做的消息发送给不一样的对象时,每一个对象将根据本身所属类中所定义的操做去执行,故产生不一样的结果。
例如: “绘图”操做,做用在“椭圆” 和“矩形” 上,画出不一样的图形。
动态绑定(dynamic binding)是在运行时根据对象接收的消息动态地肯定要链接的服务代码。

五、方法(method)

类中操做的实现过程称为方法。
   一个方法包括方法名、参数及方法体。
  方法描述了类与对象的行为,每个对象都封装了数据和算法两个方面,数据由一组属性表示,而算法便是当一个对象接收到一条消息后,它所包含的方法决定对象如何动做。一般是在某种编程语言(如Java、C++)下实施的运算。

9.3 面向对象建模

  • 用面向对象方法成功地开发软件的关键,一样是对问题域的理解。面向对象方法最基本的原则,是按照人们习惯的思惟方式,用面向对象观点创建问题域的模型,开发出尽量天然地表现求解方法的软件。
  • 用面向对象方法开发软件,一般须要创建3种形式的模型,它们分别是描述系统数据结构的对象模型,描述系统控制结构的动态模型和描述系统功能的功能模型。

9.4 对象模型

面向对象方法强调围绕对象而不是围绕功能来构造系统。对象模型为创建动态模型和功能模型,提供了实质性的框架。
  统一建模语言UML;

  • 定义类(属性、服务)、类的图形符号;
  • 类与类之间的关联、泛化(继承)、依赖和细化等关系及其表示等等。

9.5 动态模型

动态模型表示瞬时的、行为化的系统的“控制”性质,它规定了对象模型中的对象的合法变化序列。

  • 对一个对象来讲,生命周期由许多阶段组成,在每一个特定阶段中,都有适合该对象的一组运行规律和行为规则,用以规范该对象的行为。生命周期中的阶段也就是对象的状态。
  • 各对象之间相互触发就造成了一系列的状态变化。咱们把一个触发行为称做一个事件。
  • 状态与事件密不可分,一个事件分开两个状态,一个状态隔开两个事件。事件表示时刻,状态表明时间间隔。

9.6 功能模型

功能模型表示变化的系统的“功能”性质,它指明了系统应该“作什么”,所以更直接地反映了用户对目标系统的需求。

  1. 功能模型由一组数据流图组成。在面向对象方法学中,数据流图远不如在结构分析、设计方法中那样重要。
  2. 同对象模型和动态模型比较,数据流图并无增长新的信息,可是,创建功能模型有助于软件开发人员更深刻地理解问题域,改进和完善本身的设计。
  3. 所以,不能彻底忽视功能模型的做用。

9.7 3种模型之间的关系

对象模型、动态模型、功能模型分别从3个不一样侧面描述了所要开发的系统。   这3种模型相互补充、相互配合,使得咱们对系统的认识更加全面:   功能模型指明了系统应该“作什么”;   动态模型明确规定了何时(即在何种状态下接受了什么事件的触发)作;   对象模型则定义了作事情的实体。 其中,对象模型是最基本最重要的,它为其余两种模型奠基了基础,咱们依靠对象模型完成3种模型的集成。  (1)针对每一个类创建的动态模型,描述了类实例的生命周期或运行周期。  (2)状态转换驱使行为发生,这些行为在数据流图中被映射成处理,在用例图中被映射成用例,它们同时与类图中的服务相对应。  (3)功能模型中的处理(或用例)对应于对象模型中的类所提供的服务。  (4)数据流图中的数据存储,以及数据的源点/终点,一般是对象模型中的对象。  (5)数据流图中的数据流,每每是对象模型中对象的属性值,也多是整个对象。  (6)用例图中的行为者,多是对象模型中的对象。  (7)功能模型中的处理(或用例)可能产生动态模型中的事件。  (8)对象模型描述了数据流图中的数据流、数据存储以及数据源点/终点的结构。