知识点清单:
1. 软件构造多维度视图
2. 软件构造的阶段划分,各个阶段的构造活动
3. 内部/外部质量指标
软件构造多维度视图
软件系统的构成主要分为三个维度:
- By phases: build- and run-time views
- By dynamics:moment and period views
- By levels: code and component views
其中每个维度都有两个视图,其可以任意组合,那么就可以组成以下八个多维视图,每个多维视图即为软件构造的一个阶段,每个阶段中的信息为该阶段的构造活动,会在下面详细说明:
软件构造的阶段划分及各个阶段的构造活动
软件的阶段划分在上面已经全部给出,共八个阶段,现在给出每个阶段的详细活动:
(1)Build-time, moment, and code-level view
这个阶段主要分为三个层面:
- 词汇层面:Lexical-oriented source code
- 语法层面:Syntax-oriented program structure;Abstract Syntax Tree(AST)
- 语义层面:Semantics-oriented program structure
词汇层面:
其指的是基于词汇的半结构化源代码(Lexical-based semi-structured source code),半结构化是指近乎自然语言的风格+遵循特定的编程语法,前者方便程序员,后者方便编译器。
语法层面:
其指的是面向语法的程序结构(Syntax-oriented program structure)eg:抽象语法树(AST)。
java中就有专门的AST类将源代码变为一棵树,对树做各种操作就等于对源代码做修改。
语义层面:
其指的是面向语义的程序结构(Semantics-oriented program structure)。
通常是图形化或者形式化的用于表达“需求”和“设计”思想在转化为code,eg:使用类图Class Diagram(UML)来描述 interfaces, classes, attributes, methods以及它们之间的关系。
(2)Build-time, period, and code-level view
(3)Build-time, moment, and component-level view
该阶段中源代码被分割为多个文件,这些文件北风装成了package等,并且可重用模块以library的形式存在。
其中库根据链接形式不同又可分为动态链接与静态链接。对与静态链接,其发生在构造阶段,库会被copy进入代码形成整体,执行的时候不需要提供库文件。
(4)Build-time, moment, and component-level view
该阶段主要关注各项软件实体随时间会如何变化,以及软件配置项ICS(Software Configuration Item)和版本的变化。
该阶段会在第二章知识点总结中的软件配置管理SCM与版本控制系统VCS详细来说明。
(5) Run-time, moment, and code-level view
该阶段主要关注程序在运行时各个时刻的代码层面状态(内存等信息)
其常用工具有快照图和内存信息转储,快照图描述了程序运行时内存里变量层面的状态。而内存信息转储是指当进程执行的过程中通过工具产生一个文件用来分析程序运行时的各个状态信息。其将在第八章说明。
(6) Run-time, period and code-level view
该过程与上一个略不同,其关注一段时间内代码的状态,包括各段代码的调用次序,堆栈调用情况等。
(7) Run-time, moment, and component-level view
顾名思义,该过程将主要关注程序运行时某一时刻在组将层面的情况。
(8) Run-time, period, and component-level view
同样,该过程关注程序运行中一段时间各个组件的情况,比如事件日志等系统层面的信息。
内部/外部质量指标
外部质量指标
- 正确性:
正确性是指软件按照预先定义的“规约”执行。其实至高无上的质量指标。通常用四种方法来保证正确性:
- 分层的方法:将代码分为多层,保证每一层代码的正确性,逐步完善代码
- 测试与调试:发现不正确、消除不正确。
- 防御式编程:在写程序的时候就确保正确性。
- 形式化方法:通过形式化验证发现问题。
- 健壮性:
健壮性是指程序对异常情况处理的能力,其是对正确性的补充,正确性是指软件的行为要严格符合规约中定义的行为,而健壮性是指当出现了规约以外的情形时,软件要做出恰当的反应而不是崩溃。 - 可拓展性:
可拓展性是指对软件的规约进行修改是否容易。根据经验,代码汪汪规模越大扩展越不易,那么简约主义设计和分离主义设计就显得尤为重要。 - 可复用性:
显而易见,可复用性是指软件中的结构对于不同应用提供服务的能力,说白了就是一次开发多次使用,在不同的应用中找到共性,不要做重复的事情。 - 兼容性:
兼容性是指不同软件系统之间相互是否可容易集成。比如不同的操作系统可能带来文件格式的不兼容等问题。其关键是保护设计的同构性,采用标准的协议,包括标准的文件格式、标准的数据结构、标准的用户接口等等。 - 性能:
顾名思义, 但注意保证性能的前提是要有足够的正确性,否则性能毫无意义。对性能的关注要与其他质量属性进行折中,过度的优化会导致软件不再适应变化和复用。另外记住过早的优化是万恶之源。 - 可移植性:
是指软件是否可方便在不同的技术环境之间移植,其中技术环境包括硬件与操作系统等。 - 易用性:
定义顾名思义,其指标是是否易学、易安装、易操作、易监控。 - 功能:
不同与性能,对功能的理解实际就是代码能做多少事,有哪些功能。程序设计中有一种不适宜的趋势,即软件开发者增加越来越多的功能,企图跟上竞争,其结果是程序极为复杂、不灵活、占用过多的磁盘空间 。其会降低整体质量 - 及时性:
是指软件在用户需要时的发布能力。 - 其他:
可验证性、完整性、可修复性、经济性……
内部质量因素
- 源代码相关因素(Source code related factors),如代码行数(LOC),循环复杂度等
- 架构相关因素(Architecture-related factors),如耦合度聚合度等。
- 可读性
- 易理解性
- 清晰度
- 规模
内部质量因素通常用作外部质量因素的部分度量。