【软件工程】第六章·考虑对象(UML、UML在软件开发中的应用、面向对象方法的软件开发)

🌈个人主页: 十二月的猫-CSDN博客

🔥 系列专栏: 🏀软件开发必练内功_十二月的猫的博客-CSDN博客

💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光

目录

[1. 前言](#1. 前言)

[1.1 软工概述与软件过程](#1.1 软工概述与软件过程)

[1.2 计划管理软件与需求分析](#1.2 计划管理软件与需求分析)

[2. 章节概述与章节框架](#2. 章节概述与章节框架)

[3. 考虑对象](#3. 考虑对象)

[3.1 什么是面向对象](#3.1 什么是面向对象)

[3.1.1 面向对象的基本含义](#3.1.1 面向对象的基本含义)

[3.1.2 面向对象的七个特征](#3.1.2 面向对象的七个特征)

[3.1.3 关于面向对象的几个问题](#3.1.3 关于面向对象的几个问题)

[3.2 面向对象开发过程](#3.2 面向对象开发过程)

[3.2.1 OO 需求分析](#3.2.1 OO 需求分析)

[3.2.2 OO 设计](#3.2.2 OO 设计)

[3.2.3 OO 编码与测试](#3.2.3 OO 编码与测试)

[3.3 UML语言的学习](#3.3 UML语言的学习)

[3.4 UML的一些重点](#3.4 UML的一些重点)

[3.4.1 用例图](#3.4.1 用例图)

[3.4.1.1 用例图的组成](#3.4.1.1 用例图的组成)

[3.4.1.2 用例图实例](#3.4.1.2 用例图实例)

[3.4.1.3 用例图的用途](#3.4.1.3 用例图的用途)

[3.4.2 顺序图和协作图的比较](#3.4.2 顺序图和协作图的比较)

[3.4.3 类图](#3.4.3 类图)

[3.4.3.1 介绍](#3.4.3.1 介绍)

[3.4.3.2 OO 类之间的关系](#3.4.3.2 OO 类之间的关系)

[3.5 UML 在软件开发中的使用](#3.5 UML 在软件开发中的使用)

[3.5.1 UML在软件开发各过程中的使用](#3.5.1 UML在软件开发各过程中的使用)

[3.5.2 持 OO 开发过程的图示](#3.5.2 持 OO 开发过程的图示)

[3.6 OO方法的软件开发(加入UML图·更具体)](#3.6 OO方法的软件开发(加入UML图·更具体))

[3.6.1 采用 OO 方法做需求分析](#3.6.1 采用 OO 方法做需求分析)

[3.6.2 采用OO方法做设计](#3.6.2 采用OO方法做设计)

[3.6.2.1 OO 设计原则](#3.6.2.1 OO 设计原则)

[3.6.2.2 OO设计模式](#3.6.2.2 OO设计模式)

[3.6.3 采用OO方法做编码和测试](#3.6.3 采用OO方法做编码和测试)


1. 前言

在进入本篇文章前,大家可以按需求看看另几篇文章:

【软件工程】第一章·软件工程概述-CSDN博客

【软件工程】第二章·软件过程(过程与生命周期建模)-CSDN博客

【软件工程】第三章·计划和管理项目(详解活动图计算关键路径、最早开始时间、最晚开始时间、冗余时间)-CSDN博客

【软件工程】第四章·需求分析-CSDN博客

【软件工程】第五章·设计体系结构-CSDN博客

这几篇文章将让你对软件工程有一个整体的脉络,并在细节上有一定的把控。

本文参考书籍: 软件工程 第4版( [美] 莎丽·劳伦斯·弗里格(Shari Lawrence Pfleeger)

1.1 软工概述与软件过程

第一章·软件工程概述:

1、软件工程是什么------定义、方法、作用。

2、软件工程的前世今生------出现的问题(error、fault、failure)、应对方法(问题分析方法+系统化方法+工程化方法)。

3、软件工程的未来------Wasserman 规范(抽象、分析设计方法和符号描述系统、软件过程、软件体系结构、重用和复用、用户界面原始模型、测试、工具和集成环境)
第二章·软件过程与生命周期:

1、过程与生命周期是什么

  • 过程是一系列有序的任务,涉及活动、资源和约束(过程不是步骤而是步骤的集合)。
  • 生命周期是软件从概念、实现、交付到使用、维护的整个过程。软件开发全过程称为软件生命周期。

2、过程模型

  • **种类:**瀑布模型、原型化瀑布模型、V模型、原型化模型、阶段化开发模型、螺旋模型、敏捷方法模型
  • 联系:
    • 瀑布模型是基础。
    • 原型化瀑布模型结合原型化模型与瀑布模型(设计阶段产生原型化模型,在测试阶段考虑是否返回)。
    • V模型(将设计与测试之间都建立起通道)。
    • 原型化模型(不是具体模型,是一种思想,每一个步骤都可以产生原型去分析)。
    • 阶段化开发模型(开发版本和使用版本分离,分离导致需要选择迭代开发/增量开发/迭代进化开发/统一过程开发)。
    • 螺旋模型(是迭代思想和原型化思想的结合)。
    • 敏捷方法模型(撇弃原型化和迭代化带来的冗余,将目标转化为:快【尽早交付】、准【持续有价值的软件交付活动】、狠【直到客服满意】)(四大原则:个体和交互胜过过程和工具、可运行软件胜过面面俱到的文档、客户合作胜过合作谈判、响应变化胜过遵循计划)
  • **核心思想:**迭代思想、增量思想、原型化思想

1.2 计划管理软件与需求分析

第三章·计划和管理项目:

1、计划项目

  • **时间计划:**项目进度、项目活动、里程碑、活动图、最早开始时间、最迟开始时间、冗余时间、关键路径。
  • **工作量计划:**估(专家估算:Delphi技术、乐观悲观法、Wol技术)、算(算式公式:(a+bSc)m(X)、COCOMO模型:aKLOC^b)

2、管理项目

  • **人员管理:**人员技术、工作方式、项目组织安排(结构性与创造性、一个领导模式、忘我方法模式)
  • **风险管理:**什么是风险、风险管理活动(风险评价:风险识别、风险优先级、风险分析)(风险控制:风险降低、风险化解、风险管理计划)、风险降低(风险避免、假设风险、转移风险)、风险化解(6种风险的6种应对方式:产品过大、功能复杂、系统不支持、测试时间、产品控制、协同工作)
    第四章·需求分析:

1、**了解需求:**需求是什么、需求的类型、需求的特征、需求的表示。

2、**引出需求:**风险承担者、引出需求的方法(会谈、特别关注、观察、文件审查)。

3、**需求分析:**需求前期处理(优先级、需求规范化)、需求下的约束(设计约束、过程约束)、需求分析过程(原始需求获取、问题分析建模、SRS草稿、需求核准、软件规格说明书)。

4、**需求文档化:**为什么要文档化(软件配置管理的一种,使得需求分析的每一阶段都有文档参考)、文档化的结果(SRS)。

2. 章节概述与章节框架

**明确一个点:**Wasserman 规范(抽象、分析设计方法和符号描述系统、软件过程、软件体系结构、重用和复用、用户界面原型、测试、工具和集成环境)贯穿软件开发全过程。

**章节联系:**抽象包括:问题分析、项目计划管理之外,还应该有需求分析部分。同时软件过程、软件体系结构以及符号描述系统(UML语言),我们都已经介绍过。从本章开始,我们正式开始介绍软件code编写过程中所需要的技术------面向对象设计方法。

**思考:**只有完整按照Wasserman规范进行软件开发,才能最大限度提高软件质量。**前面几章的软件过程、需求分析、软件体系结构、计划管理软件都是实现软件前夕我们需要掌握的技术。但是在实现软件过程中,我们也有许多技术可以使用,这就是设计方法。**本章介绍的设计方法------面向对象,就是近来软件开发中最重要的设计方法。


在进入这一章节之前,让我们先思考几个问题,🍉为什么面向对象的软件开发在当今的软件开发中引起了越来越多的关注呢?🍈到底什么是面向对象?🍍比之于传统面向过程的软件开发,面向对象的软件开发有哪些独特的特征呢?

我们进入大学以来学习的第一门语言就是 Java 语言,一门面向对象的高级程序开发语言,我们认识到"一切事物皆对象",通过面向对象的思维方式,将现实世界的事物抽象成对象,我们通过将现实世界中的关系抽象成类和继承等,帮助人们实现对现实世界的抽象 。面向对象既是指一种程序设计范型,同时也是一种程序开发的方法,所以它有自己独特的特征。我们会在接下来详细讨论面向对象的开发过程,主要包括 OO 需求分析、OO 设计、OO 编码与测试。此外,我们还会进一步理解 UML(Unified Modeling Language)在模型化和软件开发系统中的强大功能,同时复习面向对象类之间的关系,面向对象的设计原则等知识。

经过接下来内容的学习,相信你会对面向对象及其在软件开发中的作用产生更深更到位的理解,并在以后的编程设计中从中受益。


**本篇文章内容包括:**UML统一建模语言、UML在软件开发中的应用 、OO方法的软件开发🫠🫠

合理来说应该先学习UML,再学习UML在软件开发中的应用,最后再来学习OO方法的软件开发,因为OO方法的软件开发将直接用UML图展开。
特别提醒(如果前面有系统跟着我的文章学软件工程的同学可以看):

1、首先学习一般的软件过程(每一个软件过程的概述性步骤)。例如需求分析就有五个步骤:获取原始需求、问题建模、规格说明书草稿、需求核准、最终的SRS。

2、接触UML图后,UML图能够辅助软件开发的每一个过程。因此利用UML我们能够细化软件开发的每一个过程。例如需求分析中对于获取原始需求和问题建模,我们在前面的文章并没有深入,因为需要借助UML图。因此这里,我们就深入一层分析到在原始需求获取和问题建模中可以使用用例图、概念类图、数据流图。、


3. 考虑对象

**软件开发过程:**需求分析、系统设计、软件设计、软件实现、单元测试、系统测试、交付、维护。

**OO软件开发过程不同于传统开发的点在于:**需求分析、设计、编码、测试

3.1 什么是面向对象

3.1.1 面向对象的基本含义

面向对象是一种软件开发方法,它将问题及其解决方法组织成一系列独立的对象。数据结构(属性)和动作都被包括在其中。

3.1.2 面向对象的七个特征

①标识

确定对象的身份。对象名称将一个对象和另一个对象区分开来,或区分对象自身的状态,使对象可辨别。

②抽象

层次化的角度描述对象

③分类

将在属性和行为上有共同点的对象分成一个类(一个对象是某特定类的一个实例)

④封装

封装一个对象的属性和行为,隐藏其实现细节

⑤继承

根据对象间相同点和不同点分层次地组织对象

⑥多态

指允许不同类的对象对同一函数调用做出响应。即同一函数调用可以根据调用对象的不同而采用多种不同的行为方式。多态存在的三个必要条件:继承、重写、父类引用指向子类对象

⑦持久性

持久对象不随着创建它的进程结束而消亡(因为在外存中存贮)

3.1.3 关于面向对象的几个问题

①*OO 开发的优势(相对于传统过程式开发)

语言的一致性: 采用相同的语义结构(类、对象、接口、属性、行为)描述问题和解决

方案

全开发过程的一致性: 从需求分析和定义、高层设计、底层设计到编码和测试等,所有

的过程都采用相同的语义结构

核心点:

1、语言一致性意味着我们可以更好的描述并理解问题。

2、全开发过程一致性意味着我们可以在开发中减少体系转化。

②OO 描述类的三个观点

静态观点:包括描述对象、属性、行为和关系

动态观点:包括描述通信、时间控制、状态和状态转变

约束:描述软件结构和动态行为的约束

**类的三个角度:**静态、动态、约束

③OO 过程的定义

OO 需求分析和定义+OO 高层设计+OO 底层设计+OOP+OO 测试

④OO 开发过程的特征

  1. 全开发过程的一致性是 OO 开发过程和传统过程式开发的关键区别
  2. OO 方法在软件制作全流程上尚缺乏理论支持,比如测试理论等
  3. OO 可以被使用于许多不同的软件生命周期
  4. OO 开发过程更多地考虑了类和对象复用的可能性

3.2 面向对象开发过程

3.2.1 OO 需求分析

①确定类(粗略的定义)

概念层类图<conceptual class diagram>:描述应用领域中的概念, 这些概念和类有很自然的联系, 但两者并没有直接的映射关系。

领域模型:这不是对软件对象的描述,而是对现实世界中的概念的表示

素描<sketch>:描述大致的轮廓而不去确定细节

②类或领域中的动态行为

有时使用活动图来描述行为,也可以使用状态图

**需求分析(具体层面):**问题分析、建立用例图、类图建立、工作流图、场景。

**需求分析(OO层面):**确定类、确定类的动态行为

OO层面的需求分析是具体层面需求分析的更高层次抽象
其他知识:

1、**领域模型:**一个抽象层次下的模型。并不关心完整事物而是关心在我所关心领域下的事物的模样(不关注软件中的事物,而是关注现实中的事物)。

2、**素描:**描述大致的轮廓而不去确定细节

3、**概念类图:**仅仅关注概念。只关注类、实体和关系,并不关注类对象的具体行为。

3.2.2 OO 设计

①系统设计

步骤: 整个系统的构成-->确定类-->确定对象和类之间的交互和关系-->确定其他的一

些图

②程序设计

**步骤:**设计算法-->确定类库细节(在系统规模较大的时候,插入类库的细节时还要有一定的次序,即较复杂的类图结构细节化时的次序问题)-->考虑非功能性需求(根据非功能性需求进行追加式的设计以确保软件设计质量)

3.2.3 OO 编码与测试

OO 编码即把模型转换成 OO 编程语言

OO 测试是一系列的测试活动,包括单元测试、集成测试、系统测试和验收测试

从上图我们可以看出,单元测试包括与功能相关的类的测试,也包括类层次结构本身的
测试


从这里我们看到,OO软件开发过程从需求分析、设计到编码和测试,整体构造非常复杂。因此,我们为了保证前后过程交接时沟通的方便,以及配置管理需要,我们需要一个统一的语言来描述软件。

这个语言要求能够较为完备的描述需求分析到测试的每一个步骤,从而便于不同步骤人员的交接,以及配置管理对于每一阶段留存文件的要求。这就是UML统一建模语言的诞生!!

同时由于OO方法进行软件开发比起一般软件开发有语言一致性和全开发过程一致性,因此使得创造一个统一语言成为可能。

UML语言用于OO方法的软件开发:

1、**UML语言贯通开发可行性分析:**OO方法的软件开发有语言一致性和全过程一致性。因此能够有统一建模语言去贯通软件开发的全过程。

2、**UML语言贯通开发好处分析:**用UML语言贯通软件开发能够打通软件开发的各个环节,让开发中的沟通以及各步骤之间的连通性更好。

3、UML语言能够在所有软件开发中都起到作用,只是尤其在OO方法的软件开发中更易使用。

下面我们来学习UML统一建模语言的部分知识~~~~·


3.3 UML语言的学习

这一部分,要求大家学习UML统一建模语言,具体见我下面的文章:

【软件工程】一篇入门UML建模图(用例图、对象图、顺序图与协作图)-CSDN博客

【软件工程】一篇入门UML建模图(类图)_软件工程需求分析的类图-CSDN博客

【软件工程】一篇入门UML建模图(状态图、活动图、构件图、部署图)-CSDN博客

下面我也将讲一讲其中比较重要的部分


3.4 UML的一些重点

3.4.1 用例图

用例图在前面的文章:

【软件工程】一篇入门UML建模图(用例图、对象图、顺序图与协作图)-CSDN博客

有所涉及了,虽然提到需求分析中可以使用到用例图,但是由于考虑到非面向对象理解问题 ,问题的复杂程度很高。所以直到面向对象方法出现,用例模型才算真正意义上被需求分析广泛使用。

3.4.1.1 用例图的组成

用例图:表示一个用户、外部系统或其他实体和在开发系统的关系

①用例

描述系统提供的特定功能,用椭圆表示:

②执行者

和系统交互的实体(用户、设备或其他),用小人表示:

③包含

对已定义用例的复用,用以提取公共行为,用带箭头的实线表示:

④扩展

对一个用例的扩展使用,用以下图标表示:

3.4.1.2 用例图实例

下图是机房收费系统中超级管理员行使的功能:

**拓展用例:**在特别情况下,对基本用例进行功能上的拓展,变为拓展用例;特殊情况使用拓展用例。

一句话: 根据不同的场景来决定是否使用一个用例;特定种类的服务或功能

3.4.1.3 用例图的用途

用户、开发者、双方:

①阐明需求(需求本身是比较难以描述的)

②便于找到需求中存在的问题并完善系统的功能需求

③便于客户、设计人员、测试人员的沟通交流

④在系统分析中是更正式建模的基础

3.4.2 顺序图和协作图的比较

共同点:两者都可以表示各对象间的交互关系

不同点:两者侧重点不同。顺序图用消息的几何排列关系来表达消息的时间顺序,各角

色(最上方实体序列可以使用各种角色)之间的相关关系是隐含的。

协作图用各个角色的几何排列图形来表示角色之间的关系,并用消息来说明这些关系。

**顺序图:**注重时间关系

**协作图:**注重空间关系

3.4.3 类图

3.4.3.1 介绍

OO 设计是从类图(描述对象类型和它们的静态关系)开始的

3.4.3.2 OO 类之间的关系

①继承(inheritance)

"is-a"关系,java 使用"extends",C++/C#使用":",用以下图标表示:

②关联

使用 java、C#或 C++实现关联(association)时,通常将一个类的对象作为另一个类的成员变量,示例图如下:

录界面类 LoginForm 中包含一个 Jbutton 类型的注册按钮 loginButton,它们之间

可以表示为关联关系关联包括:

1)双向关联:

默认情况下,关联式双向的,示意图如下:

2)单向关联:

类的关联关系可以是单向的,示意图如下:

3)自关联:

在系统中可能会存在一些类的属性对象类型为该类本身,示意图如下:

4)多重性关联

又称为重数性关联关系,表示两个关联对象在数量上的对应关系,示意图如下:

常见的多重性表示方式如下表所示:

③聚合(UML2.0 去掉了聚合)

聚合(Aggregation)关系中的成员对象是整体对象的一部分,但是成员对象可以脱离整体对象存在,示例图如下:

④组合

组合(Composition)关系也表示部分与整体的关系。但是组合关系中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也将不存在,两者是共生关系。示例图如下:

⑤依赖

依赖(Dependency)关系是一种使用关系,大多数情况下依赖关系体现在某个类的方法使用另一个类的对象作为参数。示例图如下:

⑥接口与实现

在 java 和 C#中都引入了接口,接口中通常没有属性,而且所有的操作都是抽象的。接口之间也有继承和依赖关系,但是接口设计很重要的一种关系是实现关系,即类实现了接口。示例图如下:

3.5 UML 在软件开发中的使用

3.5.1 UML在软件开发各过程中的使用

①需求分析过程

用例图、概念类图、工作流图(DFD 或活动图)、包含在前述各图中的描述语言

②设计过程

step1:对象图(解释每个对象)、类图(改进概念类图:利用类对象的具体活动)

step2:状态图、活动图

step3:顺序图、协作图

③编码和实现过程

包图、组件图、部署图

**设计过程:**由粗到细、由小到大、考虑时间

3.5.2 持 OO 开发过程的图示


3.6 OO方法的软件开发(加入UML图·更具体)

3.6.1 采用 OO 方法做需求分析

定义+对象建模(用例图<use case diagram>来确定系统的基本功能和边界等,为系统设计做一定准备)+素描式类图<class hierarchy diagram>+数据流图<data flowdiagram>+场景(用自然语言描述过程逻辑,所有的条件或约束)。

核心理解(要点):

1、传统方法由于开发工程师不同,面对问题情况不同,以及对问题的语义结构分析也不同,因此需求分析中问题建模上需要采用的方法也不同(根据看待问题的角度不同)。有时借助用例图、有时借助自然语言等,因此对于需求分析过程中的问题建模没有一个统一的方法。

2、OO有全开发过程的一致性特征。在开发的一整个过程中,OO采用类这一种语义结构去描述并解决所有问题。因此在OO需求分析中,由于统一的问题语义结构,需求分析也将有相同的流程
需求分析完整过程:

用户给出问题定义------用户和分析师一起设计用例图为问题建模------软件设计师根据用例图建立类图指导开发------软件开发者根据类图、用例图去详细规划数据流图来确认每一类间的具体数据流动(函数设计)------共同商讨约束、资源等场景描述

3.6.2 采用OO方法做设计

3.6.2.1 OO 设计原则

面向对象设计原则为支持可维护性复用而诞生,这些原则蕴含在很多设计模式中,设计原则主要有以下七个:

①单一职责原则

②重用原则

③开闭原则

④替换原则

⑤依赖倒置原则

⑥接口隔离原则

⑦迪米特法则

3.6.2.2 OO设计模式

设计模式的定义:软件设计过程中,涉及到的常用问题,以及解决这些问题的方案和核心内

总体来说设计模式分为三大类:

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

3.6.3 采用OO方法做编码和测试

一般软件开发中编码测试部分的方法还没有介绍,因此这里不展开OO方法软件开发中的编码测试方法。

见后续文章(更新中)

4. 总结

本文到这里就结束啦~~

目前【软件工程】系列已经完成:

【软件工程】第一章·软件工程概述-CSDN博客

【软件工程】第二章·软件过程(过程与生命周期建模)-CSDN博客

【软件工程】第三章·计划和管理项目(详解活动图计算关键路径、最早开始时间、最晚开始时间、冗余时间)-CSDN博客

【软件工程】第四章·需求分析-CSDN博客

【软件工程】第五章·设计体系结构-CSDN博客

持续更新中🎢🎢🎢

如果觉得对你有帮助,友友们可以点个赞,收个藏呀~

相关推荐
喵~来学编程啦4 小时前
【软件工程】第五章·设计体系结构
软件工程
喵~来学编程啦4 小时前
【软件工程】第四章·需求分析
软件工程·需求分析
宇寒风暖6 小时前
软件需求工程
笔记·学习·软件工程·需求分析
宇寒风暖6 小时前
需求分析与建模
笔记·学习·软件工程
看山还是山,看水还是。7 小时前
软件工程 设计的复杂性
笔记·流程图·软件工程·团队开发·代码规范·内容运营·代码覆盖率
shinelord明1 天前
【再谈设计模式】组合模式~层次构建的多面手
数据结构·算法·设计模式·软件工程
亓才孓2 天前
[计算机网络]IP地址推行的“书同文,车同轨”
网络·tcp/ip·计算机网络·软件工程
蜂鸟视图fengmap2 天前
蜂鸟视图:工业设备更新与技术改造的“数字化引擎”
信息可视化·软件工程·数字化转型·工业软件·工业设备更新·空间数据平台·蜂鸟视图
喵~来学编程啦3 天前
【软件工程】一篇入门UML建模图(状态图、活动图、构件图、部署图)
软件工程·uml