当前位置: 首页 > news >正文

第十章 软件工程

第十章 软件工程

软件工程是建立在这样一个基础上,即利用合理工程方法和原则来获得在真实机器上工作的可靠软件

10.1 软件生命周期

10.1.1 开发过程模型

开发过程包括4个阶段:分析、设计、实现和测试

最常见的两种开发过程模型

  • 瀑布模型
  • 增量模型(迭代模型)

瀑布模型

瀑布模型:开发过程只有一个方向的流动,这意味着前一个阶段不结束,后一个阶段不能开始

  • 优点:在下一个阶段开始前每个阶段已经完成
  • 缺点:如果过程中一部分有问题,必须检查整个过程

增量模型

增量模型(迭代):软件的开发要经历一系列步骤。开发者首先完成整个系统的一个简化版本,这个版本表示了整个系统,但不包括具体的细节

第二个版本中,更多的细节被加入,而有些还没完成,然后再次测试系统。如果这时有问题,开发者知道问题出于新功能。直到现有系统工作正确后,才增加新的功能,这个过程一直继续下去,直到所有功能全部被加入

10.2 分析阶段

分析阶段:整个开发过程始于分析阶段,这个阶段生成规格说明文档,这个文档说了软件要做什么,而没有说明如何去做

分析阶段的两种独立方法

  • 面向过程分析:依赖于实现阶段使用过程编程语言
  • 面向对象分析:依赖于实现阶段使用面向对象编程语言

10.2.1 面向过程分析

面向过程分析:如果实现阶段使用过程式语言,那么面向过程分析(也称为结构化分析或经典分析)就是分析阶段使用的方法。

这种情况下的规格说明有使用多种建模工具

  • 数据流图
  • 实体关系图(在第12章再讨论)
  • 状态图

数据流图

状态图

10.2.2 面向对象分析

面向对象分析:如果实现阶段使用面向对象语言,那么面向对象分析就是分析阶段使用的方法。

10.3 设计阶段

设计阶段定义系统如何完成在分析阶段所定义的需求。在设计阶段,系统所有的组成部分都被定义

面向过程设计中,既要设计过程,也要设计数据,整个系统被分解成一组过程或模块

结构图:说明模块间关系的常用工具

10.3.1 面向过程设计

模块化:将大项目分解成较小的部分,以便能容易理解和处理,当系统被分解成模块时,主要关心两点:耦合和内聚

耦合:是对两个模块相互绑定紧密程度的度量,越紧耦合的模块,独立性越差,所以设计时,尽量松散耦合

  • 松散耦合的模块更可能被重用
  • 松散耦合的模块不容易在相关模块中产生错误
  • 系统需要修改时,松散耦合只需要修改一部分模块,而不影响其他模块

软件系统中模块间的耦合必须最小化

内聚:是程序中处理过程相关紧密度的度量

软件系统模块间的内聚必须最大化

高内聚松耦合

10.3.2 面向对象设计

面向对象设计:在面向对象设计中,设计阶段通过详细描述类的细节来继续

类是由一组变量(属性)和一组方法组成,面向对象设计阶段列出这些属性和方法细节

10.4 实现阶段

10.4.1 语言的选择

10.4.2 软件质量

10.5 测试阶段

测试阶段的目的就是发现错误(bug),良好的测试策略能发现最多的错误

测试的两种方式

  • 白盒测试
  • 黑盒测试

10.5.1 白盒测试

白盒测试(或玻璃盒测试)是基于知道软件内部结构的。测试的目的是检查软件所有部分是否全部设计出来,白盒测试假定测试者知道有关软件的一切,程序就像一个玻璃盒子,其中的每件事情都是可见的

白盒测试的4个标准

  • 每个模块中的所有独立的路径至少被测试过一次
  • 所有的判断结构(两路或多路的)每个分支都被测试
  • 每个循环都被测试
  • 所有数据结构都被测试

基本路径测试是一种软件中每条语句至少被执行一次的方法

控制结构测试

10.5.2 黑盒测试

黑盒测试:在不知道程序的内部也不知道程序是怎么工作的情况下测试程序,程序就像一个看不见内部的黑盒,黑盒测试按照软件应该完成的功能来测试

几种黑盒测试方法

  • 穷尽测试:最好的黑盒测试方法就是输入域中的所有可能的值去测试软件
  • 随机测试:选择输入域的值的子集来测试,子集的选择方式是非常重要的
    黑盒测试:在不知道程序的内部也不知道程序是怎么工作的情况下测试程序,程序就像一个看不见内部的黑盒,黑盒测试按照软件应该完成的功能来测试

几种黑盒测试方法

  • 穷尽测试:最好的黑盒测试方法就是输入域中的所有可能的值去测试软件
  • 随机测试:选择输入域的值的子集来测试,子集的选择方式是非常重要的
  • 边界测试

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MongoDB教程(十八):MongoDB MapReduce
  • 对递归的一些理解。力扣206题:翻转链表
  • 细说网络安全五家龙头企业,你去过哪一家?
  • SkyWalking入门搭建【apache-skywalking-apm-10.0.0】
  • 二、QGroundControl开发环境搭建
  • Linux下如何安装配置Zsh Shell
  • 鸿蒙之Grid实现拖动自定义排序特效
  • 决策树(Decision Tree)
  • 培训第十三天(DNS逆向解析与主从服务、ntp时间服务器)
  • 【接口自动化_08课_Pytest+Yaml+Allure框架】
  • 从统计学、到机器学习和ChatGPT
  • 数据结构第三讲:单链表的实现
  • GitLab添加TortoiseGIT生成SSH Key
  • Java 中如何执行命令行方法
  • 初识godot游戏引擎并安装
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • AWS实战 - 利用IAM对S3做访问控制
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • Docker入门(二) - Dockerfile
  • eclipse(luna)创建web工程
  • es的写入过程
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • IDEA常用插件整理
  • input实现文字超出省略号功能
  • React的组件模式
  • Swift 中的尾递归和蹦床
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 一个SAP顾问在美国的这些年
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • #laravel 通过手动安装依赖PHPExcel#
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #NOIP 2014#Day.2 T3 解方程
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (35)远程识别(又称无人机识别)(二)
  • (分布式缓存)Redis分片集群
  • (附源码)springboot教学评价 毕业设计 641310
  • (四)js前端开发中设计模式之工厂方法模式
  • (转)c++ std::pair 与 std::make
  • (转)一些感悟
  • ****Linux下Mysql的安装和配置
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .net core webapi 大文件上传到wwwroot文件夹
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .Net Redis的秒杀Dome和异步执行
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET中GET与SET的用法
  • ::什么意思
  • @Autowired 和 @Resource 区别的补充说明与示例
  • @SentinelResource详解
  • [ C++ ] 类和对象( 下 )
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [240903] Qwen2-VL: 更清晰地看世界 | Elasticsearch 再次拥抱开源!