第二章 面向对象分析
面向对象的软件开发过程中的需求分析与建模研究

面向对象的软件开发过程中的需求分析与建模研究第一章引言随着信息技术的快速发展,软件已逐渐成为了现代社会不可或缺的组成部分。
而软件开发过程中的需求分析与建模是确保软件开发质量的重要步骤,因此在面向对象的软件开发中,需求分析与建模研究具有重要的意义和价值。
本文将从面向对象的软件开发出发,介绍需求分析和建模的概念、方法和工具,并重点探讨基于面向对象的软件开发过程中的需求分析与建模研究。
第二章面向对象的软件开发面向对象的软件开发是一种软件开发方法,它以对象为中心,实现了软件的高内聚、低耦合和易维护性,具有较高的开发效率和软件重用性。
在面向对象的软件开发中,需求分析和建模是其中的关键环节。
基于面向对象的软件开发过程主要包括以下几个阶段:1.需求分析阶段。
在该阶段中,需求分析人员将收集和分析用户和系统需求,以确定软件开发的需求和目标。
2.设计阶段。
在设计阶段中,设计人员将根据需求分析阶段的结果,设计面向对象的软件系统架构和对象模型。
3.编码和测试阶段。
在这个阶段中,开发人员将根据设计人员的指示开发代码和进行测试,以确保软件能够按要求正确运行。
4.部署和维护阶段。
在这个阶段中,开发人员将软件部署到用户环境中,并进行维护和修复错误。
在整个软件开发过程中,需求分析和建模是相互关联、相互作用的关键环节。
第三章需求分析与建模基础知识3.1 需求分析需求分析是软件开发的首要任务,它是确保软件开发符合用户需求的前提条件。
需求分析包括两个方面,即功能需求和非功能需求。
1.功能需求功能需求是软件开发中最基本的需求,它是用户对软件功能的具体要求。
在软件开发中,功能需求可以通过用例图、活动图、状态图和顺序图等方法进行描述和分析。
2.非功能需求非功能需求是软件开发中的另一个重要因素,它主要描述软件的性能、可靠性、安全性、可维护性和可移植性等方面的要求。
常用方法包括场景模型、质量属性树和系统特征模型等。
3.2 需求建模需求建模是将需求分析的结果转换为相应的模型,以便于软件设计和开发人员的理解和使用。
面向对象的系统分析与设计1-2

系统的复杂性
例1:序列aaaaaaa…… 这是一个亚(准)复杂性系统,相应的程序为:在每一个a
后续写a。这个短程序使得这个序列得以随意复制到无穷。 例结2论::序列aabaabaabaab……
与一第旦1个一例个子程相序比的,大该小例与要试复图杂描一述些的,系但统仍相可提以并很论容时易,地则写 出无程法序编:程在。两或个者a说后,续当写系b并统重的复结这构一不操能作被。描述,或描述它的 例最为3小根:算本aa法复ba与杂a系系ba统统bb本。aa身在ba具达a有到ba相根bb同本…的复… 信杂息之比前特,数人时们,仍则可称以该编系写统出 能够这执个行例的子程与序例,2相否似则,,也做可不以到用。很短的程序来描述:在两个 a后续写b并重复。每当第三次重写b时,将第二个a替换为b。 这样的序列具有可定义的结构,有对应的程序来表示。 例4:aababbababbbabaaababbab……
软件开发的系统化方法遵循的原则
在软件中,存在着大量不能简化的实体,我们把这些实体 称之为元素,那么,软件系统就是由这些相互联系、相互作用 的若干元素组成的,具有特定功能的统一整体。而软件系统的 概念结构则是指系统内各组成部分(元素和子系统)之间相互 联系、相互作用的框架。
要使一个软件系统的复杂性下降,无非也就是分割,通俗 点讲,也就是将一个大系统划分为若干小的子系统,最终,使 人们易于理解和交流。下面,给出软件开发的系统化方法需要 遵循的几个基本原则:
结构化方法的产生和发展
3. 结构化分析方法的形成
结构化设计方法建立在系统需求明确的基础上。如何明确 系统的需求,就是结构化分析所要解决的问题。结构化分析方 法产生于20世纪70年代中期,最初的倡导者有Tom Demarco、 Ed Yourdon等人。结构化分析在20世纪80年代又得到了进一 步的发展,并随着Ed Yourdon于1989年所著的《现代结构化 分析》(Modern Structured Analysis)的出版而流行开来。现 代结构化分析更强调建模的重要性。
面向对象分析

