目录
引言
尊敬的读者:
您好!在此次博客中,我将分享一些有关软件工程导论的重要观点和理论。这些内容均摘自清华出版社出版的《软件工程导论》一书。在此,我郑重声明,本次分享的目的是为了传播和普及软件工程领域的知识,绝非抄袭或剽窃。以下为本书的相关信息,以兹证明:
书名:《软件工程导论》
编著:吴艳 曹平
出版社:清华大学出版社
出版日期:2021.2(2022.7重印)
希望本次分享能够为您带来收获,并激发您对软件工程领域更深入的研究。再次感谢您的关注与支持!
敬请期待后续内容,我们将一同探索软件工程的奥秘。
顺祝商祺!
续前文:
软件工程导论学习笔记——(2)项目启动阶段(含三四五章课后题答案):
https://blog.csdn.net/Prayer41/article/details/135378751
软件工程导论学习笔记——(1)基础知识(含一二章课后题答案):
https://blog.csdn.net/Prayer41/article/details/135363825
六、统一建模语言
统一建模语言(Unified Modeling Language,UML)是非专利的第三代建模和规划语言。UML是一种用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的、制品的开发方法。
6.1UML发展趋势图
![](https://i-blog.csdnimg.cn/blog_migrate/1ea9f6aadf53e65acded002a70d4d36e.png)
6.2UML的组成
UML是通用的可视化标准建模语言,由构造块、公共机制、架构三部分组成。
- 构造块。包括基本的UML建模元素(如类、接口、用例等)、关系(关联关系、依赖关系、聚合关系、组合关系、泛化关系、实现关系)和图(9种图形,分静态模型和动态模型两种类型)。
- 公共机制。包括规格说明、修饰、公共分类、扩展机制等。
- 构架。包括系统的五个视图,即用例视图、逻辑视图、组件视图、并发视图和部署视图。
6.3UML中的图
UML图大致可分为静态图和动态图两种。
![](https://i-blog.csdnimg.cn/blog_migrate/ef0929bf4e0f7eb104404ea712493f52.png)
6.3.1用例图
一个用例图定义一组用例实例,并确定了与用例实例进行交互的参与者。用例图描述外部执行者所理解的系统功能,是系统的“蓝图”,表明了开发者和用户对软件需求规格达成共识。用例图通常在需求分析阶段进行建模。
用例图的元素主要有:
- 角色(Actor)
- 用例(Case)
- 关联
- 包含
- 扩展
- 泛化
6.3.2类图和对象图
类图和对象图揭示了系统的结构。类图描述类和类之间的静态关系,它不仅显示信息的结构,还描述了系统的行为。
对象图是类图的一个实例,常用于表示复杂的类图的一个实例。
类图包括3个部分:
- 类名
- 属性
- 服务(也称方法)
属性和服务都具有3种访问权限:public(用“+”表示)、private(用“-”表示)、protected(用“#”表示)。
类之间的关系包括:
- 依赖关系
- 泛化关系
- 关联关系
- 聚合关系
- 组合关系
- 实现关系
对象图和类图一样反应系统的静态过程,但它是从实际的或原型化的情景表达的。对象图是类图的实例,几乎使用与类图完全相同的标识。它们的不同点在于对象图显示类的多个对象实例,而不是实际的类。
6.3.3顺序图和协作图
这两种图都是交互图,表示各组对象如何进行协作的模型,通常用来表示和说明一个用例的行为。顺序图和协作图本质上没有不同,只是排版方式不同,顺序图强调对象交互行为的时间顺序,协作图则强调对象之间的协作关系。
1)顺序图
顺序图描述对象之间动态的交互关系,将交互关系表示为一张二维图,着重体现对象间消息传递的时间顺序。顺序图可以直观地表示出对象的生存期,在生存期内,对象可以对输入消息做出响应,也可以发送消息。
顺序图中的主要因素包括:
- 活动者。交互活动的发起者,也可以理解为参与者的一个实例,用“小人”表示。
- 对象。参与交互的对象,可以是类实例、界面对象,也可以是实现交互时参与的某类职责对象,如控制对象、服务对象以及数据库访问接口等,用“矩形框”表示。对象一般按交互时间顺序排列,构成了顺序图的水平轴。
- 生命线。生命线与对象相连,是顺序图中的垂直轴表示时间,代表对象的生命期,用“虚线”表示。
- 消息。消息是对象之间通信的一种机制,用从一个对象的生命线到另一个对象生命线的箭头表示,箭头以时间的顺序在图中上下、左右排列。消息需要命名,可以是一个事件,或者一个具体的服务(与类图中服务、用例图中的用例对应)。
- 激活条。代表对象被“激活”的状态,用“矩形条”表示“激活”状态从输入消息触发开始,到对象参与交互完成结束。如果一个对象在交互中不断被激活(不连续),生命线上就会出现不连续的激活条。
2)协作图
协作图是顺序图的同构图,描述合作的对象间的交互关系和链接关系,侧重体现交互对象间的连接关系。协作图由对象和消息组成,具体的图标表示与顺序图中的相同。
6.3.4状态图
状态图描述对象状态和事件之间的关系,通常用来描述单个对象的行为,不适合表述包括若干协作的对象行为,通常不需要对每个类编制状态图,只有那些重要的交互行为的类,如在业务流程、控制对象、用户界面的设计方面适合用状态图描述。
状态图的元素包括以下4方面内容。
- 状态。又称为中间状态,用圆角矩形表示。
- 初始状态。又称为初态,用一个黑色的实心圆表示。一张图中只能有一个初始状态。
- 结束状态。又称为终态,在黑色的实心圆外套上一个空心圆。一张状态图中可能有多个结束状态。
- 状态转移。用箭头说明状态的转移,用文字说明引发状态变化的事件或条件。
6.3.5活动图
活动图用来表示系统中各种活动的次序,既可用来描述用例的工作流程,也可用来描述类中某个方法的操作行为,活动图依据对象状态的变化捕获动作与动作的结果。活动图是由状态图变化而来的,也包括初始状态、终止状态、中间活动状态等。
活动图的元素包括以下4方面内容。
- 活动。用圆角矩形表示非原子的或原子的动作状态。
- 动作流。用箭头说明从一个活动转入另一个活动。
- 起始节点。实心黑色圆点表示活动开始。
- 终止节点。圆圈十内部实心黑色圆点表示整个活动结束。
活动图可分为基本活动图和带速道的活动图。基本活动图描述系统发生了什么,带泳道的活动图更进一步描述活动由哪个类完成。
6.3.6组件图
组件图是面向对象系统的物理方面进行建模的图之一,可以有效地显示组件以及它
们之间的逻辑关系」组件图可对源代码、可执行体、物理数据库进行建模。
组件图中通常包括以下3个元素。
- 组件。系统设计的模块化部分,它隐藏了内部的实现,对外提供一组接口组件是一个封装完好的物理实现单元,它具有自己的身份标识和定义明确的接口,并且由于它对接口的实现过程与外部元素独立,所以组件具有可替换性,一般指源代码文件、二进制文件和可执行文件等,用“带小图标的矩形框”表示。
- 接口。有两类接口,即提供接口与需求接口。提供接口又被称为导出接口或供给接口,是组件为其他组件提供服务的操作集合,需求接口又被称为引人接口,是组件向其他组件请求相应服务时要遵循的接口。
- 关系。表示组件之间的关系,包括泛化、依赖和实现3种关系,含义与类关系类似。
6.3.7部署图
部署图也称为施图,是面向对象系统的物理方面建模的之一。组件图用于说明构件之间的逻辑关系,部署图则在此基础上更进一步描述系统硬件的物理拓扑结构,以及在此结构上执行的软件部署图常用于帮助理解分布式系统,可以使系统的安装、部署更简单,主要元素包括节点和连接、接口和构件。
利用面向对象方法开发软件,通常使用UML中的各类图在软件的各个开发阶段进行建模。
七、面向对象分析与建模
7.1面向对象分析方法
7.1.1 面向对象分析的基本过程
面向对象分析就是抽取和整理用户需求并建立问题域精确模型的过程。面向对象分析过程从分析陈述用户需求的文件开始,主要完成以下3个任务。
- 发现和改正原始陈述中的二义性和不一致性,补充遗漏的内容,从而使需求陈述更完整、更准确。
- 系统分析师需要反复多次地与用户协商、讨论、交流信息,快速建立起一个可在计算机上运行的原型系统,从而能更正确地提炼出用户的需求。
- 深入理解用户需求,抽象出目标系统的本质属性,并用模型准确地表示出来。
从解决问题的描述角度划分,面向对象建模得到的模型主要有3个:
- 对象模型描述系统数据,在UML中,用类图和对象图进行建模。
- 动态模型描述系统控制结构,在UML中,用动态图进行建模。
- 功能模型描述系统需要实现的功能,在UML中,用用例图进行建模。
理论上,面向对象的分析过程主要包括:寻找类与对象、识别结构(类与类之间的关系)、识别主题、定义属性、建立动态模型、建立功能模型、定义服务,直至最终完成对象模型。
1)对象模型:
面向对象分析的首要工作是建立问题域的对象模型。
建立对象模型的典型步骤主要有以下3个:
- 确定类和关联,对于大型复杂的问题,还要进一步划分出若干个主题。
- 增添类和关联属性,以进一步描述它们。
- 使用适当的继承关系进一步合并和组织类。
2)动态模型
对于仅存储静态数据的系统(例如数据库)来说,动态模型并没有什么意义。但是,开
发交互式系统时,动态模型却起着很重要的作用。
建立动态模型可以分成4个步骤进行。
- 编写典型交互行为的脚本,不遗漏常见的交互行为。
- 从脚本中提取出事件,通过设计用户界面确定触发每个事件的动作对象以及接受事件的目标对象。
- 排列事件发生的次序,确定每个对象可能有的状态及状态间的转换关系,并用事件跟踪图和状态图描绘它们。
- 比较对象的状态图,检查它们之间的一致性,确保事件之间的匹配。
(脚本是指系统在某一个执行期间出现的一系列事件)。
八、面向对象设计
8.1设计原理中的模块独立
模块独立的概念是模块化、抽象、信息隐藏和局部化概念的直接结果。设计软件结构,使得每个模块完成一个相对独立的特定子功能,并且和其他模块之间的关系很简单。
划分模块的一个准则是“高内聚,低耦合”。
耦合是对一个软件结构内不同模块之间互联程度的度量,在软件设计中应该追求尽可能松散耦合系统。
- 耦合度从弱到强可分为4种类型。
- 数据耦合。
- 控制耦合。
- 公共耦合。
- 内容耦合。
- 藕合是影响软件复杂程度的重要因素。应采取设计原则降低耦合。
- 尽量使用数据耦合。
- 少用控制耦合。
- 限制公共藕合的范围。
- 完全不使用内容耦合。
- 内聚从低到高排列有7种类型。
- 偶然内聚。
- 逻辑内聚。
- 时间内聚。
- 过程内聚。
- 通信内聚。
- 顺序内聚。
- 功能内聚。
8.2对象设计中计算环形复杂度
- 计算环形复杂度的方法?
- V(G)=流图中的区域数。
- V(G)=E-N+2,其中E是流图中的边数,N是结点数。
- V(G)=P+1,其中P是流图中判定结点的数目。
8.3对象设计原则中实践项目包设计
项目包的设计实际是软件系统的高层软件结构的设计,也要体现分层设计思想。
- ·controller包位于顶层,直接处理来自客户端浏览器的请求,根据请求调用相应web包这一层的业务逻辑。
- ·web包层实现系统具体的业务逻辑,根据需要请求dao包这一层的相应类完成数据库的访问操作。
- ·dao包实现对数据库的访问功能,一般情况下,会对每个entity类设计一个dao类。
- ·entity包中的类直接与数据库中的表进行映射,一个entity往往对应数据库中的一张关系表。
九、面向对象编程
略
十、软件测试
10.1软件测试的准则
为了能设计出有效的测试方案,软件工程师必须深入理解并正确运用指导软件测试的基本准则。
- 所有测试都应该能追溯到用户需求。
- 应该远在测试开始之前就制定出测试计划。
- 把Pareto原理应用到软件测试中,即80%的错误是20%的模块造成的。
- 应该从“小规模”测试开始,冰逐步进行“大规模”测试。
- 穷举测试是不可能的。
- 为了达到最佳的测试效果,应该由独立的第三方从事测试工作。
10.2软件测试的方法
常规的测试方法主要按以下3个角度进行划分。
1.按是否查看程序内部结构划分 | 1)黑盒测试 | (1)功能测试 |
(2)性能测试 | ||
2)白盒测试 | ||
3)灰盒测试 | ||
2.按是否运行程序划分 | 1)静态测试 | |
2)动态测试 | ||
3.按阶段划分 | 1)单元测试 | (单元测试主要使用白盒测试技术(不能单独使用)) |
2)集成测试 | ||
3)确认测试 | ||
4)系统测试 | ||
5)验收测试 | ||
6)回归测试 |
- 白盒测试
白盒测试把程序看成装在一个透明的白盒子里,测试者完全知道程序的结构和处理算法。
白盒测试法是按着程序内部的逻辑测试程序,检测程序中的主要执行通路是否能按预定要求正确工作,因此,白盒技术又称结构测试。
白盒测试主要的测试方法:
- 逻辑覆盖法。从覆盖源程序语句的详尽程度分析,大致有以下一些不同的覆盖标准:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖,条件组合覆盖以及路径覆盖,这6种覆盖标准按照测试路径覆盖能力由弱到强排列。
- 基本路径测试。
- 循环测试。
- 黑盒测试
黑盒测试也称功能测试,它通过测试检测每个功能是否都能正常使用。在测试中,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测试,它只检查程序功能是否按照软件需求规格说明书的规定正常使用,程序是否能适当地接受输入数据而产生正确的输出信息。黑盒测试着眼于程序外部结构,不考虑内部逻辑结构,主要针对软件界面和软件功能进行测试。
黑盒测试主要的测试方法:
- 等价划分法。
- 边界值分析法。
- 错误推测法。
- 决策表法。
- 因果图法。
十一、软件部署
11.1软件部署的步骤
软件部署的步骤分为:发布、安装、激活、停用、更新、改写、卸载和退役。
十二、参考答案
12.1第六章参考答案
12.1.1练练手
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
B | C | D | B | D | B | A | D | B | FBCE |
12.1.2动动脑
(1)某图书公司欲开发一个基于Web的书籍销售系统,为顾客(Customer)提供在线购买书籍(Books)的功能,同时对公司书籍的库存及销售情况进行管理。
系统的主要功能描述如下:
1)首次使用系统,顾客需要在系统中注册(Register detail)。顾客填写注册信息表要求的信息,包括姓名(name)、收货地址(address)、电子邮箱(email)等,系统生成一个注册码。
2)注册成功的顾客可以登录系统在线购买书籍(Buy books)。购买时可以浏览书籍信息,包括书名(title)、作者(author)、内容简介(introduction)等。如果某种书籍的库存量为0,那么顾客无法查询到该书籍的信息。顾客选择所需购买的书籍及购买数量(quantities) ,若购买数量超过库存量,提示库存不足;若购买数量小于库存量,系统将显示验证界面,要求顾客输入注册码。注册码验证正确后,自动生成订单(Order),否则, 提示验证错误。如果顾客需要,可以选择打印订单(Printorder)。
3)派送人员(Dispatcher)每天早晨从系统中获取当日的派送列表信息(Produce picklist),按照收货地址派送顾客订购的书籍。
4)用于销售的书籍由公司的采购人员(Buyer)进行采购(Reorderbooks)。采购人员每天从系统中获取库存量低于再次订购量的书籍信息,对这些书籍进行再次购买,以保证充足的库存量。新书籍到货时,采购人员向在线销售目录(Catalog)中添加新的书籍信息(Addbooks)。
5)采购人员根据销售情况,对销量较低的书籍设置折扣或促销活动(Promote books)。
6)当新书籍到货时,仓库管理员(Warehouseman)接收书籍,更新库存(Update stock)。
要求:根据描述,画出书籍销售系统的类图和用例图。
【解答】
书籍系统用例图
书籍销售系统类图(只有类名,属性和方法读者根据描述和用例图添加)
(2)现如今线下支付系统可以使用现金(Cash)、移动支付、银行卡(Card)(信用卡 (CreditCard)和储蓄卡(DebitCard))等多种支付方式(PaymentMethod)对物品(Item)账单(Bill)进行支付。
下图是某支付系统的简略类图。请在空白处填上适当的代码。
import java.util. ArrayList;
import java.util.List;
interface PaymentMethod {
public (1) ;
}
// Cash、DebitCard和Item实现略,Item中getPrice( )获取当前物品对象的价格
abstract class Card (2) {
private final String name, num;
public Card(String name, String num)
{
this.name = name; this.num = num;
}
@Oveiride
public String toString ( ) {
return String.format(“%s card[name = %s, num = %s]”,this.getType (), name, num);
}
@Override
public void pay(int cents) {
System.out.println(“Payed " + cents + “ cents using “ + toString( ));
this.executeTransaction(cents);
}
protected abstract String getType( );
protected abstract void executeTransaction(int cents);
}
class CreditCard (3) {
public CreditCard(String name, String num) { (4) ; }
@Override
protected String getType( ) { return "CREDIT"; }
@Override
protected void executeTransaction(int cents) {
System.out.println(cents + " paid using Credit Card. "’);
}
}
class Bill {//包含所有购买商品的账单
private List<Item> items = new ArrayList<Item>();
public void add(Item item)
{ items.add(item); }
public int getTotalPrice( )
{/*计算所有 item 的总价格,代码略*/ }
public void pay(PaymentMethod paymentMethod){//用指定的支付方式完成支付
(5) (getTotalPrice( ));
}
}
public class PaymentSystem {
public void pay( ) {
Bill bill = new Bill( );
Item item1 = new Item("1234",10);
Item item2 = new Item( "5678",40);
bill.add(item1);
bill.add(item2); //将物品添加到账单中
bill.pay(new CreditCard("LI SI", "98765432101")); //信用卡支付
}
public static void Main(String[ ] args) {
(6) = new PaymentSystem( );
payment.pay( );
}
}
【解答】
- void pay(int cents);
- implements PaymentMethod
- extends Card
- super(name, num);
- paymentMethod.pay(getTotalPrice());
- PaymentSystem payment
12.2第七章参考答案
12.2.1练练手
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
D | C | B | B | C | B | C | B | D | C |
11 | 12 | 13 | 14 | 15 | |||||
A | A | D | A | B |
12.2.2动动脑
(1)完成《机票预订系统》的管理员功能模型的建模。
【解答】
(2)根据给出的格式,完成《机票预订系统》需求规格说明书的编写。
【解答】
请参见《机票预订系统需求规格说明书》模板
12.3第八章参考答案
12.3.1练练手
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
B | D | D | B | B | A | BA | B | D | C |
11 | 12 | 13 | 14 | 15 | |||||
B | B | C | A | C | D | A | B | A | C |
12.3.2动动脑
- 完成“机票预订系统”的动态模型设计。
【解答】
以订票用例为例。
(2)完成“机票预订系统”所有的对象设计。
【解答】
注册会员
登录系统
退票
查询航班订单
说明:课堂内不能完成的,可以在设计周内完成。
12.4第九章参考答案
12.4.1练练手
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
D | C | A | B | A | A | D | C | A | D |
11 | 12 | 13 | 14 | 15 | |||||
C | D | A | B | D |
12.4.2动动脑
- 搭建Spring Boot框架,并配置Maven插件。
【解答】
请参考教材中视频。
- 在Spring Boot中开发并实现“机票预订系统”的主要功能。
【略】
请参考教材实现代码。
12.5第十章参考答案
12.5.1练练手
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
D | AC | A | C | A | C | C | C | A | A |
11 | 12 | 13 | 14 | 15 | |||||
A | D | A | B | C |
12.5.2动动脑
(1).使用黑盒测试方法为注册会员用例设计测试用例。
【解答】
以用户名为例
输入条件 | 有效等价类 | 无效等价类 |
用户名字符个数 | 6~10(1) | 0(2)<6(3)>10(4) |
用户名字符组成 | 字母(5)数字(6)下划线(7) | 非字母数字下划线(8) |
第一个字符 | 字母(9) | 非字母(10) |
测试用例设计
软件/项目名称 | 机票预订系统 | 软件版本 | 1.0 | |||||
功能模块名称 | user类之Register() | 编制人 | 小徐 | |||||
测试用例ID | Book_user_Register | 测试用例名称 | Register_01 | |||||
用例入库者 | 小徐 | 入库时间 | XXX | |||||
用例更新者 | 小徐 | 更新时间 | XXX | |||||
测试功能点 | 旅客注册 | |||||||
测试目的 | 测试用户名可能出现的各种逻辑 | |||||||
测试类型 | 单元测试 | |||||||
预置条件 | 在数据库中保存信息 | 特殊规程说明 | 有充足的提示 | |||||
参考信息 | 《机票预订系统需求规格说明书》 | |||||||
序号 | 操作描述 | 输入测试数据 | 预期结果 | 实际结果 | 返回状态 | |||
Test1 | 输入用户名 | abcd_12 | 注册成功 | 注册成功 | 登录界面 | |||
Test2 | 输入用户名 | 空 | 空,重新输入 | 注册失败 | 注册界面 | |||
Test3 | 输入用户名 | ab_12 | 短,重新输入 | 注册失败 | 注册界面 | |||
Test4 | 输入用户名 | abcdef_1245 | 长,重新输入 | 注册失败 | 注册界面 | |||
Test5 | 输入用户名 | 12_abcd | 数字开头重新输入 | 注册失败 | 注册界面 | |||
Test6 | 输入用户名 | abcd&12 | 非法字符重新输入 | 注册失败 | 注册界面 | |||
测试人 | 小李 | 开发人员 | 小李 | 负责人 | 项目经理 | |||
(2)使用基本路径测试法为订票算法设计测试用例。
【解答】
订票状态图
测试用例设计
路径编号 | 起始状态 | 事件或条件 | 输入 | 结束状态 |
a | V1 | find(air),检索航班成功 | 输入检索条件 | V2 |
b | V1 | !find(air),检索航班失败 | 输入检索条件 | V1 |
c | V2 | 点击“订票”按钮 | 鼠标操作 | V3 |
d | V3 | !login(user),登录失败 | 输入用户名和密码 | V3 |
e | V3 | login(user),登录成功 | 输入用户名和密码 | V4 |
f | V4 | 错误的信息 | 填写订票信息 | V4 |
g | V4 | 正确的信息 | 填写订票信息 | V5 |
h | V5 | 订票成功 | 付款 | V6 |
i | V5 | 订票失败 | 不付款 | V7 |
j | V5 | 再次订票 | 鼠标操作 | V1 |
12.6第十一章参考答案
12.6.1练练手
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
D | A | B | C | C | A | C | B | B | A |
12.6.2动动脑
- 完成“机票预订系统”的《软件部署计划》。
【解答】
按照11.2软件部署计划做参考。
- 就校园某应用系统,分析其部署方案及特点。
【解答】
- 以校园网为例:
- 校园网的部署拥有先进的设计思想、网络结构以及网络设备。
- 在学校建筑施工期间考虑学校条件和校园地形特性,尽量减少浪费。
- 校园网具有一定灵活性,学校各个教学场所都具有快速的信息传输。
- 拥有一定的安全性,确保内部信息不泄露。
以下图为参考