浅谈多维度视图与质量目标
作者:互联网
多维度视图和质量目标是哈工大软件构造课程的第一章,而软件构造这一课题也是围绕着这章而展开。掌握好这一内容有助于我们对于后续的课程学习有一个整体的框架。所以我整理出了一份关于多维度视图与质量目标的笔记,供我复习以及读者参考。
========================================================================================================================================================
1. 多维度视图:
一个软件有三个维度:Build-time(构建时)和Run-time(运行时);Code-level(代码层面)和Component-level(组件层面);Moment view(时刻)和Period view(时间段)。
如果把这三个维度都当成一个坐标,那么确定三个维度后就可以唯一确定一块区域,如下图所示:
(1)Build-time view
Build-time是指软件在构造的时候,可以大致理解为在运行代码之前的时候。此时的Moment就是指某一时刻的软件状态,代码层面包括源码,也就是代码,还有AST,就是组成代码的语法结构,包括代码中出现的条件分支、循环结构等,对于面向对象编程还有接口、类这样的类结构,可见代码层面描述的软件的逻辑组织。而组件层面包括包、文件、静态库、测试项等,这里的组件指的是一个软件的物理组织,比如保存在磁盘中的文件、库,以及在链接时的静态链接库。静态链接在生成可执行文件之前就完成了,所以把它归于Build-time而不是Run-time。
Period是指一段时间内软件构造的变化,当然Build-time指的就是软件部署之前,那么代码层面包括代码变化。这个非常容易理解,因为在编写代码的时候肯定不是一蹴而就,中途肯定需要修改和增删,真实情况是一个好的IDE会在每次做出改动的地方进行不同颜色的标注。组件层面就是设置项、版本这样的,一定阶段内会发生更迭的内容。
(2)Run-time view
Run-time是指软件在运行的时候,我认为这个比Build-time更好理解。想象一个情景,当你写完代码开始运行的时候,编译器或者翻译器就辅助操作系统逐行运行你的程序,那么每个时刻你的程序中的变量、常量都被赋予一个特定的值,将在未来的某个阶段参与运算。那么某时刻变量的状态和数值所构成的整体,如果程序员需要进行捕捉分析,那么就要用到代码快照。然后突然运行到某个地方出错了,需要调试,那么查看信息转储中保存的寄存器、栈信息,这就是Memory dump。于是,我们很容易理解运行时,某一时刻代码层面所涵盖的内容。那么组件层面也非常好理解,首先库和包肯定是运行时必须的,然后不同于Build-time的静态链接,Run-time对应的是动态链接,也就是在运行的时候才会链接到程序里的内容,在CSAPP中有详细的讲解。我们都知道可执行文件在运行的时候会被加载到内存,有可能还会请求打开文件或者网络数据,那么就需要硬件、网络以及数据库的辅助,这也是组件层面的。
那么运行时的Period view,在代码层面包括堆栈轨迹,也就是当报错的时候,时候我们可以根据错误信息一步一步追溯到出错的那一行代码,而之所以编译器能提供这个功能,是因为它在从运行开始到运行结束,把每一个函数(方法)调用或者继承的记录保存在数据结构里,这是一整个阶段里完成的。代码层面还包括并发线程,线程是一个小于进程的,代码层面的内容。而如果是并发进程,则是运行时,Period中组件层面的内容,因为涉及到内存管理、上下文切换等需要OS来完成的工作。组件层面还包括事件日志,可以理解为组件层面的堆栈轨迹,包含的是更加“高级”的,噪音更少、更规范、更容易定位的文件信息,还有分布式程序,例如当你的软件使用了server-client模型的时候,需要一台设备扮演server,以及许多别的设备来扮演client,那么就涉及到分布式管理,这是组件层面的。
========================================================================================================================================================
2. 质量目标
质量目标又分为外部质量和内部质量。外部质量是指可以被用户感知的因素,这里的用户不只是终端用户,还包括使用你写的库的程序员等。内部质量是软件产品的质量,影响软件本身和它的开发者。最重要的是外部质量,因为我们构造软件是给人用的,用户的感受是最重要的。但是实现外部质量的关键在于内部质量,只有真正落到代码上才行。
(1)外部质量
在外部质量中,最首要的是正确性,且这个指标不与其他任何指标做权衡。正确指的是规约的正确性,就是用户的要求体现在规约里,而你的程序必须按照规约运行。然后是健壮性,在于当程序出现异常情况的时候必须做出恰当反应,不能崩溃。特别要注意异常情况和错误情况是完全两个概念。错误是正确性应该考虑的,而异常情况是指出现函数规约之外的情况,这也不等于边界情况。异常情况往往是一些程序员无法解决的问题,比如运行代码的硬件环境问题,当用户运行你的程序请求打开另一个文件,而他还没下载那个文件,那程序员怎么处理这种情况?没法处理,只能抛出一个异常来提示用户,保证程序不崩溃。兼容性和可移植性,分别指的是代码在不同软件系统和硬件系统(或操作系统)之间泛用能力。性能,指的是代码优化,但是谨记Knuth大佬的名言,过早优化是万恶之源。易用性,在于提供详细的指南。功能性,这里不是说功能越多越好,相反,专注于自己的功能。及时性,在用户有对应需要求前发布新版本。
(2)内部质量
内部质量通俗的来说就是程序员自己看的东西,也是最实在的。包括LOC(lines of code)也就是代码长度,越少越好,还有代码的风格,是方便程序员还是方便编译器,这是就源码而言的。结构方面包括耦合度和内聚度。耦合度是指模块之间的重叠度和依赖度,比如函数是否依赖于其他函数。低耦合度意味着模块的高独立性,意味更彻底的抽象,是我们追求的。内聚度指的是模块内部的关联程度,那当然同一个模块里面越相关越好,不然为什么要把它们放在一起。有时低耦合就意味着高内聚,这是高内部质量的体现。
标签:浅谈,层面,代码,多维度,视图,质量,time,组件,软件 来源: https://www.cnblogs.com/kujowarma/p/16355972.html