两种不同类别的软件: 功能预定义软件;用户驱动的软件。他们对软件工程方法有不同的需求 第7章 面向对象方法学 7.1软件工程的新途径 两种不同类别的软件: 功能预定义软件;用户驱动的软件。他们对软件工程方法有不同的需求 传统方法学的缺点: 1、瀑布模型的缺点:僵化。 瀑布模型要求:生命周期各阶段间遵守严格的顺序。 实际情况是:软件开发往往在反复实践中完成。 瀑布模型要求:预先定义并“冻结”软件需求。 实际情况是:某些系统的需求的一个逐渐明确的过程,且预先定义的需求到软件完成时可能已经过时。
2:SA - SD - SP 技术的缺点:本质上是功能分解,以实现功能的过程为中心,而用户的需求变化主要是针对功能的。这就使基于过程的设计不易被理解;且功能变化往往引起结构变化较大,稳定性不好。 系统有明确的边界定义,且系统结构依赖于系统边界的定义,这样的系统不易扩充和修改。 数据与操作分开处理,可能造成软构件对具体应用环境的依赖,可重用性(reusability)较差.
面向对象方法 按人类自然思维方式面对客观世界建立软件系统模型。 对需求变化有很好的适应性。 支持软件复用 可维护性好 类、对象、继承、封装、消息等。 对需求变化有很好的适应性。 属性与方法封装在对象内部。 对象间通过接口进行联系。 支持软件复用 信息隐蔽性 派生 动态链接库 可维护性好 对象构成,消息联系 出错容易定位
发展 初始阶段 发展阶段 成熟 60年代Simula 80年代Smalltalk 80~90年代C++ 实用阶段 语言-方法 分析-设计-编程-测试-维护成为体系
结构化方法VS面向对象方法
结构化方法VS面向对象方法
7.2 面向对象建模 模型: 模型是一种思考工具,利用它可以把问题的解规范地表示出来,帮助我们思考问题、定义术语、选择术语来理解问题。 建模: 建模是问题域中定义软件解的一种方法。建模将问题域的解定义成一种模型,帮助系统分析人员更好地理解问题。减少系统复杂性。
面向对象方法学 面向对象的基本思想是将实际问题看成是对象的集合。 面向对象分析过程 面向对象设计: 面向对象实现: 在系统所要求解的问题中找出对象(属性和行为)以及它属的类,并定义对象与类; 面向对象设计: 是把系统所要求解的问题分解为一些对象及对象间传递消息的过程; 面向对象实现: 是把数据和处理数据的过程结合为对象。对象既可以象数据一样被处理,又可以利用它所提供的“方法”描述处理的流程和细节 面向对象(Object Oriented)= 对象 + 类 + 继承 + 消息机制
Post_office.Send (request, payment) 面向对象方法实例 北 京 杭 州 Message Post-office Send by method 我想把邮局搬到 我家门口,多加几个 邮递员,24小时都开门 …… Attributes (属性) location; ( 地点) employee;(雇员) …… Object 对不起, 本邮局不提供 此类服务 Methods: (方法) send; (发送) sell; (出售) …… 唉,那就先送束花吧 —— Post_office.Send (request, payment) 对象Object = 数据Attribute + 操作Method 注意:Object内部的attributes不允许外部用户直接改动,只有当它提供了相应的服务method时,用户才能通过发送message来提请它执行。
面向对象的基本概念 ⑴ 对象(Object):“对象”是具有名称、属性(数据)和行为方式(方法)的实体。是数据和操作的封装体。 ⑵ 类(class):是具有相同(或相似)属性和操作的对象的集合,类是对象的抽象,而对象是类的具体化。类有层次之分。类间可以构成归纳关系或组合关系
类与对象 类与对象的比较 同类对象具有相同的属性和服务,指它们定义形式相同,不是说每个属性值相同。 类是静态的,类的存在、语义和关系在程序执行前已定义好了。对象是动态的,对象在程序执行时可被创建和删除。Java对对象的回收. OOA和OOD中,不需要逐个对象进行说明,而着重描述代表一批对象共性的类。
⑶ 消息和方法(message and method):消息用来请求对象执行某一处理或回答某些信息的要求;方法是类中操作的实现过程。一个方法包含方法名、参数和方法体。 接收者 对象1 对象2 对象3 对象4 方法 发送者 消息传递
类与对象的继承性 ⑷ 继 承 性(inheritance): B 继承部分 增加部分 B1 B2 A 继承 单重继承
多重继承
⑸ 封装性: 封装是面向对象的一个重要概念。封装是一种信息隐蔽技术 ⑸ 封装性: 封装是面向对象的一个重要概念。封装是一种信息隐蔽技术. 封装将外部接口与内部实现分离开来,用户不必知道行为实现的细节,只须用消息来访问该对象。 与封装性密切相关的是可见性:public、缺省、protected、private。
对象示例 f1 f2 f3 …… fi fn fi(X) S gi(X,S) S’ 输出
⑹ 多态性(polymorphism): 所谓多态即一个名字可具有多种语义。同样的消息可以被送到一个父类的对象和它的子类的对象上,用来申请持用同样名称的服务;然而不同层次中的每个类却各自按自己的需要来响应这个消息,实现消息申请的行为,并得到不同的结果。
面向对象软件工程 传统的面向对象软件工程 现代的面向对象软件工程
面向对象方法中的基本模型 对象模型:是描述系统数据结构的,它始终都是目标系统中最关键、最基本、最核心的; 动态模型:是描述系统控制结构的; 用面向对象方法开发软件,通常需要建立对象模型、动态模型和功能模型三种模型。 对象模型:是描述系统数据结构的,它始终都是目标系统中最关键、最基本、最核心的; 动态模型:是描述系统控制结构的; 功能模型:是描述系统功能的。
7.3 对象模型建立 对象模型描述了系统的数据结构,它是三个模型的最关键的一个模型。它的作用是描述系统的静态结构,包括构成系统的类和对象,它们的属性和操作,以及它们之间的联系。建立对象模型的目标是从问题域中提炼出对目标系统有价值的概念。
对象模型的结构 归纳结构:一般 – 特殊结构 组合结构:整体 – 部分结构 对象不是孤立存在的,相互间都有关系。 对象模型的结构包括: Notebook is a kind of computer. 组合结构:整体 – 部分结构 Notebook has a CPU.
对象之间的关联及其表示 关联的概念 :关联关系反映了对象之间的静态关系 关联的表示:关联用两个对象之间的实线来表示。关联关系分为一对一(1:1)、一对多(1:m)和多对多(m:n)等三种基本类型。 阶数:对象的每条关联关系上均标有数字(m)或者范围(m,n),它说明了该对象对其他对象的约束。
对象的服务与对象间的消息连接 服务 :服务是指某个对象所具有的特定的行为(功能),服务因其它对象的消息请求而提供。一个服务就是对象收到一条消息之后所执行的处理。 消息的概念:消息是对象之间传送的信息 。消息连接反映了对象之间的动态关系。通常消息的组成包括消息名称和必要的参数。 消息连接的表示 :对象之间的消息连接可以用一个带有箭头的实线来表示。箭头从发送者指向接收者。箭头的每一端通常都连接到一个对象(或偶尔到一个类)以表明实际的参加者。 发送者 接收者
动态模型建立 动态模型表示系统的瞬时的、行为化的控制性质,它描述了系统的控制结构。考察在任何时刻对对象及其联系的改变,从对象的事件和状态的角度出发,表现了对象的相互行为,规定了对象模型中对象状态的合法变化序列。 动态模型侧重于系统的控制逻辑,它包括状态图和事件追踪图。用状态图来描绘对象的状态、触发状态转换的事件、以及对象的行为(对事件的响应);事件追踪图侧重于说明发生于系统执行过程中的一个事件序列。 动态模型由多个状态图组成。每个类的动态行为用一张状态图来描绘,各个类的状态图通过共享事件组合起来,从而构成系统的动态模型。也就是说,动态模型是基于事件共享而互相关联的一组状态图的集合。
事件与状态 _ 1 事件的概念 :事件是某个特定时刻所发生的事情,它可以引起对象从一种状态到另一种状态的转换。它是瞬间完成的,没有持续时间 。 事件就是引起对象状态转换的控制信息。模型中各对象之间相互触发,一个触发行为称作一个事件。对象对事件的响应,取决于接受该触发的对象当时所处的状态,响应包括改变自己的状态或者又形成一个新的触发行为 。 事件从一个对象向另一个对象传送信息。这种信息传送可视为单向传送。 事件类的概念:将各个独立事件的共同结构和行为抽象出来组成事件类。有些事件类可能传送的是简单信息“要发生某事件”,而其它事件类则可能传送的是数据值。
事件与状态 _ 2 状态的概念:状态是对对象属性值的一种抽象。也就是说,对象所具有的属性值称为对象的状态。状态是影响对象的重要行为的体现 。 状态的特性:状态具有时间性、持续性 ,状态与事件相互依赖。 行为 :行为是指被事件触发的对象达到某种状态时,所做的一系列处理操作 。 脚本:脚本也叫场景(scenarios)。它是指对系统在某一执行期间内出现的一系列事件的描述。脚本通常始于一个系统外部的输入事件,结束于一个系统外部的输出事件。脚本可以包括系统中所有事件,也可以只包括某些对象触发或产生的事件。 可以这样说:“对象的状态会因某种事件的到来而发生改变,在状态转换的过程中会导致对象产生某种行为”
事件跟踪图 事件追踪图的概念 : 事件追踪图以脚本为依据。侧重于描述发生于系统执行过程中的一个特定“场景”(脚本),是完成系统某个功能的一个事件序列。 事件追踪图的画法 : 事件追踪图中,用竖线表示对象,带箭头的横线表示事件,箭头从发送者对象指向接收者对象。时间自上向下延续,与间隔的空间无关,没有精确的时序。 拿起电话 响拨号声 拨号(2) 响铃 拨号声停 … 拨号(3) 拨号(n) 接受者拿起电话 铃声停 鸣响声 停鸣响声 通话 电话中断 电话接通 接受者挂断 呼叫者挂断 呼叫者 电话线ATM 接受者
状态图 – 对象状态转换序列的表示 状态图的概念 : 状态图是一个状态与事件的网络,它侧重于描述每一类对象的动态行为。状态是某一时刻中属性特征的概括,而状态转换则表示这一类对象在何时对系统内外发生的哪些事件作出何种响应。 事件A/操作 状态A 活动 状态B ● ◎ 事件B[条件] 状态图描述一个对象的个体行为,而事件追踪图则描述多个对象所表现出来的集体行为。它们从不同的角度说明同一系统行为,因此必然存在着密切的内在联系。各个对象的状态图以公共事件为纽带形成的状态图集合,结合事件跟踪图,即构成系统的动态模型。
功能模型建立 功能模型的概念 : 三种模型之间的关系 : 功能模型着重于系统内部数据的传送和处理。它定义了系统应该“做什么”,它更直接地、更明确地反映了用户对目标系统的需求。功能模型由多个数据流图组成。它表明了从外部输入,通过操作和内部存储,直到外部输出的整个的数据流情况,它还包括了对象模型内部数据间的限制。 三种模型之间的关系 : 功能模型定义了系统应该“做什么”;动态模型明确定义了“何时做”(即在何种状态下接受了什么事件的触发);对象模型则定义了“对谁做”和“谁来做” 。 对象模型侧重于描述系统数据结构;动态模型侧重于描述系统控制结构,它由多个状态图组成;功能模型侧重于描述系统功能(系统内部数据的传送和处理),它由多个数据流图组成。三种模型都包含了数据、控制和操作等共同概念,只是各自描述的侧重程度不同。对象模型是最基本的、最重要的,动态模型和功能模型的建立是以对象模型为基础的。
RUP过程
UML 用例图 静态图 (类图、对象图和包图 ) 行为图 (状态图 、活动图 ) 交互图 (顺序图 、协作图 ) 实现图 (构件图 、配置图 )
UML 的特点 统一标准:已成为面向对象的标准化的统一的建模语言 面向对象 可视化、表示能力强大 独立于过程 概念明确,建模表示法简洁,图形结构清晰,容易掌握使用
UML 和代码的关系 用 Java,C++ 等 programming language 是用编码实现一个系统 一些 CASE 工具可以根据 UML 所建立的系统模型来产生 Java,C++ 或其它程序设计语言代码框架
UML 的构成 视图(Views) 图(diagrams) 模型元素 通用机制
视图(Views) 飞机的三视图
视图(Views) 视图是表达系统某一方面特征的 UML 建模元素的子集,它是由一个或者多个图组成的对系统某个角度的抽象
Use-Case View 用途:描述系统应该具备的功能,即被称为参与者的外部用户所能观察到的功能。 用例视图是几个视图的核心,它的内容直接驱动其他视图的开发
Logical View 用途:描述用例视图中提出的系统功能的实现 逻辑视图既描述系统的静态结构,也描述系统内部的动态协作关系 静态结构在类图和对象图中描述;动态模型在状态图、时序图、协作图以及活动图中描述 使用者 设计人员 开发人员
Process View 用途:考虑资源的有效利用、代码的并行执行以及系统环境中异步事件的处理 组成:状态图、协作图和活动图 使用者:主要是开发人员和系统集成人员
Component View 用途:描述系统的实现模块以及它们之间的依赖关系 组成:组件图 使用者:主要是开发人员
Deployment View 用途:显示系统的物理部署,并描述位于节点实例上的运行组件实例的部署情况 组成:配置图 使用者:开发人员、系统集成人员和测试人员
UML 中的图 类图 (class diagram ) 对象图 (object diagram ) 用例图 (use case diagram ) 顺序图 (sequence diagram ) 协作图 (collaboration diagram ) 状态图 (statechart diagram ) 活动图 (activity diagram ) 构件图 (component diagram ) 配置图 (deployment diagram )
模型元素 事物(things) 结构事物(structural things) 动作事物(behavioral things) 分组事物(grouping things) 注释事物(annotational things) UML 中的关系(relationships) 关联(association) 依赖(dependency) 泛化(generalization) 实现(realization) 聚合(polymerization)
结构事物 UML 模型中最基本的结构化事物,包括 类 接口 协作 用例 活动类 组件 节点
类 类是对具有相同属性、方法、关系和语义的对象的抽象
接口 类或组件提供特定服务的一组操作的集合 描述了类或组件的对外可见的动作
协作 定义了交互操作 代表构成系统的模式的实现
用例 描述系统对一个特定角色执行的一系列动作 组织动作事物
活动类 类对象有一个或多个进程或线程的类
组件 实现了一个接口集合的物理上可替换的系统部分
节点 在运行时存在的一个物理元素 代表一个可计算的资源 通常占用一些内存和具有处理能力
动作事物 交互 一组对象在特定上下文中,为达到某种特定的目的而进行的一系列消息交换组成的动作 状态机 由一系列对象的状态组成
分组事物 UML 模型中组织的部分 分组事物只有一种:包 包是一种将有组织的元素分组的机制 包只存在于开发阶段
注释事物 UML 模型的解释部分
UML中的关系 关联 依赖 泛化 实现 聚合
通用机制 修饰 注释 规格说明 通用划分 扩展机制
修饰 为图中的模型元素增加了语义 示例:
注释 以自由的文本形式出现的 信息类型是不被UML解释的一个字符串 示例:
规格说明 UML 中预定义的特性: 文档(Documentation) 职责(Responsibility) 永久性(Persistence) 并发性(Concurrency)
通用划分 型-实例(值) 描述一个通用描述符与单个元素项之间的对应关系 接口-实现
UML 的扩展组件 构造型 标记值 约束
构造型 由建模者设计的新的模型元素 新的模型元素的设计要以 UML 已定义的模型元素为基础 示例:
标记值 附加到任何模型元素上的命名的信息块 示例:
约束 用某种形式化语言或自然语言表达的语义关系的文字说明 示例:
建模的步骤
Hello World(一个 UML 例子) 关键抽象: 在浏览器中打印“Hello World!”的 Java applet 程序 import java.awt.Graphics; public class HelloWorld extends java.applet.Applet { public void paint (Graphics g) { g.drawString("Hello World!", 10,10); }
与 Hello World 直接相关的类 这个类图反映出了 “Hello World!” 这个应用的基本部分,但还遗漏一些事物。按上述代码的描述,这个应用还涉及其他两个类,即 Applet 和 Graphics,而且二者的使用方式不同。类 Applet 是类 HelloWorld 的父类,类 Graphics 则是在类 HelloWorld 的一个操作 paint 的特征标记和实现中被使用。可以在类图中表示这些类及其他们与类 HelloWorld 的不同关系
Hello World 的继承层次 如果针对 Applet 和 Graphics 研究 Java库,将会发现这两个类是一个更大的类层次的一部分。跟踪类 Applet 扩展和实现的那些类,能够产成另一个类图,如下图所示
Hello World 的包 为了管理大规模的类层次图,可以用包来组织类,如下图所示: HelloWorld 依赖包 Java.applet java.applet 依赖包 java.awt
Painting 机制 可以使用顺序图对事件的顺序建模,展示了对象的协作
Hello World 的构件 “Hello World!” 是一个程序,不能单独运行,通常是嵌入在 Web 页中