一:多维度视图:
1:三个维度介绍:
1):Build-time&Run-time:
Build-time:(构造阶段):软件按照需求进行设计,然后编写代码实现生成可执行文件的阶段。
Run-time:(运行阶段):程序被载入目标机器开始执行的阶段。
2) :Code-level&Component-level
Code-level:广义上指的是源代码层面。但是在Build-time阶段更关注于源代码内部类、方法、接口等逻辑组织,在Run-time阶段更关注于程序在内存中如何呈现,比如运行时的内存里有多少个对象,对象里数据的值是多少。
Component-level:广义上指的是模块层面,如file、package、directory以及librariy等。但是在Build-time阶段更关注于模块之间的依赖关系,如文件、路径、包、库之间的关系,在Run-time阶段更关注于模块在硬件上的实现,多个模块在运行时的配置是什么样子的。
3) Moment&Period
Moment:广义上指的是特定时刻。但是在Build-time阶段更关注于特定时刻下的软件形态,如某一时刻的代码,在Run-time阶段更关注于特定时刻下的对象实例在硬件环境中的形态,如某一时刻程序其占用的内存或某个对象在内存中的值等等。
Period:广义上指的是一个时间过程。但是在Build-time阶段更关注于软件形态随时间的变化,因为软件开发是具有周期性的,不可能一次就开发出一个完美的软件,而是可能不断地更改需求、完善和优化,在Run-time阶段更关注于对象实例在硬件环境随时间的变化,比如其所占用的内存大小。
2. 八个方面:
1):Bulid-time&Moment&Code-level
词汇层面:半结构化编程:近乎自然语言风格+遵循特定的编程语法
语法层面:抽象语法树:彻底结构化,将源代码变成一棵树
语义层面:是语法层面更加具体的体现,具体到某一个对象的数据和属性以及与其它对象的关系。
2):Bulid-time&Period&Code-level
在这个方面主要是通过代码的版本控制工具(常使用Git)来观察code churn(代码变化),即实时监控记录代码的变化。应用场景如下:在项目不断迭代的过程中,发现今天的项目突然出bug了,那么就可以通过代码的版本控制工具来找上次修改了哪些代码,可以更快地定位到引起bug的代码。
3):Bulid-time&Moment&Component-level
主要关注代码的组织情况
4)Bulid-time&Period&Component-level
在这个方面主要是通过代码的版本控制工具来观察软件版本随时间的变化,与②的区别是,④从更宏观的角度去观察变化。注:版本数字变化越靠前说明改动越大,越靠后说明改动越小,如版本1.6到2.6比1.6.0到1.6.1更大。
5)Runtime&Moment&Code-level
在这个方面主要通过Snapshot diagram(代码快照图)来描述某一时刻程序运行时内存里变量层面的状态,如图。想进一步了解可点击如下链接
6)Runtime&Period&Code-level
在这个方面主要通过UML图的时序图来观察软件内对象与对象、方法与方法之间的一个动态交互,跟踪代码执行的一个过程,例如跟踪堆栈、并发多线程。也可以通过日志(代码层面)记录程序执行的调用次数。
7)Runtime&Moment&Component-level
在这个方面主要通过UML部署图观察软件运行时的不同模块是如何配置的以及它们之间的联系,比如分为客户端和服务器端,以及动态链接等。
8)Runtime&Period&Component-level
在这个方面主要从模块方面看程序是如何运行的,例如事件日志(系统层面)会记录系统层面的信息——进程被调用、挂起、运行了多长等等。还有分布式进程、多线程等。
3. 维度的转换:
二:质量目标:
1:内部质量目标:
①正确性(最重要的质量指标):通过防御式编程、测试和调试...
②健壮性。//注意与正确性的区分,正确性是争取其正确,健壮性是在其发生异常时争取不崩溃。
③可扩展性:对软件的进一步修改如添加功能等应简便快捷。//提倡将模块设计简约,模块与模块之间尽量独立。
④可复用性。
⑤兼容性:不同软件系统之间可兼容。//保持设计的同构性,如标准化文件格式、数据结构、用户界面等。
⑥高效性。
⑦可移植性:在不同的硬件和操作系统能移植。
⑧易用性:给用户提供详细的指南。
⑨实用性:实用即可,不必花里胡哨。
⑩及时性:按时完成项目。
2.外部质量目标:
①可读性。//写好注释
②清晰性。//代码风格要好
③代码大小。//高内聚低耦合、圈复杂度、代码行数LOC
3.质量之间的取舍权衡:
①完整性vs易用性//完整性指的是软件有很好的保护措施
②经济性vs功能性//想要功能多又想要便宜,难
③高效性vs可移植性//高效一般针对某一种情况专门设计,既然是专门设计又想比较好地移植,难