软件构造的多维度视图&质量目标
软件构造的多维度视图与质量目标
View and Quality Objectives Software Construction
对应讲义第一节内容
软件构造的多维视图
三个维度:
- 按阶段划分:构造时/运行时视图
- 按动态性划分:时刻/阶段视图
- 按构造对象划分:代码/构件视图


整体来看的话:
- Build-time, moment, code-level:
代码如何在逻辑上被组织为基本的程序块,例如函数、类、方法、接口等,以及其之间的依赖关系。 - Build-time, period, code-level:
代码在时间尺度上的变化,例如代码行的增删改。 - Build-time, moment, component-level:
源代码被组织为文件,文件被组织进目录;文件被包含在包中,在逻辑上也被包含在容器和子系统中;可复用的模块被组织为库。 - Build-time, period, component-level:
软件系统中的文件、包、容器、库随时间如何变化,或称版本如何变化。 - Run-time, moment, code-level:
快照图(snapshot diagram)[必须会画]、内存转储(memory dump)。即软件在运行时保有的数据及其在内存中的结构。 - Run-time, period. code-level:
顺序图(sequence diagram)、运行时栈跟踪(execution stack trace) - Run-time, moment, component-level:
部署图(各个组件被部署在了哪些机器上)。 - Run-time, period, component-level:
事件日志
按课件顺序展开说明
构造时视图 BuildTime
构造阶段(Build time):想法->需求->设计->源码->可安装/可执行软件包
CodeLevel-代码的逻辑组织,函数、类、方法、接口等基础程序块的组织方式与它们之间的依赖关系
ComponentLevel-代码的物理组织,构件级别,源码以文件、目录、包、库等形式的物理组织方式与之间的相互依赖关系
Moment view-特定时刻的软件形态
Period view-软件形态随时间的变化
-
Build-time, moment, code-level view
三种相关形式:- 词汇层面:面向词法半结构化语言-近乎自然语言风格+特定变成语法 方便程序员与编译器
- 语法层面:面向语法的程序结构(如抽象语法树AST,彻底的结构化)
- 语义层面:面向语义的程序结构。源码与现实世界内容的联系映射,通常是图形化/形式化的,用于表达“需求”和“设计思想”再转化为代码
![img]()
![img]()
![img]()
-
Build-time, period, code-level
见证代码的"改变"Code churn(代码变化): Lines added, modified or deleted to a file from one version to another.
![img]()
-
Build-time, moment, component-level
源代码被组织构成目录,文件被封装成包、组件和子系统,可复用模块形成类库。库被存储在硬盘中,收集一系列可复用的函数,开发者像使用编程语言指令一样使用库中的功能(来源:操作系统/编程语言/第三方公司/个人积累)。
编程与编译时需要告诉IDE/JVM寻找库的位置,把库整合进入程序有两种方法:
- Static linking 静态链接:在构建程序的过程中,将类库文件复制到可执行文件中,称为可执行文件的一部分,执行无需提供库文件。
- Dynamic linking 动态链接:不在build阶段将目标文件复制到可执行程序中,而是会标注用到的类库,在运行时,根据标记加载用到的库到内存中,然后同主程序链接,部署时需要将用到的类库同程序一起部署。
优势:更容易更新库的内容,更容易为多个程序共享使用
在统一建模语言中,一个部件表(Component Diagram)描述了成分怎么被链接在一起去形成更大的组份或软件系统。
-
Build-time, period, component-level view
描述各项软件实体随时间的变化:软件配置项SCI、版本
![img]()
![img]()
运行时视图 RunTime
运行:程序被载入目标机器开始执行的时间段内
CodeLevel-逻辑实体在内存中的呈现,程序单元彼此之间的互动方式
ComponentLevel-物理实体(软件包)在物理硬件环境(操作系统,网络,硬件设备等)中的呈现方式与互动方式
Moment view-内存/硬件环境中特定时刻的程序形态(逻辑/物理实体)
Period view-内存/硬件环境中程序形态(逻辑/物理实体)随时间的变化
- Run-time, moment, and code-level view
代码快照图(会画):描述程序运行时内存里变量层面的状态
![img]()
内存信息转储(Memory Dump):一个硬盘上的文件包括一个程序内存内容的复制品,当一个程序因为某种内部错误或者信号而异常退出时制造。
![img]()
6.Run-time, period and code-level view
Execution trace 执行追踪:用日志的方法记录程序执行的调用次序