面向对象分析:是确定需求或者业务的角度,按照面向对象的思想来分析业务。
例如:OOA只是对需求中描述的问题,进行模块化的处理,描述问题的本质,区别每个问题的不同点相同点,确定问题中的对象。
OOA与结构化分析有较大的区别。
OOA所强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。
基本步骤:
在用OOA具体地分析一个事物时,大致上遵循如下五个基本步骤:
第一步,确定对象和类。
这里所说的对象是对数据及其处理方式的抽象,它反映了系统保存和处理现实世界中某些事物的信息的能力。
类是多个对象的共同属性和方法集合的描述,它包括如何在一个类中建立一个新对象的描述。
第二步,确定结构(structure)。
结构是指问题域的复杂性和连接关系。
类成员结构反映了泛化-特化关系,整体-部分结构反映整体和局部之间的关系。
第三步,确定主题(subject)。
主题是指事物的总体概貌和总体分析模型。
第四步,确定属性(attribute)。
属性就是数据元素,可用来描述对象或分类结构的实例,可在图中给出,并在对象的存储中指定。
第五步,确定方法(method)。
方法是在收到消息后必须进行的一些处理方法:方法要在图中定义,并在对象的存储中指定。
对于每个对象和结构来说,那些用来增加、修改、删除和选择一个方法本身都是隐含的(虽然它们是要在对象的存储中定义的,但并不在图上给出),而有些则是显示的。
软件工程面向对象的分析与设计

-
THANKS!
XX生活即将结束,在此,我要感谢所有教导我的老师和陪 伴我一齐成长的同学,他们在我的大学生涯给予了很大的帮助。本论 文能够顺利完成,要特别感谢我的导师XXX老师,XXX老师对该论文从选题,构
思到最后定稿的各个环节给予细心指引与教导,使我得以最终完成毕业论文设计! 最后,我要向百忙之中抽时间对本文进行审阅,评议和参与本人论文答辩的各位
识别类和继承
通过类和继承,我们可以组织具有相似属性和行为的对象。类 定义了一组对象的通用属性和行为,而继承则允许我们从一个 类派生出另一个类,从而共享和扩展其属性和行为
定义接口
接口定义了类或对象之间的交互方式。它描述了对象需要提供 的方法和需要遵守的协议
面向对象的分析
通过面向对象的分析, 我们可以更准确地理 解和描述软件系统的 需求,为后续的设计 和实现打下坚实的基 础
2
面向对象的 设计
面向对象的设计
面向对象的设计(Object-Oriented Design,OOD)是软件工程过程中的一个关键阶段 ,其目标是基于面向对象的分析结果,设计出满足系统需求的软件结构
识别类和对象:根据面向对象的分析结果,识别出系统中的主要类和对象。这些类和 对象应该能够准确地反映问题域的特征和需求
和操作方式
设计数据库:根据系统的数 据需求,设计出合适的数据 库结构。数据库应该能够有 效地存储和管理系统的数据
设计系统架构:根据系统的 功能需求和性能要求,设计 出合适的系统架构。系统架 构应该能够支持系统的可扩 展性、可维护性和可重用性
面向对象的设计
通过面向对象的设计,我们可 以设计出结构清晰、易于理解 和实现的软件系统,从而提高
面向对象的分析
第二部分面向对象分析

m
(e) 关联
n
类
同步
接收者
普通对象
主动对象
普通类
异步
(f) 消息连接
(a) 类
一般类
(b) 属性与服务
整体对象类
m
n
特殊类 (c) 泛化 特殊类 部分对象问题 域和系统责任有 关的对象,用对 象类表示
问题域
人事管理 ……
系统责 任
金融业务 个人储蓄 国债发行 贷款业务 ….
信息备份 ……
困难所在: 软件开发人员与领域专家的技术背景不同*
现今的系统所面临的问题域比以往更为广阔和复杂,系统比以往更为庞大。
2、交流问题
如果分析所产生的文档使分析员以外的其他人员都很难读懂,那就很不 利于交流。这会使彼此的思想不易沟通,并容易隐藏许多错误。(分析 人员与客户**及领域专家,分析人员之间*,分析人员与设计人员)
3、需求的不断变化
引起需求变化的因素: 用户(主客观因素)、竞争因素、经费、技术因素* 操作〉接口〉属性 对象最稳定 软件开发者必须以合作的态度满足用户需求
4、软件复用的要求
初始为程序复用。 复用级别提高——分析结果复用 要求分析模型中的可复用部分用于多个系统 要求一个分析模型在多种条件下设计和实现
目标是建立一个符合问题域、满足用户需求的OOA模型。
2.2
分析面临的主要问题
问题域(problem domain):被开发系统的应用领域,即在现实世界 中由这个系统进行处理的业务范围。 系统责任(system responsibilities):所开发的系统应该具备的 职能。
1、问题域和系统责任复杂性日益增长
面向对象技术与UML

