软件工程知识点整理

软件工程(Software Engineering)

玛格丽特·汉密尔顿(Margaret Hamilton)

美国工程师帮助NASA在阿波罗计划中避免严重问题

玛格丽特·汉密尔顿是软件工程一词的创造者软件工程是为了经济地获得可靠的能在实际机器上高效运行的软件而建立和使用的良好工程原则软件工程的三要素为方法工具和过程

软件工程是一门综合性交叉学科涉及数学计算机科学管理科学和工程科学等着重于建造软件系统首要目标是生产高质量的软件产品而计算机科学着重于原理和理论

软件的定义见计算机科学常识整理的软件一节软件开发历经如下时代和软件生产方式个体手工的程序设计时代作坊式小团体的程序系统时代工程化的软件工程时代

软件文档(Software Documentation)包括软件需求文档设计文档测试文档和用户手册等

软件文档在软件工程中的作用如下提高软件开发过程的能见度提高软件开发效率作为开发人员阶段工作成果和结束标志记录开发过程的有关信息便于使用和维护提供软件运行维护和培训的相关资料便于用户了解软件功能性能

软件危机(Software Crisis)指开发软件所需高成本和产品的低质量之间的尖锐矛盾是计算机软件开发使用与维护过程中遇到的一系列严重问题和难题要点如下不能符合用户的实际需求开发的效率低产品的质量差开发成本和进度难以估算可维护性差开发文档资料不完整价格昂贵

软件开发管理困难复杂开发技术和开发工具落后等是软件危机产生的原因

人月(Man-Month)

软件开发需要软件工具硬件工具和人其中人是最基本的资源人月指一个人在一个月内所能完成的工作量

人月是危险和带有欺骗性的神话因为它暗示人员数量和时间是可以相互替换的人力和时间并不呈现线性关系增加软件项目的人手所付出的代价有三个方面任务重新分配造成的混乱和额外工作量新人员的培训额外的相互沟通

