软件构造基础
1.多维度视图和质量目标
总览
分为三个维度,下图为立体图形在二维平面的表示。
1.1 构建时 build-time
Code-level view:源码、类结构;代码变化表示代码的逻辑组织
Component-level view:文件、目录、包、库、静态链接、测试项;配置项、版本表示代码的物理组织
Moment view:源码、类结构;文件、目录、包、库、静态链接、测试项表现源码和组件在特定时刻的软件形态
Period view:代码变化;配置项、版本表现软件形态随时间的变化
源码组织在文件中,进而组织在目录中
文件存档在包中,并逻辑上归属于组件和子系统
可重用的模块以库的形式存在,库存储在磁盘文件中
静态链接:库被拷贝进代码形成整体,执行的时候无需提供库文件
1.2 运行时 run-time
Code-level view:代码快照、内存转储;堆栈轨迹、并发线程逻辑实体在内存中如何呈现
Component-level view:包、库、动态链接、数据库、网络、硬件;事件日志、多进程、分布式程序物理实体在物理硬件环境中如何呈现
Moment view:代码快照、内存转储;包、库、动态链接、数据库、网络、硬件逻辑/物理实体在内存/硬件环境中特定时刻的形态
Period view:堆栈轨迹、并发线程;事件日志、多进程、分布式程序逻辑/物理实体在内存/硬件环境中的形态随时间的变化
动态链接:库文件不会在构建阶段被加入可执行软件,仅仅做出标记;程序运行时,根据标记装载库至内存;发布软件时,将程序所依赖的所有动态库都复制给用户
2. 视图之间的联系与视图转换
1.从无到有,写出了代码,就进入了Build-time维度,开始只是单个的没有任何联系的代码文件,所以是在moment+Code-level维度;
2.此时随着时间的推移,代码删删改改,就属于Period+Code-level了,而代码越写越多成为了一个包,甚至形成了一个库,于是就属于moment+Component-level维度了;
3.但是随着时间的推移,库文件由于需求的变化发生了变化,所以就属于Period+Component-level;
4.代码写好了,投入运行,进入Run-time维度,观察的如果是某一句代码的执行后结果,那就是moment+Code-level维度,但如果看的是代码执行的轨迹,那就是Period+Code-level维度,而如果看的是一个库文件的连接情况等,那就是moment+Component-level维度了;
5.如果看的是线程或进程的执行过程,也就是通过日志等手段查看一段时间内系统都做了什么事情,那么就是Period+Component-level了。
3. 软件的质量指标
分为内部质量和外部质量,外部质量因素影响用户,内部质量因素影响软件本身和它的开发者,外部质量取决于内部质量。
3.1 外部质量因素
1.正确性:按照预先定义的规约执行,是最重要的质量指标
测试和调试:发现不正确、消除不正确
防御式编程:在写程序的时候就确保正确性
形式化方法:通过形式化验证发现问题
2.健壮性:针对异常情况的处理,关键在于出现异常时不要崩溃
健壮性是对正确性的补充,正确性保证了软件的行为要严格符合规约中定义的行为;健壮性保证了出现规约定义之外的情形的时候,软件要做出恰当的反应。
“正常”和“异常”是主观而非客观的,未被规约覆盖的情况即为“异常情况”。
3.可扩展性:对软件的规约进行修改,是否足够容易
软件规模越大,扩展起来越不容易。
4.可复用性:一次开发,多次使用
5.兼容性:不同的软件系统之间相互可容易的集成
核心是保持设计的同构性,关键在标准化。
6.除非有足够的正确性,否则性能毫无意义。对性能的关注要与其他质量属性进行折中,过度的优化会导致软件不再适应变化和复用。
7.可移植性:软件可方便的在不同的技术环境之间移植,包括硬件和操作系统
8.易用性:对用户而言容易学、安装、操作、监控
提升易用性的方法是给用户提供详细的指南。
9.功能性:程序设计中一种不适宜的趋势,即软件开发者增加越来越多的功能,企图跟上竞争,其结果是程序极为复杂、不灵活、占用过多的磁盘空间,忽视整体质量,失去可持续性。
10.及时性:在用户有对应需求前放出新版本
3.2 内部质量因素
1.码方面:行数(LoC)、逻辑复杂度
2.结构方面:耦合、内聚
3.除此之外还有代码可读性、易于理解、清晰、大小等。
3.3 五个关键的质量指标
·Elegant and beautiful code:代码要容易理解,通过统一变量/方法的命名标准、代码的风格、注释、包组织结构、必要时重构代码等方式让代码尽可能的容易理解。
·Design for/with reuse:ADT/OOP、接口、继承(Overload、Override)、多态、泛型、框架等技术可用于提高代码的可复用性。
·Low complexity:当复杂度较低的时候,代码就容易被扩展新的功能,所以要高内聚低耦合,遵从SOLID原则、OO设计模式、使用VCS控制代码版本
·Robustness and correctness:使用测试驱动的开发、异常处理、Assertion机制、防御式编程等技术保证程序的健壮性和正确性。
·Performance and efficiency:使用设计模式、并行/多线程等技术提升性能。