继承性举例
继承传递:大学生可以继承“人”和“学生”的特
征 父类 多重继承: 在职研究生既可以继承“学生”的特 征,又可以继承“教师”的特征 人
工人 学生 教师 农民
中学生 大学生 研究生 派生类
助教
讲师
具有继承关系的对象的特性
对象类间具有共享特征(包括数据和程序代
码的共享) 对象类间具有细微的差别或新增部分(包括 非共享的程序代码和数据) 对象类间具有层次结构。 继承所具有的作用有两个方面:
第二节 面向对象分析
本节要求了解面向对象分析的基本过程和基本原则 OOA: Object-oriented Analysis . 指利用面向对象的概念和方法构建软 件模型。 面向对象分析的基本过程 理解 表达
验证
对理解和表达进 行校验,以达到 理想效果。
需求
建立模型
在面向对象分析中,主要建立对象模型,动态模型和功能模型。 对象模型是最基本最重要的模型。
3) 可重用性好 有两种方法可以重复使用一个对象类:一种方法是创 建该类的实例,从而直接使用它;另一种方法是从它 派生出一个满足当前需要的新类。 4)较易开发大型软件产品 5)可维护性好
2.1.2 喷泉模型
“喷泉”这个词体现了面向对象软 件开发过程迭代和无缝的特性。 图中代表不同阶段的圆圈相互重 叠,这明确表示两个活动之间存 在交迭;而面向对象方法在概念 和表示方法上的一致性,保证了 在各项开发活动之间的无缝过渡, 事实上,用面向对象方法开发软 件时,在分析、设计和编码等项 开发活动之间并不存在明显的边 界。图中在一个阶段内的向下箭 头代表该阶段内的迭代(或求 精)。图中较小的圆圈代表维护, 圆圈较小象征着采用了面向对象 范型之后维护时间缩短了。
面向对象分析

面向对象分析
面向对象分析是计算机科学领域中使用最广泛的一种分析技术,它是一种结构化的分析方法,是系统分析的更新与系统设计的预备工作。
面向对象分析可以帮助我们更好地理解和分析现有系统,并为系统重构提供指导。
面向对象分析是一种以对象为中心,以建模和分析实体、对象和对象之间的关系为主要任务的分析方法。
它的主要目的是将概念抽象为实体,然后利用视图及关系描述它们之间的关系。
面向对象分析包括分析、设计、建模过程,分析过程也称为面向对象分析(OOA)。
面向对象分析强调对对象的分析,对象可以看作对实际世界中的实际事物的抽象。
对象可以由属性和行为组成,属性描述了对象的内部状态,行为描述了它如何处理消息。
在面向对象分析中,这种抽象事物被描绘为类,每个类有一组共享的属性和行为。
面向对象分析和设计的主要工作是抽象建模,确定对象之间的关系,并利用抽象和关系建模系统。
建模可以帮助我们清楚地了解系统结构,以及每个系统元素之间的联系。
一旦建模完成,可以使用模型来设计、分析和实现高级的系统。
面向对象分析是一种结构化的分析方法,用于理解和描述系统的行为,从而有效地构建高质量的系统。
它的关键是建立系统的实体、关系和视图,从而提出系统的结构,并提出系统实现的可行方案。
总体而言,面向对象分析是一种重要而普遍应用的管理技术,它是系统分析和设计过程中的重要组成部分。
对对象的分析有助于进行
更好的系统设计,增强了系统容量,提高了系统灵活性和性能,为组建现代软件系统提供了可行的工具。
面向对象分析与设计

