软件=模块+数据/控制流\
多维度的软件视图:
从Build-time,moment,and code-level view来看软件构造可以分为如下三个层面:
词汇层面(Lexical-oriented): source code(源代码)
语法层面(Syntax-oriented): AST,即Abstract Syntax Tree(抽象语法树)
语义层面(Semantics-oriented):Interface-Class-Attribute-Method(也叫做Class Diagram,即类图)
同时源代码在物理上被组织成文件,而这些文件又是由目录组织的。
文件被封装成包,在逻辑上,被封装成组件和子系统,可重复使用的模块是以库的形式存在的。
库:库存储在自己的磁盘文件中,收集了一组代码功能,可以在各种程序中重复使用,在构建时,库函数可以被看作是对标准语言的拓展,其使用方式与开发人员编写的函数相同。
库集成到可执行程序有两种方法:
静态链接:
动态链接:
外部质量因素:
Correctness:正确性,即按照预先定义的“规约”执行,是至高无上的质量指标,方法:测试与调试,防御性编程,形式化方法
Robustness:健壮性,即针对异常的处理,它是对正确性的补充,当出现规约定义之外的情形的时候,软件要做出恰当的反应,出现异常时不要“崩溃”
Extendibility:可扩展性,即软件产品适应规格变化的便利性,规模越大,扩展起来越不容易,可扩展性容易的程序可以更好地应对客户需求的变化,方法:设计简单化,分散化
Reusability:可复用性,即软件能够用于构建许多不同应用程序的能力,一次开发,多次使用。
Compatibility:兼容性,即软件与其他元素结合的难易程度,它是不同的软件系统之间相互可容易的集成,方法:标准化文件格式、数据结构、用户界面。
Efficiency:性能,即一个软件系统对硬件资源提出尽可能少的要求的能力,性能毫无意义,除非有足够的正确性;过度的优化导致软件不再适应变化和复用
Portability :可移植性, 即讲软件产品转移到各种硬件和软件环境中的便利性,软件可方便的在不同的技术环境之间移植
Ease of use:易用性,即不同背景的人都能学会使用软件产品并应用它们来解决问题的难易程度,容易学、安装、操作、监控
Functionality:功能,即一个系统所提供的可能性的程度
Timeliness:及时性,即一个软件系统在用户需要时或之前发布的能力
内部质量因素
与源代码有关的因素,如LOC、循环复杂度
架构相关的因素,如耦合、内聚力
可读性
可理解性
清晰度
尺寸。
开发人员要在质量属性间做出权衡,但不能牺牲正确性