软件工程学习笔记 Day6 ——面对对象方法基础


面向对象方法是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,是建立在对象概念(对象、类和继承)基础上的方法,简称OO方法。

1. 面向对象的基本概念

面 向 对 象 ( o b j e c t o r i e n t e d ) = 对 象 ( o b j e c t ) + 分 类 ( c l a s s i f i c a t i o n ) + 继 承 ( i n h e r i t a n c e ) + 通 过 消 息 的 通 信 ( c o m m u n i c a t i o n w i t h m e s s a g e ) 面向对象(object oriented) = 对象(object) + 分类(classification)+ 继承(inheritance)+ 通过消息的通信(communication with message) objectoriented=object+classification+inheritance+communicationwithmessage

采用这4个概念开发的软件系统是面向对象的。

对象中的几个基本概念

  1. 对象:
  • 对象是指一组属性以及这组属性上的专用操作的封装体。
  • 属性通常是一些数据,有时也可以是另一个对象。
  • 每个对象都有自己的属性值,表示该对象的状态。
  • 对象中的属性只能通过该对象所提供的操作来存取或修改。
  • 操作也称为方法或服务,操作规定了对象的行为,表示对象所能提供的服务。
  • 封装是一种信息隐藏技术,用户只能看见对象封装界面上的信息,对象的内部实现对用户是隐蔽的。
  • 封装的目的是使对象的使用者和生产者分离,使对象的定义和实现分开。
  • 一个对象通常可由对象名、属性和操作3部分组成。
  1. 类:
  • 类(class)是一组具有相同属性和相同操作的对象的集合。
  • 一个类中的每个对象都是这个类的一个实例。
  • 对象是客观世界中的实体,而类是同一类实体的抽象描述。
  • 在分析和设计时,人们通常把注意力集中在类上,而不是具体的对象上。
  • 人们也不必为每个对象逐个定义,只需对类作出定义,而对类的属性的不同赋值即可得到该类的对象实例。
    在这里插入图片描述
  • 类和对象之间的关系类似于程序设计语言中的类型(type)和变量(variable)之间的关系。
  • 通常把一个类和这个类的所有对象称为类及对象,或称为类对象。
  1. 继承:
  • 一个类可以定义为另一个更一般的类的特殊情况,称一般类是特殊类的父类或超类(superclass),特殊类是一般类的子类(subclass)。
  • 形成了一般-特殊的层次关系:
    在这里插入图片描述
  • 子类可以继承其父类(或祖先类)的所有属性和操作,同时子类还可以定义自己特有的属性和操作。
  • 继承是类间的一种基本关系,是基于层次关系的不同类属性和操作的一种机制。
  • 父类中定义了其所有子类的公共属性和操作,在子类中除了定义自己特有的属性和操作外,还可以对父类(或祖先类)中的操作重新定义其实现方法,称为重载(override)
  • 有时,人们定义一个类,这个类把另一些类组织起来,提供一些公共的行为,但不需要使用这个类的实例,而仅使用其子类的实例。这种不能建立实例的类称为抽象类(abstract class)。上图中的交通工具就是一个抽象类。
  • 通常一个抽象类只定义这个类的抽象操作,抽象操作是指只定义操作接口,其实现部分由其子类定义。
  • 如果一个子类只有唯一一个父类,这个继承称为单一操作。如果一个子类有一个以上的父类,这种继承称为多重继承。
    在这里插入图片描述
  1. 消息:
  • 消息(message)传递是对象间通信的手段,一个对象通过向另一个对象发送消息来请求服务。
  • 一个消息通常包括接受对象名、调用的操作名和适当的参数(如果有必要的话)
  • 消息只告诉接收对象需要完成什么操作,但不指示接收者怎样完成操作。
  • 消息完全由接收者解释,接收者独立决定采用什么方法完成所需的操作。
  1. 多态性和动态绑定:
  • 多态性是指同一个操作作用于不同的对象上可以有不同的解释,并产生不同的执行结果。
  • 相同操作的消息发送给不同的对象时,每个对象将根据自己所属类中定义的这个操作去执行,从而产生不同的结果。
  • 动态绑定是指在程序运行时才将消息所请求的操作与实现该操作的方法进行连接。
  • 静态绑定: 传统的程序设计语言的过程调用与目标代码的连接(即运用哪个过程)放在程序运行前(编译时)进行。
  • 动态绑定则是把这种连接推迟到运行时才进行。
  • 在一般与特殊关系中,子类是父类的一个特例,所以父类对象可以出现的地方也允许其子类对象出现。
  • 在运行过程中,当一个对象发送消息请求服务时,要根据接收对象的具体情况将请求的操作与实现的方法进行连接。
    在这里插入图片描述
    在这里插入图片描述