面向对象分析与设计面向对象分析与设计(Object-oriented analysis and design)是软件工程领域中的一种方法论,用于解决软件系统开发过程中的问题和需求。
本文将对面向对象分析与设计的基本概念、流程和常用方法进行介绍,并附带答案和解析。
第一部分:面向对象分析(Object-oriented analysis)面向对象分析是软件开发过程中的第一步,旨在理解问题域并建立领域模型。
面向对象分析有以下几个重要概念:1. 对象(Object):对象是系统中的一个实体,包含数据和方法。
对象可以是具体的实物、虚拟的概念或一组相关的数据和行为。
2. 类(Class):类是一种抽象的定义,描述了一组具有相同特征和行为的对象。
3. 属性(Attribute):属性是对象的特征,用于描述对象的状态。
4. 方法(Method):方法是对象的行为,用于描述对象可以执行的操作。
面向对象分析的主要流程包括以下步骤:1. 需求收集:收集系统的需求,与利益相关者沟通,了解系统的功能和性能要求。
2. 领域建模:对现实世界的问题域进行抽象和建模,识别出系统中的对象和它们之间的关系。
3. 需求分析与规约:通过使用用例、活动图和状态图等工具对需求进行分析和规约,明确功能和交互细节。
4. 领域模型验证:与利益相关者验证领域模型的准确性和实用性,确保模型能够满足系统需求。
第二部分:面向对象设计(Object-oriented design)面向对象设计是在面向对象分析的基础上,进一步细化领域模型,为系统的实现提供指导。
面向对象设计有以下几个常用方法:1. 类图(Class diagram):类图用于展示类、属性和方法之间的关系。
类图包括类的名称、属性和方法,并通过关联、继承和聚合等关系展示类之间的联系。
2. 对象图(Object diagram):对象图用于展示类的实例和对象之间的关系。
对象图是类图的实例化表示,展示了系统在某一时刻的对象及其特定的属性值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个可行的解决方案
重新根据问题的本质特性分解细节
忘掉:烧水壶、阀门、加热托盘、传感器等 专注本质问题: 怎样冲咖啡? 向咖啡粉上倒热水,然后将产生的液体收集到 某种容器内。 可设定为两个抽象类: HotWaterSource(烧水壶、阀门、传感器)加热水, 把热水送到咖啡粉,最后滴到ContainmentVessel (保温托盘、传感器演了这个角色)容器中,且保温。
7
其描述:
HotWater Source
CoffeeFlow 图 2 交叉线 Containment Vessel
这个关系是根据物理特性设定的,而不是根 据软件操作的控制设定的。
HotWater Source
start
Containment Vessel
图 3 开启热水水流
设计中的关联是在对象间发送消息的通道, 和物理对象的流程无关。
8
用户与系统是怎样交互的?
用类UserInterface(按钮、指示灯)来表示。
这三个类实例之间是怎样交互的? # 由哪个对象检测用户按下加热“Brew”按钮这一事件? UserInterface对象
# 加热按钮被按下时,这个对象应该做什么? 确认烧水壶满了,咖啡壶是空的,且放在保温托盘上。 UserInterface对象发送消息给: HotWaterSource ContainmentVessel,是否就绪。
9
User Interface
IsReady
HotWater Source
IsReady
Containment Vessel
图 4 加热按钮被按下,检查是否就绪 1a:IsReady User HotWater Interface Source 3a:Start
只要有一个 查询为false, 拒绝加热咖啡, 通知用户,请求 无效。 具体到咖啡机 上,可用指示灯闪 烁来表示。 两个查询的 结果都为true, 开始热水的流动。 具体到咖啡机上, 关闭阀门,打开烧 水壶。
1b:Pause 2b:Resume 1d:Done 2a:IsReady 图 7 检查加热的过程是否完成(done)
3a:Start 1c:Done Containment Vessel
12
咖啡倒空 加热过程结束后,咖啡机熄灭指示灯,空咖啡 壶放回到托盘上。谁来检查这种情况?
ContainmentVesselu检查,它还向UserInterface 发送一个Complete(完成)消息 2c:Done 1a:IsReady
3a:Start 2d:Done 1e:Complete 1c:Done Containment Vessel 2a:IsReady
User Interface
HotWater Source 1b:Pause 2b:Resume 1d:Done
13
4a:Start
图 8 咖啡倒空
如何在这种结构下实现Mark4咖啡机?
3
硬件由硬件工程师提供API实现。 软件如何设计?
Button 灯亮 Light CoffeeMaker
这个设计如何?
烧水壶
Boiler
咖啡壶
WarmePlate 保温托盘
BoilerSensor BoilerHeater Plate Sensor Plate Heater
传感器
Sensor
Heater 加热器
4
图 1 过于具体的咖啡机
解决思路
#1 向Light(灯亮)类添加方法,看看怎么样?
Light只有on(),off()两个方法
这段代码有什么问题? Light.java public class Light { 没有变量,奇怪,因为对象通常拥 public void on() { 有状态,且还操纵这些状态 CoffeeMakerAPI.api. 两个方法只是简单调用的一个转 setIndicatorState(CoffeeMakerAPI.INDICATOR_ON); 发者,没作任何事情,多余称为泡 泡类(Vapor Class) } //设置指示器状态 public void off() { Button,Boiler,WarmerPlate也 是如此 CoffeeMakerAPI.api. setIndicatorState(CoffeeMakerAPI.INDICATOR_OFF); } }
19
M4ContainmentVessel.java public class M4ContainmentVessel extends ContainmentVessel { public boolean isReady() { int plateStatus = CoffeeMakerAPI.api.getWarmerplateStatus(); return plateStatus == CoffeeMakerAPI. POT_EMPTY; } }
startBrewing();
} } }
16
UserInterface.java
public class UserInterface { private HotWaterSource hws; private ContainmentVessel cv; public void done() { } public void complete() { } protected void startBrewing() { if (hws.isReady() && cv. isReady()) { hws.start(); cv.start(); } } }
是否可实现这三个类中的方法,去调用相应的
x CoffeeMakerAPI? 是否将咖啡机的本质同Mark4机绑定在一起就 可以? 是个糟糕的设计 利用依赖倒置(DIP)进行设计
User Interface #startBrewing HotWater Source
startBrewing()? M4UserInterface 为什么要创建保护方法 当checkButton函数被调用 ,它就调用 对start(),isReady() 检测方法的调用都是 为什么不直接从 M4UserInterface调用 Containment +checkButton CoffeeMakerAPI.getBrewButtonStatus() UserInterface 应该处理的高级行为 ,不应 start() 函数机中。 ?Vessel 耦合到 Mark4 按钮己经被按下,它就调用UserInterface 图 9 检查加热按钮 中的保护方法 startBrewing() 14
一个设计的启发: Mark4 专用咖啡机
1
描述: Mark4专用咖啡机最多一次可煮好12杯咖啡。
使用者先将咖啡粉放入滤网(filtter holder)中, 将滤网支架滑入托盘中, 咖啡壶(pot)放在保温托盘(warmer plate上。 使用者向烧水壶(boiler)内加入最多12杯冷水, 按下加热(Brew)键,水被加热至沸腾,蒸气压力迫使水漫 过咖啡粉末,咖啡通过滤网的过滤,流入咖啡壶中,并保 持一定温度。壶中有咖啡时,保温托盘处于工作状态,若 将壶从保温托盘上拿开,水流将立刻停止,这样煮沸的咖 啡不会溢出到保温托盘上。
2
需要监控的硬件
用于烧水壶的加热部件,可以开启和关闭 保温托盘的加热部件,可以开启和关闭 保温托盘的传感器,有三个状态: warmerEmpty(温热装置空闲) potEmpty(壶空), potNotEmpty (壶不空) 烧水壶中的传感器,有二个状态: boilerEmpty, boilerNotEmpty 加热键指示加热过程,加热过程结束,咖啡 煮好,指示灯亮 压力阀门,有开启和关闭状态。当开启时,烧水 壶中的压力降低,使经过过滤网的水流立刻停止。
5
解决思路 #2 考虑抽象 图中有两个基类 Sensor,Heater
sensor.java public interface Sensor{ public int sense(); } Heater.java public interface Heater{ public void turnOn(); public void turnOff(); } 程序的这两个类有什么用? 一个类只包含抽象方法, 但没有使用者,返回值不确定, sense()方法返回什么? 在烧水壶的传感器中返回 值有两种可能. 在保温托盘的传感器中返 回值有三种可能. 无法在接口中表达传感器 的约定. Sensor,Heater没什么用.
15
检查加热按钮的状态
public int getBrewButtonStatus(); public static final int BREW_BUTTON_PUSHED = 0; public static final int BREW_BUTTON_NOT_PUSHED = 1
M4UserInterface.java public class M4UserInterface extends UserInterface{ private void checkButton() { int buttonStatus = CoffeeMakerAPI.api.getBrewButtonStatus(); if (buttonStatus == CoffeeMakerAPI.BREW_BUTTON_PUSHED) {
CoffeeMakerAPI.JAVA public interface CoffeeMakerAPI { public static CoffeeMakerAPI api = null;//由 main 设置 实现以下的函数: 返回加热托盘传感器的状态,该传感器检查咖啡壶否 在托盘上,其中是否有咖啡. 返回烧水壶开关的状态,检查壶中的存水是水多于1/2杯 检查开关烧水壶中的加热托盘 检查开关保温托盘中的加热托盘 检查开关指示灯 开关压力阀门,阀门关,烧水壶蒸气压力迫使开水流过 过滤器