Procedure Call Graph, Message Graph (Sequence Diagram)
程序访问图,信息图,也叫顺序表(UML模型中有)

7.Run-time, moment, and component-level view
包,库,动态链接,设置,数据库,中间设备,网络,硬件,部署表
部署表示例:

8.Run-time, period, and component-level view
事件日志:在系统层面给系统管理员提供信息用来诊断和审计。
与执行追踪有区别,事件日志不能太过“noisy”,输出格式更为严格,日志信息相对“high level",提供给系统管理员。
运行时软件的部分高级概念:
- 可执行程序:原生机器码(最快的代码执行方法,完全利用CPU特征)、程序完全解释执行(BASIC、UNIX shell)与解释型字节码(如JVM Python)
- 库与动态链接(见构件时视图)
- 配置与数据文件:具有一定规模的程序需要使用外部的数据内容,程序向操作系统发送请求将数据读入内存
- 分布式程序:运行态需要多个运行程序,分别编译和部署于多个计算机物理环境
软件构造:不同视图间的转换
-
从无到生成代码
编程编码(ADT&OOP),之后检查,再静态分析。 -
从代码到代码组成
- 对代码进行设计(ADT/OOP 可复用性 可维护性)
- 构建Build:编译,静态链接,打包,安装,清除。
- 构建阶段到运行阶段
- 实行安装,部署
- 调试,单元/集成测试(健壮性与正确性)。
- 从时刻到过程
- 版本控制
- 装载,动态链接,解释,执行。
- 并发线程
软件系统的质量
外部质量因素印象用户,内部质量因素影响软件本身与开发者,外部质量取决于内部质量。外部质量较为重要。
外部质量
- 正确性:软件设计中最重要的评价因素。软件的运行要按照spec规定的输入和输出来工作。
- 测试和调试:发现不正确 消除不正确->健壮性
- 防御式编程:在写程序时确保正确性->健壮性
- 形式化方法:由形式化验证发现问题(check gurantee ensure)
- 健壮性:指软件运行时遇到一些异常输入时,能够处理异常并不影响正常运行。(对正确性的补充,正确性:正常情况 健壮性:异常情况,这个正常异常由spec规约决定)
- 可扩展性:当设计的程序需要修改时,设计一个具有良好扩展性的程序可以使得修改的代价大大降低。(简约主义/分离主义设计)
- 可复用性:一个程序经过一次开发,可以被多次使用——当不同的ADT具有某些相同的功能时,就可以改造原有ADT以降低编程成本。
- 兼容性:设计的方法是否可以在其他环境下正常工作。不同软件系统之间的相互可容易的集成,保持设计的“同构性”,“标准化”。
- 可移植性:设计的方法是否可以在不同操作系统和硬件中工作。
- 效率性:软件运行时的时间和空间复杂度等,必须以确保程序的正确性为前提进行改进,与其他属性折中。
- 易用性:程序的代码要易懂,便于用户操作使用。可以给用户提供详细的指南。
- 功能性:增加功能不对程序的其他质量属性产生负面影响,各部分功能明确。不“臃肿”
- 其他属性:及时性、可验证性、完整性、可修复性、经济性等(较为望文生义,不再展开)
内部质量
- 代码可读性:代码内部要分工明确,比如各部分的调用关系等。
- 代码可理解性:函数和变量的命名易于理解,在难理解的地方合理添加注释等等。
- 代码规模(Size):一个方法规模不宜过大。
- 其他因素:代码简洁度,代码行数,圈复杂度,高内聚低耦合等
质量属性的折中 tradeoffs
“正确性”最为重要,决不能和其他质量因素折中
正确的软件开发过程中,开发者应该将不同质量之间如何做出折中的设计决策和标准进行明确的记录。
最为重要的几个质量因素:正确性、健壮性(使软件可靠)、可扩展性、可复用性(让软件模块化)
附面向对象编程对软件质量的改进方式:

软件构造:五个关键质量目标
五个关键的质量对象的软件构造:易于理解,易于改变,易于发展,可复用性,健壮性



















浙公网安备 33010602011771号