小结:

  • 对象是指一组属性以及这组属性上的专用操作的封装体。
  • 类(class)是一组具有相同属性和相同操作的对象的集合。
  • 一个类可以定义为另一个更一般的类的特殊情况,称一般类是特殊类的父类或超类(superclass),特殊类是一般类的子类(subclass)。
  • 消息(message)传递是对象间通信的手段,一个对象通过向另一个对象发送消息来请求服务。
  • 多态性是指同一个操作作用于不同的对象上可以有不同的解释,并产生不同的执行结果。
  • 动态绑定是指在程序运行时才将消息所请求的操作与实现该操作的方法进行连接。

2. 面向对象分析和设计过程

2.1 面向对象分析过程

下面介绍面向对象分析的任务、一般步骤以及主要活动。

  1. 面向对象分析的任务
    面向对象分析(OOA)的目标:完成对所解问题的分析,确定待建的系统要做什么,并建立系统的模型。
    为达到这一目标,必须完成以下任务:
  • ① 在客户和软件工程师之间沟通基本的用户需求
  • 标识类(包括定义其属性和操作)。
  • ③ 刻画类的层次结构
  • ④ 表示类(对象)之间的关系。
  • ⑤ 为对象行为建模。
  • 递进地重复任务①至任务⑤,直至完成建模。
  • 其中,任务②至任务④刻画了待建系统的静态结构,任务⑤刻画了系统的动态行为。
  1. 面向对象分析的步骤
  • ① 获取客户对系统的需求,包括标识场景(scenario)和用况(use case),并建造需求模型。
  • ② 用基本的需求为指南来选择类和对象(包括属性和操作)。
  • ③ 定义类的结构和层次
  • ④ 建造对象-关系模型
  • ⑤ 建造对象-行为模型
  • ⑥ 利用用况/场景来复审分析模型。
  1. 分析过程
    通常OOA可以从理解系统的使用方式开始,如果系统是人机交互的,则考虑被人使用的方式;如果系统涉及过程控制,则考虑被控制对象(如设备)使用的方式;如果系统协同并控制应用程序,则考虑应用程序的使用方式。
  • 获取客户对系统的需求
    需求获取必须让客户与开发者充分地交流,这里介绍一种采用用况来收集客户需求的技术。(相关知识:用况建模
    ① 分析员首先标识使用该系统的不同的执行者(actor),这些执行者代表使用该系统的不同的角色。
    ② 每个执行者可以叙述他如何使用系统,或者说他需要系统提供什么功能。
    ③ 执行者提出的每一个使用场景(或功能)都是系统的一个用况的实例,一个用况描述了系统的一种用法(或一个功能),所有执行者提出的所有用况构成系统的完整的功能需求。
    注意:用户和执行者的区别:一个用户可以扮演几个角色(执行者),一个执行者可以是用户,也可以是其它系统(应用程序或设备)。

  • 标识类和对象
    在确定了系统的所有用况之后,即可开始标识类以及类的属性和操作。(CRC技术——一种标识类和对象的方法)

  • 定义类的结构和层次
    在确定了系统的类后,就可定义类的结构和层次。类的结构主要有两种:一般-特殊结构和整体-部分结构。
    ①一般-特殊结构,是一种分类结构,反映类之间的一般与特殊的关系。
    ②整体-部分结构反映了类之间的整体与部分关系。整体-部分关系是对对象而言而不是对类的,是一种“has-a”关系。

  • 建造对象-关系模型
    对象-关系模型描述了系统的静态结构,它指出了类间的关系。类间的关系有多种,详见类之间的关系

  • 建立对象-行为模型
    对象-行为模型描述了系统的动态行为,指明系统如何相应外部的事件或激励(stimulus)
    建模的步骤如下:
    ①评估所有的用况,以完全理解系统中交互的序列。
    ②标识驱动交互序列的事件,理解这些事件如何和特定的对象相关联。
    ③为每个用况创建事件轨迹(event trace)
    ④为系统建造状态图。
    ⑤复审对象-行为模型,以验证准确性和一致性。

2.2 面向对象设计过程

面向对象设计(OOD)是将OOA所创建的分析模型转化为设计模型
与传统的开发方法不同,OOD和OOA采用相同的符号表示,OOD和OOA没有明显的分界线,它们往往反复迭代地进行。

在OOA时,主要考虑系统做什么,而不关心系统如何实现。
在OOD时,主要解决系统如何做,因此,需要在OOA的模型中为系统的实现补充一些新的类,或在原有类中补充一些属性和操作。
OOD时应能从类中导出对象,以及这些对象如何互相关联,还要描述对象间的关系、行为以及对象间的通信如何实现。

OOD同样应遵循抽象、信息隐蔽、功能独立、模块化等设计原则。

  1. OOD的一般步骤
  • 系统设计
    ①将子系统分配到处理器
    ②选择实现数据管理、界面支持和任务管理的设计策略。
    ③为系统设计合适的控制机制。
    ④复审并考虑权衡。

  • 对象设计
    ①在过程级别(procedural level)设计每个操作。
    ②定义内部类。
    ③为类属性设计内部数据结构。

  • 消息设计
    使用对象间的协作和对象-关系模型,设计消息模型。

  • 复审
    对设计模型进行复审,并且在需要的时候进行迭代。

  1. 系统设计
    与系统设计有关的活动有以下几项。
  • 将分析模型划分为子系统
    子系统: 在OO系统设计中,对分析模型进行划分,将紧密结合在一起的类、关系和行为包装成设计元素,称为子系统。
    通常,子系统的所有元素共享某些公共的性质,这些元素可能都涉及完成相同的功能,可能驻留在相同的产品硬件中,或者可能管理相同的类和资源。子系统由它们的责任所刻画,即一个子系统可以通过它们提供的服务来标识。在OOD中,这种服务是完成特定功能的一组操作。
    子系统的设计标准:
    ①子系统应具有定义良好的接口,通过接口和系统的其它部门通信。
    ②除了少数的”通信类“外,子系统中的类应只和该子系统中的其它类协作。
    ③子系统的数量不宜太多。
    ④可以在子系统内部再次划分,以降低复杂性。
    可以用类似于数据流图(DFD)的图来描述子系统之间的通信和信息流,此时,DFD中的每个加工(process)表示一个子系统。

  • 标识问题本身的并发性,并为子系统分配处理器
    通过对对象-行为模型的分析,可发现系统的并发性
    如何分析:
    如果对象(或子系统)不是同时活动的,则它们不需并发处理,此时这些对象(或子系统)可以在同一个处理器上实现。
    反之,如果对象(或子系统)必须对一些事件同时异步地动作,则它们被视为并发地,此时可以将并发的子系统分别配备到不同的处理器,或者分配在同一个处理器,而由操作系统提供并发支持。

  • 任务管理设计
    Coad 和 Yourdon 提出如下管理任务对象的设计策略:

  1. 确定任务的类型。
  2. 必要时,定义协调者任务和关联的对象。
  3. 将协调者任务和其他任务集成。

确定任务类型的方法:通过了解任务是如何被启动的来确定任务的类型,如事件驱动任务,时钟驱动任务。
每个任务应该定义其优先级,并识别关键任务。当有多个任务时,还可以考虑增加一个协调者,以控制这些任务协同工作。

  • 数据管理设计
    通常数据管理设计成层次模式,其目的时将数据的物理存储及操纵于系统的业务逻辑加以分离。
    数据管理的设计包括设计系统中各种数据对象的存储方式(如数据结构、文件、数据库),以及设计相应的服务,即为要储存的对象增加所需的属性和操作。

  • 资源管理设计
    OO系统可利用一系列不同的资源(如磁盘驱动器、处理器、通信线路等外部实体或数据库、对象等抽象资源),在很多情况下,子系统同时竞争这些资源,因此要设计一套控制机制和安全机制,以控制对资源的访问,避免对资源使用的冲突。

  • 人机界面设计
    对多数应用系统而言,人机界面本身是一个重要的子系统。人机界面主要强调人如何命令系统,以及系统如何向人提交信息。人机界面设计包括窗口、菜单、报告的设计。

  • 子系统间的通信
    子系统之间可以通过建立客户/服务器连接进行通信,也可以通过端对端(peer to peer)连接进行通信。系统设计阶段必须确定子系统间通信的合约(constract),合约提供了一个子系统和另一个子系统交互的方式。
    合约的设计步骤:
    ①列出可以被该子系统的协作者提出的每个请求,按子系统组织这些请求,并把它们定义到一个或多个适当的合约中,务必要标记那些从父类中继承的合约。
    ②对每个合约标记操作(继承的和私有的),通过这些操作来实现被该合约蕴含的责任,务必将操作和子系统内的特定类相关联。
    ③每个合约应包含合约的类型(客户机/服务器或端对端)、协作者(合约伙伴的子系统名)、类(子系统中支持合约蕴含服务的类名)、操作(类中实现服务的操作名)和消息格式(实现协作者间交互所需的消息格式)。
    ④如果子系统间的交互模式比较复杂,还可以建立子系统协作图。

  1. 对象设计
    概念:对象设计是为每个类的属性和操作作出详细的设计,并设计连接类与它的协作者之间的消息规约。
    (1)对象描述
    对象的设计描述可以采取一下形式之一。
    协议描述: 描述对象的接口,即定义对象可以接收的消息以及当对象接收到消息后完成的相关操作。
    实现描述: 描述传送给对象的消息所蕴含的每个操作的实现细节,实现细节包括有关对象私有部分的信息,即关于描述对象属性的数据结构的内部细节和描述操作的过程细节
    对对象的使用者来说,只需要协议描述就够了。
    (2) 设计数据结构和算法
    为对象中的属性和操作设计数据结构和实现算法。

2.3 设计模式

在许多面向对象系统中,存在一些类和对象的重复出现的模式。这些模式求解特定的设计问题,使面向对象设计更灵活,并最终可复用。这些模式帮助设计者服用以前成功的设计,设计者可以把这些模式应用到新的设计中。
一个设计模式有如下4个基本要素:

  1. 模式名称
    用于描述模式的助记符。设计模式名应具有实际的含义,能反映模式的适用性和意图。

  2. 问题
    描述何时使用模式,解释设计问题以及应用模式所必需的环境和条件。

  3. 解决方案
    描述构成设计方案的各元素、它们之间的关系、各自的职责和协作方式。

  4. 效果
    描述模式应用的效果以及使用模式时的折衷问题。

按照模式的目的(完成什么工作),设计模式可分为创建型、结构型和行为型3类。
创建型模式与对象的创建有关,结构型模式处理类或对象的组合,行为模型描述类或对象的交互和职责分配。

按照适用范围分为类模式和对象模式。
类模式处理类和子类的静态关系,对象模式处理对象间的关系,这些关系在运行时可以变化,具有动态性。

常见的设计模式如下所示:

  1. 创建型模式:工厂方法,抽象工厂、构建器、原型、单件。
  2. 结构型模式:适配器、桥接、组合、装饰器、外观、享元、代理。
  3. 行为型模式:解释器、模板方法、职责链、命令、迭代器、中介者、备忘录、观察者、状态、策略、访问者。
    其中,工厂方法模式、解释器模式、模板方法模式适用于类;适配器模式既适用于类又适用于对象;其他模式都适用于对象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值