向进度落后的项目追加人手只会让进度更落后这称为布鲁克斯法则(Brooks' Law)

概念完整性(Conceptual Integrity)

概念完整性指对于一个领域了解该领域的所有对象及它们的关系即人的认识的完整性概念完整性是系统设计中最重要的考虑因素为了获得概念完整性设计必须由一个人或者具有共识的小型团队来完成如果系统必须保有概念上的整体性那么就必须有人来控制这些概念为此需要专制

体系结构设计实现物理实现的许多工作可以并发进行软件和硬件设计同样可以并行

第二系统效应(The Second-system Effect)指就一个人所做过的设计而言第二个系统往往存在过度设计的倾向

计算机辅助软件工程(CASE; Computer Aided Software Engineering)

使用计算机及相关软件工具辅助软件开发维护管理等过程中各项活动的实施以确保这些活动能高效率高质量地进行CASE已被证明能加快开发速度提高生产率和企业利润进而增强企业竞争力

软件开发环境的集成机制有如下几种

  • 数据集成统一的数据模式和数据接口规范
  • 界面集成统一的界面风格
  • 控制集成支持环境中各个工具或开发活动间的通信切换调度和协同工作
  • 过程集成将多种开发方法过程模型及其相关工具集成
  • 平台集成在不同的硬件和系统软件之上构件用户界面一致的平台

软件生存周期(SLC; Software Life Cycle)

即软件开发的路线图又称软件过程(Software Process)软件生存周期的划分如下

软件规模种类开发方式和环境等都影响软件生存周期的划分在划分软件周期时应当遵循的基本原则是从时间角度对软件的开发和维护这一复杂问题进行分解各阶段的任务应尽可能相对独立同一阶段任务的性质尽可能相同从而降低开发复杂度

随生存周期的推移软件缺陷修复所需的费用越来越高

能力成熟度模型(CMM; Capability Maturity Model)

CMM用于评价软件机构的软件过程能力成熟度关键过程域(KPA; Key Process Area)指达到CMM等级所必须满足的项目CMM成熟度框架等级及每个等级对应的KPA如下

  1. 初始级(Initial)过程往往是混乱的成功源于英雄主义
  2. 可重复级(Repeatable)建立基本项目管理以跟踪成本进度和功能制定必要的过程纪律
    • 需求管理
    • 软件项目计划跟踪和监督
    • 软件分包合同管理
    • 软件质量保证和配置管理
  3. 已定义级(Defined)将管理和工程活动文档化标准化
    • 组织级过程焦点定义
    • 集成软件管理
    • 软件产品工程
    • 组件协调
    • 同行评审
    • 培训大纲
  4. 已管理级(Managed)对软件过程有定量的理解和控制过程可预测
    • 定量过程管理
    • 软件质量管理
  5. 优化级(Optimizing)过程的量化反馈和先进的新思想新技术使过程持续改进
    • 缺陷预防
    • 技术更新管理
    • 过程更改管理

软件过程模型(Software Process Model)

软件过程模型是将软件生存周期进行合理的整合后形成的开发方式

瀑布模型(Waterfall Model)

瀑布模型将软件开发各阶段线性顺序联接接受上一阶段的结果作为本阶段的输入利用这一输入实施本阶段应完成的活动生成相应文档对本阶段的工作进行评审后将本阶段的结果输出传递给下一阶段

若错误由前一阶段引起常常需要回到前一阶段称为瀑布的倒流

瀑布模型灵活要求需求在最初始阶段就要完整而明确一般适用于功能性能明确完整无重大变化的软件系统的开发如操作系统编译系统数据库管理系统等应用有一定的局限性

演化模型(Evolutionary Model)

原型(Prototype)是软件的一个早期可运行的版本反映最终系统的重要特征演化模型从构造初始原型出发逐步演化为最终软件产品

适用于对软件需求缺乏准确认识的情况或项目组成员不能很好地交流或通信的情况典型的演化模型如下

  • 增量模型融合了瀑布模型的基本成分(即重复的利用)和演化模型的迭代特征强调每一个增量都发布一个可运行的产品能有计划地管理技术风险(如早期增量版本中避免采用尚未成熟的技术)
  • 原型模型快速构建原型交付客户试用收集反馈意见并改进原型
  • 螺旋模型在瀑布模型和增量模型的基础上增加了风险分析活动指引软件项目开发沿着螺线自内向外旋转每旋转一圈表示开发出一个更为完善的新软件版本

喷泉模型(Fountain Model)

喷泉模型是支持面向对象开发的过程模型此外的一般是面向过程的模型开发活动迭代重复进行开发活动间无间隙不存在明显边界

系统工程(System Engineering)

考虑完整的软硬件解决方案而非单一软件系统工程追求最优化其任务如下

  • 识别用户的要求简化的压缩的需求分析
  • 可行性分析(Feasibility Analysis)用最小的代价确定该软件项目是否能够开发是否值得去开发
    • 经济可行性进行开发成本的估算以及了解取得效益的评估
    • 技术可行性通常包括风险分析资源分析和技术分析
    • 法律(社会)可行性分析开发的项目是否存在任何侵犯妨碍等责任问题要开发项目目的运行方式在用户组织内是否可行现有管理制度人员素质操作方式是否可行
  • 系统建模和模拟建立硬软件系统模型人机接口模型和数据模型等建模是软件开发中实现映射的基本手段系统物理模型通常可使用系统流程图描述
  • 成本估算和进度安排
  • 生成系统规格说明

需求工程(RE; Requirement Engineering)

开发人员准确地理解用户的需求进行细致的调查分析将用户非形式的需求陈述转化成完整的需求定义最终再转化至相应的需求规格说明书即回答系统必须做什么是软件工程中的关键阶段需求工程可细分为如下阶段

  • 需求获取与用户交流对现有系统进行观察及对任务进行分析捕获和修订用户的需求
  • 需求分析分析需求间关系以检验需求的一致性重叠和遗漏的情况
  • 系统建模建立概念模型以对需求进行抽象描述尽可能多地捕获现实世界的语义
  • 需求规约需求分析的输出即软件产品的概念模型并对此制定合适的验收标准
  • 需求验证检验系统是否能反应用户意愿
  • 需求管理支持系统的需求演进如需求变化和可跟踪问题

需求的发现方式如下

  • 自悟作为用户提出问题适用于当开发者无法与用户进行直接交流时
  • 交流询问用户想要的功能需要控制用户提出合理需求
  • 观察观察用户执行现行的任务和过程或观察如何操作与期望系统有关的现有系统了解运行环境但用户可能抵触这一观察且会让用户误以为开发者已经熟悉了业务
  • 小组会举行客户和开发人员的联席会议与客户代表共同开发需求
  • 提炼可复用的技术文档提取出未来可能会用到的信息适用于已有部分需求文档的烂尾项目

除功能需求外还可能有如下几类非功能需求

  • 性能需求并发访问数等
  • 质量属性对非法操作的容错等
  • 对外接口支持第三方插件等
  • 设计约束运行平台等与其他非功能需求不同设计约束是必须予以满足的且对项目规划所需的附加成本和工作产生直接影响

非功能需求必须依附于功能需求而存在

设计工程(Design Engineering)

定义软件的实现细节以满足用户需求即研究如何实现软件设计工程的任务如下数据/类设计体系结构设计接口设计部件级设计

软件的设计原则如下抽象逐步求精模块化信息隐藏功能独立

模块化设计(Modular Design)是软件设计原则之一即把软件划分为较小的相互独立的但又互相关联的部件这一部件称之为模块(Module)划分模块时模块的作用范围(Scope of Effect)应在其控制范围(Scope of Control)之内功能独立性全面指导模块的划分

模块的功能独立性可以由两个指标衡量即内聚度与耦合度

内聚(Cohesion)度是模块内部各元素彼此结合紧密程度的度量模块的内聚性由低至高可分为如下七种类型

  • 偶然内聚又称巧合内聚仅相同程序代码独立出来而建立的模块
  • 逻辑内聚完成一组逻辑相关任务
  • 时间内聚模块中的多个任务必须在一段时间内先后执行而无明确的过程约束
  • 过程内聚模块中的多个任务必须按指定过程执行
  • 通信内聚模块中所有处理元素都集中在某个数据结构的一块区域中
  • 顺序内聚完成必须顺序执行的多个功能
  • 功能内聚模块中各部分都是为完成一项具体功能而协同工作不可分割(模块完成单个功能)

耦合(Coupling)度是模块间相对独立性的度量模块间的耦合性由高至低可分为如下七种类型

  • 内容耦合可以直接访问另一模块的内部数据或内部功能
  • 公共耦合可与其他模块共同访问某些公共数据元素
  • 外部耦合与其他模块遵循同样的外部约束(如通信协议数据格式等)
  • 控制耦合与其他模块的交互参数包含控制信息即能影响另一模块的执行逻辑
  • 标记耦合模块间传递特定数据结构
  • 数据耦合模块间仅传递简单数据
  • 非直接耦合模块可相对独立工作

良好的设计策略要求降低耦合度提高内聚度

概要设计(Overall Design)

又称总体设计将需求分析得到的系统扩展用例图转换为软件结构和数据结构

概要设计是详细设计的基础

概要设计阶段的基本任务如下设计软件系统结构数据结构及数据库设计编写概要设计文档评审

详细设计(Detailed Design)

设计每个模块实现算法所需的内部结构等

详细设计阶段的基本任务如下为模块进行详细的算法设计为模块内的数据结构进行设计对数据库进行物理设计代码设计输入输出格式设计人机交互设计等编写详细设计文档评审

详细设计的描述方法见结构化程序设计

人机交互界面(HCI; Human-Computer Interface)

软件工程人机交互界面狭义地指软件的人性化操作界面

人机交互界面应该具备如下特性

  • 可使用性最关键的特性
  • 灵活性用户可根据需要定制和修改界面
  • 可靠性无故障使用
  • 可扩展性

设计人机交互界面需要考虑如下因素系统响应时间用户求助机制错误信息处理命令交互方式

人机交互界面设计的三条黄金原则总结如下让用户拥有控制权减少用户的记忆负担保持界面一致

容错(Fault Tolerance)

系统在部分组件发生故障时仍能正常运作的能力容错的四种手段如下

  • 结构冗余包括静态冗余动态冗余和混合冗余
  • 信息冗余为检测或纠正信息在运算或传输中的错误所外加的信息
  • 时间冗余重复执行指令或程序来消除瞬时错误的影响
  • 冗余附加技术实现上述冗余技术所需的资源和技术

编码(Coding)

良好的编码原则如下编写易于修改和维护的代码编写易于测试的代码编写详细的程序文档即文档化采用统一的标准和约定降低程序的复杂性即标准化分离功能独立的代码块形成新的模块即模块化

编码风格(Coding Style)即程序开发人员所编写源代码的书写风格良好的编码风格能在一定程度上弥补语言存在的缺陷而如果不注意风格就很难写出高质量的程序尤其当多个程序员合作编写一个很大的程序时需要强调良好而一致的编码风格以便相互通讯减少因不协调而引起的问题

编码风格可根据花括号位置分为如下两类

  • Allmans花括号独占一行
  • Kernighan左花括号居于行尾

软件测试(Software Testing)

软件测试是确保程序按期望运行的工序即验证程序正常工作软件测试的目的是发现软件的错误力求设计最能暴露错误的测试方案

早期的软件测试与软件调试概念混淆且都由程序员完成但从心理学的角度而言由程序的编写者自己进行测试是不恰当的现在软件调试(Software Debugging)与软件测试有明显的差异即软件调试的目的是定位软件错误并纠正错误

测试用例(Test Case)是为了进行有效的测试而设计的输入数据和预期的输出结果数据一个好的测试用例能够发现至今尚未发现的错误穷举测试是不现实的

软件测试的策略如下

  • 单元测试(Unit Testing)又称模块测试着重对软件构件或模块进行测试可并行进行其中使用的桩模块(Test Stub)代替被测试的模块所调用的模块而不是软件产品的组成的部分
  • 集成测试(Integration Testing)又称组装测试将程序模块组装为软件系统后进行测试
  • 确认测试(Acceptance Testing)又称验收测试检查软件功能和性能是否与需求规格说明书的指标相符确认整个软件是用户所需的一般运用黑盒测试方法由专门测试人员和用户参与
    • Alpha粗糙错误很多通常只在公司内部测试用户操作经由开发者指导
    • Beta软件接近完成可能向公众发布以帮助发现问题开发者通常不在现场
  • 系统测试(System Testing)软件通常受制于计算机系统的其他元素需要测试是否能与计算机系统协调工作
  • 压力测试(Stress Testing)又称强度测试需要在非正常数量频率或容量的方式下执行
  • 性能测试(Performance Testing)测试运行性能对实时系统和嵌入式系统尤为重要
  • 安全保密性测试(Security Testing)

V模型(V-Model)展示软件开发各阶段与测试策略各阶段的对应关系内容如下

黑盒测试(Black-Box Testing)

黑盒测试不考虑内部结构或运作只凭键入特定输入得到一定输出的方式来测试黑盒测试有如下方法

  • 等价类划分(ECP; Equivalence Class Partitioning)等价类(Equivalence Class)即输入域的某个子集同子集的输入能引发相同的情况从等价类中选择的用例具有代表性等价类分为有效等价类(Valid Equivalence Class)和无效等价类(Invalid Equivalence Class)分别验证程序是否实现了规格说明中规定的功能以及是否实现了对不合理的非法输入处理的功能
  • 边界值分析(Boundary-Value Analysis)通常是等价类划分的一种补充专门挑选位于输入或输出边界值附近的数据作为测试用例
  • 比较测试(Comparison Testing)又称背对背测试(Back-to-Back Testing)通常由两支开发队伍根据需求规格说明开发两个软件版本然后用相同的用例分别测试适用于高可靠性要求的软件如航空航天控制软件核电厂控制软件等
  • 猜测(Guessing)根据直觉和经验推测存在的错误
  • 因果图(Cause-Effect Graph)分析输出条件对输入条件的依赖关系是选取高效测试用例的方法

白盒测试(White-Box Testing)

白盒测试又称玻璃盒测试(Glass-Box Testing)根据内部逻辑结构设计测试用例条件(Condition)指程序中不可分解的逻辑运算式判断(Decision)指由条件组成的逻辑运算式白盒测试有如下方法

  • 逻辑覆盖测试(Logic Coverage Testing)
    • 语句覆盖(Statement Coverage)每个可执行语句都至少执行一次
    • 条件覆盖(Condition Coverage)每个判断的每个条件的所有可能结果都至少出现一次
    • 判断覆盖(Decision Coverage)又称分支覆盖(Branch Coverage)每个进入点和每个结束点都至少执行一次每个判断的分支都至少经过一次
    • 条件/判断覆盖(Condition/Decision Coverage)每个进入点和每个结束点都至少执行一次每个判断的每个条件的所有可能结果都至少出现一次每个判断的分支都至少经过一次
    • 修正的条件/判断覆盖(MC/DC; Modified Condition/Decision Coverage)每个进入点和每个结束点都至少执行一次每个判断的每个条件的所有可能结果都至少出现一次每个判断的分支都至少经过一次而每一个条件都可以独立地影响判断的结果
    • 路径覆盖(Path Coverage)每条路径都至少经过一次
  • 基本路径测试(Basis Path Testing)
  • 数据流测试(Data Flow Testing)
  • 变异测试(Mutation Testing)将源程序注入错误即变异为变体(Mutant)然后于变体上执行测试用例验证测试用例是否可以发现注入的错误

版本控制(Version Control)

版本控制追踪工程从诞生一直到定案的过程

大型工程代码通常存储于一个中心服务器上称为仓库(Repository)开发者编辑代码添加功能并测试完毕后放回仓库的过程称为提交(Commit)代码的主(Master)版本应该总是编译正常且漏洞尽可能少

软件缺陷预测(SDP; Software Defect Prediction)

软件缺陷预测是一种能够有效地挖掘软件中尚未被发现的潜在缺陷及其分布情况的技术

根据是否与软件生命周期有关缺陷预测可分为静态预测和动态预测后者预测缺陷分布随软件生命周期的变化情况缺陷预测的方法策略又可分为如下几类

  • 项目内缺陷预测(WPDP; Within-Project Defect Prediction)利用项目中足够多的已标记数据来训练一个稳定的分类模型然后基于该模型来预测同一项目中新的模块或实例中的缺陷倾向性
  • 跨项目缺陷预测(CPDP; Cross-Project Defect Prediction)利用其他项目(即源项目)中已经搜集的数据集为目标项目构建缺陷预测模型
  • 异构缺陷预测(HDP; Heterogeneous Defect Prediction)源项目与目标项目特征异构

通常缺陷预测模型的构建方法有如下两种基于机器学习的方法基于统计学的方法

代码度量元(Code Metrics)是构建高质量缺陷预测模型的关键因此代码度量元的设计是软件缺陷预测的核心问题常见的代码度量元如下

  • 代码行数(LOC; Lines of Code)最早的代码度量元过于简单而难以合理地度量软件系统的复杂性
  • Halstead通过统计程序内操作符和操作数的数量来度量代码的阅读难度其假设是代码的阅读难度越高则含有缺陷的可能性也越高
  • McCabe其假设是程序的控制流复杂度越高则含有缺陷的可能性也越高
  • C&K综合考虑面向对象程序中的继承耦合性和内聚性等特征是适用于面向对象程序的度量元

在软件缺陷预测问题中真正含有缺陷的模块是少数缺陷服从帕累托原则(Pareto Principle)80%的缺陷存在于20%的模块中因此类别不平衡问题是软件缺陷预测中普遍存在的问题

即时(JIT; Just-in-Time)软件缺陷预测是指预测开发者每次提交的代码变更是否存在缺陷的技术其中代码变更可分为缺陷变更和非缺陷变更

在即时软件缺陷预测领域主要是基于变更特征(如修改文件数量等)排序的方法即对新提交的变更排序对开发者审查任务进行调度使开发者在审查一定量代码情况下找到更多缺陷即工作量感知(Effor-Aware)即时缺陷预测工作量感知指标是指当开发者根据预测模型的预测结果进行代码审查时审查一定数量的代码(即工作量)所能检查到的缺陷数量或者比例通常将代码审查工作量设置为所有变更修改代码总行的20%

软件维护(Software Maintenance)

软件维护是软件生存周期中持续时长最长所花费用最多的阶段软件维护包括如下四项活动

  • 修正性维护又称纠错性维护诊断和改正用户使用软件时所发现的软件错误的过程
  • 适应性维护与变化的环境适配而进行的修改
  • 完善性维护满足用户提出的新功能或改进意见
  • 预防性维护为未来的改进奠定更好的基础

非结构化维护需要付出很大代价而结构化维护减少精力的浪费并提高维护的总体质量

可维护性(Maintainability)指理解改正调整和改进软件的难易程度由软件的可理解性可测试性可修改性可移植性和可重用性决定文档是影响软件可维护性的决定因素

软件维护有如下两类技术

  • 面向维护技术在开发阶段用于减少错误提高软件可维护性
  • 维护支援技术在维护阶段用于提高维护效率和质量

软件维护一般经过如下步骤分析和理解程序修改程序重新验证程序

软件维护的副作用即因修改软件而造成的错误可分为如下三类编码副作用数据副作用文档副作用

结构化分析与设计(Structured Analysis and Design)

结构化分析(SA)结构化设计(SD)和结构化程序设计(SP)构成了完整的结构化方法

结构化程序设计(SP; Structured Programming)

结构化程序设计指程序的代码块仅通过顺序选择和循环三种基本控制结构联结即完全不使用跳转指令且只有一个入口和一个出口使用自顶向下逐步求精的程序设计方法结构化程序设计强调程序的易读性最早由戴克斯特拉提出他指出跳转指令是有害的应当从高级语言中消除

结构化程序设计可避免写出混杂代码的编程典范改善计算机程序的清晰性

部件执行过程的描述方式有如下几种

  • 图形表示法
    • 程序流程图(Flowchart)以框图表示步骤使用箭头连接直观清晰独立于任何一种程序设计语言
    • N-S(Nassi-Shneiderman)又称盒图符合结构化程序设计原则可以表示程序的结构
    • PAD(Problem Analysis Diagram)由日本日立公司提出是用结构化程序设计思想表现程序逻辑结构的图形工具PAD图采用二维树型结构是软件自动化生成的有力工具还允许递归使用
  • 判定表清晰地表达复杂条件的真值组合与动作间的对应关系
  • 设计性语言(PDL; Program Design Language)用于描述功能部件的算法设计和处理细节是一种伪代码

结构化分析(SA; Structured Analysis)

面向数据流的分析方法根据分解与抽象的原则按照系统中数据处理的流程建立系统的功能模型从而完成需求分析工作

数据流图(DFD; Data Flow Diagram)

用于对系统的功能建模是结构化分析的工具

DFD简明易读为后一阶段的设计测试评估提供有利条件较适合于开发数据处理类型软件的需求分析DFD仅是静态模型没有反应处理的顺序因此不适合描述实时控制系统人机交互界面系统等的需求为了较完整的描述用户对系统的需求DFD应与数据库中的E-R模型结合起来

DFD的基本元素如下

  • 数据流(Data Flow)由一组固定成分的数据组成代表数据的流动方向用箭头表示
  • 加工(Process)输入数据流到输出数据流的变换用圆圈表示
  • 文件(File)保存某些数据供以后使用在各加工间建立合理关系用双杠表示
  • (Source)或宿(Sink)软件系统外的人员或组织用矩形表示

为表达稍为复杂的实际问题需要按照问题的层次结构进行逐步分解并以分层DFD反映这种结构关系否则DFD将及其庞大复杂难以绘制和理解分层DFD的审查需要考虑一致性与完整性

分层DFD的一致性检查包括如下方面父图与子图的输入输出数据流应当一致逻辑上而言加工的输出数据必须能从其输入数据产生且无多余输入子图中加工细节的局部文件不应出现于父图加工的输入输出数据流不得同名

分层DFD的完整性检查包括如下方面加工至少有一个输入数据流和一个输出数据流整体而言每个文件应至少有一个加工读取有另一个加工写入每个数据流和文件都必须命名并与数据字典保持一致每个基本加工都应有加工规约

加工规约又称加工小说明描述加工逻辑等最底层的叶加工必须在加工规约中予以定义加工规约的描述方法有结构化语言判定表和判定树等

数据字典(DD; Data Dictionary)

手动建立或计算机辅助建立的用于存储数据定义和属性的文档

数据字典是用来定义数据流图中的各个成分的具体含义的它以一种准确的无二义性的说明方式为系统的分析设计及维护提供了有关元素的一致的定义和详细的描述

数据字典与数据流图密不可分由如下数据条目组成数据流文件数据项即组成数据流和文件的数据加工源或宿

结构化设计(SD; Structured Design)

面向数据流的设计方法目的在于确定软件的结构

模块结构图(MSD; Module Structure Diagram)

描述软件系统的体系结构指出系统由哪些模块组成模块间的调用关系以及模块调用时数据的传递方向是结构化概要设计的工具

用直线表示调用关系时位于上方的模块调用位于下方的模块

MSD相关的概念如下

  • 深度
  • 宽度
  • 扇出(Fan Out)模块直接调用的模块数目
  • 扇入(Fan In)能直接调用该模块的数目反映了该模块的复用(Reuse)程度

良好的设计策略要求避免高扇出力求高扇入

DFDMSD的映射可使用如下方法

  • 变换分析确定输入输出从而确定变换中心所有的数据流图都可看作变换型数据流图划分因人而异
  • 事务分析确定事务中心根据事务类型执行一个事务处理的功能

MSD还需精化改进以提高复用程度精化的要点如下减少耦合度避免高扇出消除重复功能和管道模块使模块大小适中考虑全局

IPO(Input-Process-Output)

结构化概要设计的工具IBM提出IPO图无论如何设计必须包含输入处理和输出

改进的HIPO(Hierarchical IPO)图既是需求分析方法又是软件设计方法

IDEF(ICAM Definition)

ICAM(Integrated Computer-Aided Manufacturing)即美国空军的集成计算机辅助制造工程IDEF图由美国空军发明是以结构化分析和设计为基础发展的一套系统分析和设计工具

IDEF图使用框图表示活动即系统功能其周围的箭头有如下四种类型

  • 输入位于左侧实行或完成特定活动所需的资源
  • 输出位于右侧经由活动处理或修正后的产出
  • 控制位于上方活动的条件限制
  • 机制位于下方活动所需的工具包括人员设施装备等

面向对象分析与设计(Object-Oriented Analysis and Design)

面向对象分析(OOA)面向对象设计(OOD)和面向对象程序设计(OOP)构成了完整的面向对象方法

面向对象的四个基本特征是抽象继承封装和多态不同于结构化分析与设计OOAOOD之间不存在明显鸿沟

面向对象编程(OOP; Object-Oriented Programming)

面向对象编程使用对象作为基本单元将数据和程序封装其中以提高重用性灵活性和扩展性其核心是隐藏复杂度选择性地公布功能

Simula是第一个面向对象编程的编程语言

统一建模语言(UML; Unified Modeling Language)

UML是用于说明可视化和构建面向对象软件的开放方法是面向对象分析和设计的工具

UML是一种半形式化语言与功能结构无关

类图(Class Diagram)

类图展示类的静态结构即类与类之间的相互联系共有如下类型

关系 说明 理解
泛化(Generalization) 继承的反方向 B extends A
实现(Realization) 实现接口的功能 A implements B
依赖(Dependency) 被依赖的对象作为工具 A uses a B
关联(Association) 强的依赖关系 A has a B
聚合(Aggregate) 弱的包含关系 A owns a B
组成(Composition) 强的包含关系 A is a part of B

类成员的可见性有如下类型

符号 类型 说明
公共的(Public) 类可见时此属性就可见
受保护的(Protected) 子类可见
私有的(Private) 只有类自身可见
包内访问的(Packaged) 同一包中的类可见

内部结构图(Composite Structure Diagram)

内部结构图展示类的分解

用况图(Use Case Diagram)

用况图展示各类外部执行者与系统内用况的连接是用户与系统交互的最简表示形式用况图可以划分系统与外部实体的界限是系统开发的起点

  • 用况(Use Case)系统所提供的一个功能
  • 执行者(Actor)使用这些用况的人或外部系统

构件图(Component Diagram)

构件图展示系统中的构件构件间通过接口的连接以及构件间的依赖关系

构件(Component)是是封装了可执行特定功能的单位

  • 请求接口(Required Interface)该构件请求其他供应者提供服务用半圆表示
  • 供应接口(Provided Interface)为其他请求者提供服务用小圆圈表示

状态机图(State Machine Diagram)

状态机图展示该类的对象的所有可能状态以及何种事件会导致状态的改变

状态的改变称为迁移(Transition)

活动图(Activity Diagram)

活动图展示完成一个操作所需的活动工作流(Workflow)的图形化表示

  • 动作活动图的基本组成用圆角矩形表示
  • 决策即条件判定用菱形表示
  • 并行并发性活动的分离与汇合用粗实线表示

活动图可分为若干矩形区泳道(Swim Lane)可以清晰地表明活动位于的对象

顺序图(Sequence Diagram)

顺序图展示对象间的交互行为关注消息的顺序即对象间消息发送和接收的顺序

部署图(Deployment Diagram)

部署图展示处理器设备和软件构件运行时的体系结构

包图(Package Diagram)

包图展示包和包间的关系

敏捷软件开发(Agile Software Development)

影响最广泛的敏捷软件开发方法如下

  • Scrum(得名于橄榄球比赛)规划纲要冲刺(Sprint)循环总结项目
  • 极限编程(XP; Extreme Programming)策划设计编码测试
  • 看板(かんばん)方法可视化工作流限制在制品(WIP; Work In Process)数量管理流量