一.软件构建多维视图
1. 什么是软件
(1)构成
·程序Program:UI, Algorithms, Utilities, APIs, test cases, etc
·数据Data:files, databases, etc
·文档Documents:SRS需求规格说明, SDD设计规格说明, user manuals, etc
(2)考虑因素
·用户:谁来使用
·商业目标:为何有用
·社会环境:应遵循何种法则
·技术环境:如何实施
·硬件/网络:在何处运行
2. 软件构造的多维视角
(1)描述维度
·阶段:构建 || 运行
·动态:时刻 || 周期
·级别:代码 || 组件
(2)构建视角
A. 概述:想法 -> 需求 -> 设计 -> 代码 -> 可安装可执行的包
·代码:源代码由基本程序块及其依赖关系进行逻辑组织。
·组件:源代码通过文件,目录,包,库及其依赖关系进行物理组织。
·时刻:特定时间内源代码和组件的形式。
·时期:程序如何随时间演变。
B. 代码-时刻
·三种相互关联的形式:
- 面向词汇的源代码
- 面向语法的程序结构:例如,抽象语法树(AST)
- 面向语义的程序结构:例如,类图
C. 代码-周期
·代码变化:添加、修改、删除从一个版本到另一个版本的文件
D. 组件-时刻
·源代码被物理地组织成文件,进一步按目录进行组织
·文件被封装成包,并在逻辑上封装组件和子系统
·可重用模块以库的形式存在。
·库:
- 来源:造作系统预安装、语言JDK、互联网下载、开发人员自己发布
- 链接:提供库列表 -> 找到所需函数 -> 复制到可执行程序中
·静态链接:当链接器工具确定需要某个函数时,从库中提取适当的对象文件并将其复制到可执行程序中,将可执行程序加载到目标机器上。
·UML部署图
E. 组件-周期
·版本控制系统(VCS)
·演化图(SCI或软件的演变图)
·版本控制:将唯一版本名称或唯一版本号分配给计算机软件
·软件演变:软件维护中的更新过程
(3)运行视角
A. 概述
·高级概念
- 可执行程序:CPU执行的机器可读指令序列以及相关的数据值,已完全编译,可加载到计算机的内存中执行。
- 库:可被不同程序复用,不能直接在目标机器上加载和执行,必须首先与一个可执行程序链接。
- 配置和数据文件:提供程序可以从磁盘加载的有用数据和配置信息。
- 分布式程序:在同一台计算机上运行的多个进程。
·本地机器码
- 程序首先载入内存,将可执行程序彻底转换为CPU的本机机器码。
- 所有执行纯粹使用CPU硬件。
- 执行时程序可选择调用操作系统来访问文件和其他系统资源。
- 优点:CPU直接执行,速度快
- 缺点:可移植性差
·完整程序解释:运行时系统将整个源代码加载到内存中并解释(如BASIC、UNIX、shell等)
·解释字节码:CPU不能直接理解字节码,需首先将其解释为本机机器码或在程序执行时进行解释,因此字节码环境要求加载一个额外的解释器或编译器。
- Java虚拟机(JVM)
- Perl或Python:被解释而非编译,运行时使用字节码,执行其脚本的简单行为会自动触发字节代码的生成。
·动态链接:升级时无需重新创建可执行程序、具有共享性
·配置和数据文件:程序调用操作系统来请求将数据读入内存
- 屏幕上显示的位图图形图像
- 存储为数字化波形的声音
- 定制程序行为的配置文件
- 一组包含在线帮助文档的文档
- 包含名称和地址的数据库
·分布式程序:如软件系统可能使用的客户端/服务器模型,在一台计算机上运行单个服务器程序,在许多其他计算机上运行大量客户端程序。这种情况下,构建系统可以创建两个发布包,或者使用相同的发行包来安装两个独立的程序。
B. 代码-时刻
·快照图:着眼于目标计算机内存中的变量级执行状态。
·内存转储:硬盘上的一个包含进程内存副本的文件,当进程因特定类型的内部错误或信号而中止时创建。分析程序状态时,调试器可以加载转储文件并显示它包含的有关正在运行的程序状态的信息,包括寄存器,调用堆栈和所有其他程序数据的内容,程序员可查看内存缓冲区中哪些数据项在失败时运行。
C. 代码-周期
·UML中的顺序图:程序单元(对象)之间的交互
·执行追踪:使用日志记录关于程序执行的信息,以便调试。
D. 组件-时刻
·UML中的部署图
E. 组件-周期
·事件记录为系统管理员提供对诊断和审计有用的信息。
·每一类事件都被赋予一个唯一的“代码”来格式化并输出一条可读信息。
·执行追踪和事件记录
事件记录 |
软件追踪 |
主要由系统管理员使用 |
主要由开发人员使用 |
记录高级信息(如程序安装失败) |
记录低级信息(如抛出的异常) |
不能包含过多重复事件或无效信息 |
可以包含重复事件及无效信息 |
通常需要基于标准的输出格式 |
输出格式几乎无限制 |
事件日志通常本地化 |
很少考虑本地化 |
对于添加新类型的事件或消息不灵活 |
对于添加新的追踪消息必须灵活 |