跳转到内容

2.3 软件工程

掌握软件架构、需求工程、软件设计、软件实现等软件工程的核心概念和方法。

核心问题:能否达到架构级的软件复用

软件架构风格

风格名称说明举例
数据流风格批处理序列、管道/过滤器流水线作业
调用/返回风格主程序/子程序、数据抽象和面向对象、层次结构公司组织架构
独立构件风格进程通信、事件驱动的系统电梯系统
虚拟机风格解释器、基于规则的系统脚本解释器
仓库风格数据库系统、黑板系统、超文本系统数据库

架构评估

  • 基于调查问卷(或检查表)的方式
  • 基于场景的方式(最常用)
  • 基于度量的方式

基于场景的方式包括

  1. 架构权衡分析法(ATAM)
  2. 软件架构分析法(SAAM)
  3. 成本效益分析法
公式 ★★★★★

软件架构五风格

数据流 + 调用返回 + 独立构件 + 虚拟机 + 仓库

需求类型含义记忆
常规需求用户认为系统应该做到的功能或性能,实现越多用户会越满意满意
期望需求用户想当然认为系统应具备的功能或性能,未实现会让用户不满意不满意
意外需求用户要求范围外的功能,实现用户会更高兴,但不实现也不影响购买决策惊喜

需求获取方法: 用户访谈、问卷调查、采样、会议讨论法、界面原型法、情节串联板、联合需求计划等

好的需求特性:无二义性、完整性、一致性、可测试性、确定性、可跟踪性、正确性、必要性

结构化分析(SA方法)

  • 核心:数据字典
  • 三个层次的模型
    • 行为模型:状态转换图(STD)
    • 功能模型:数据流图(DFD)
    • 数据模型:实体联系图(E-R图)

面向对象分析(OOA方法)

  • 基本任务:运用面向对象方法,对问题域进行分析和理解,找出所需的类和对象
  • OOA模型
    • 用例模型(分析阶段的核心工作)
    • 分析模型(静态模型+动态模型)

结构化设计(SD)

  • 基本思想:将软件设计成由相对独立且具有单一功能的模块组成的结构
  • 两个阶段:概要设计、详细设计
  • 基本原则:高内聚,低耦合
  • 内聚:模块内部各成分之间的联系程度
  • 耦合:模块之间联系的程度

面向对象设计(OOD)

  • 基本思想:抽象、封装和可扩展性
  • 可扩展性:通过继承和多态来实现
  • 主要任务:对类和对象进行设计(最重要的组成部分)
  • 核心问题:如何同时提高软件的可维护性和可复用性

设计模式

分类方式类型说明
处理范围不同类模式处理类和子类之间的关系(静态关系)
对象模式处理对象之间的关系(动态性)
用途不同创建型模式用于创建对象(工厂方法、抽象工厂、原型、单例、建造者)
结构型模式处理类或对象的组合(适配器、桥接、组合、装饰、外观、享元、代理)
行为型模式描述类或对象的交互以及职责的分配(职责链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法、访问者)
公式 ★★★★★

SD设计原则

高内聚,低耦合

软件编码

  • 程序设计风格:源程序文档化、数据说明、语句结构、输入/输出方法
  • 程序复杂性度量:定量度量软件的性质
  • 编码效率:程序效率、算法效率、存储效率、I/O效率

软件测试

测试方法分类说明
静态测试-被测试程序不在机器上运行,采用人工检测和计算机辅助静态分析手段检测
对文档的静态测试以检查单的形式进行
对代码的静态测试桌前检查、代码走查、代码审查、静态分析工具等
动态测试白盒测试(结构测试)测试人员对软件内部结构和实现细节有详细了解,检查程序内部逻辑和结构
黑盒测试(功能测试)测试人员不关心软件内部的实现细节,只关注程序的输入和输出结果

架构风格例子

  • 管道/过滤器:像流水线,每个工人(过滤器)完成特定任务,原料(数据)在流水线(管道)中流动
  • 层次结构:像公司组织架构,董事长→总经理→部门经理→员工,层层调用
  • 事件驱动:像电梯系统,按下按钮(触发事件)→系统响应→执行相应操作

需求层次例子

  • 常规需求:手机能打电话、发短信
  • 期望需求:手机电池能用一天、屏幕清晰
  • 意外需求:手机有无线充电功能(用户没要求但很惊喜)

高内聚低耦合例子

  • 高内聚:一个模块只做一件事,如”用户登录模块”只负责登录,不负责注册、密码修改等
  • 低耦合:模块间依赖尽量少,如”订单模块”只需要知道”用户ID”,不需要知道用户的详细信息
知识点关键要点记忆口诀
架构五风格数据流、调用返回、独立构件、虚拟机、仓库五风格
需求三层次常规(满意)、期望(不满意)、意外(惊喜)三层次
SA三模型STD(行为)、DFD(功能)、E-R图(数据)三模型
SD原则高内聚,低耦合原则
OOD三思想抽象、封装、可扩展性(继承+多态)三思想
设计模式三分类创建型、结构型、行为型三分类
测试两方法静态(文档+代码)、动态(白盒+黑盒)两方法
练习

某公司要开发一个语音识别系统,该系统需要一系列的处理构件(如:采样、分帧、去噪、特征提取、解码等),数据在这些构件之间顺序流动,且上一个构件的输出直接作为下一个构件的输入。这种应用场景最适合采用的软件架构风格是( )

  • A A. 仓库风格 (Repository)
  • B B. 管道/过滤器风格 (Pipe and Filter)
  • C C. 事件驱动风格 (Event-based)
  • D D. 虚拟机风格 (Virtual Machine)
练习

在模块化设计中,如果模块A直接操作模块B内部的私有数据(如直接修改B的全局变量或内部表),则这两个模块之间的耦合类型属于( )。这是最差的一种耦合,应尽量避免。

  • A A. 数据耦合 (Data Coupling)
  • B B. 控制耦合 (Control Coupling)
  • C C. 内容耦合 (Content Coupling)
  • D D. 外部耦合 (External Coupling)
练习

某开发团队在设计一个画图软件时,要求能够动态地切换不同的画笔形状(如圆形笔、方形笔、毛笔)。为了保证系统的扩展性(未来可以轻松添加新笔型而不修改现有代码),最适宜采用的设计模式是( )

  • A A. 策略模式 (Strategy)
  • B B. 单例模式 (Singleton)
  • C C. 适配器模式 (Adapter)
  • D D. 观察者模式 (Observer)
练习

关于软件测试,以下说法正确的是( )

  • A A. 白盒测试主要依据需求规格说明书,检查功能是否实现
  • B B. 只要进行了充分的黑盒测试,就没有必要再进行白盒测试
  • C C. 静态测试是指不运行被测程序,仅通过检查文档或代码来发现错误
  • D D. 回归测试只能在系统维护阶段进行
  1. 软件架构五风格:数据流、调用返回、独立构件、虚拟机、仓库
  2. 需求三层次:常规需求、期望需求、意外需求
  3. SA三模型:STD、DFD、E-R图
  4. SD原则:高内聚,低耦合
  5. OOD三思想:抽象、封装、可扩展性
  6. 设计模式三分类:创建型、结构型、行为型
  7. 测试两方法:静态测试、动态测试(白盒+黑盒)
💬 讨论区