软件构造的多维度视图和质量目标
第一章软件构造的多维度视图和质量目标
三个维度: 按阶段划分:构造时/运行时视图(build- and run-time views)
按动态性划分:时刻/阶段视图(moment and period views)
按构造对象的层次划分:代码/构件视图(code and component views)
1 Multi-dimensional software views (软件构造的多维度视图)
构建时
- Code-level view:源码、类结构;代码变化
表示代码的逻辑组织 - Component-level view:文件、目录、包、库、静态链接、测试项;配置项、版本
表示代码的物理组织 - Moment view:源码、类结构;文件、目录、包、库、静态链接、测试项
表现源码和组件在特定时刻的软件形态 - Period view:代码变化;配置项、版本
表现软件形态随时间的变化
源码组织在文件中,进而组织在目录中
文件存档在包中,并逻辑上归属于组件和子系统
可重用的模块以库的形式存在,库存储在磁盘文件中
静态链接:库被拷贝进代码形成整体,执行的时候无需提供库文件;静态链接发生在构造阶段
运行时
- Code-level view:代码快照、内存转储;堆栈轨迹、并发线程
逻辑实体在内存中如何呈现 - Component-level view:包、库、动态链接、数据库、网络、硬件;事件日志、多进程、分布式程序
物理实体在物理硬件环境中如何呈现 - Moment view:代码快照、内存转储;包、库、动态链接、数据库、网络、硬件
逻辑/物理实体在内存/硬件环境中特定时刻的形态 - Period view:堆栈轨迹、并发线程;事件日志、多进程、分布式程序
逻辑/物理实体在内存/硬件环境中的形态随时间的变化
动态链接:库文件不会在构建阶段被加入可执行软件,仅仅做出标记;程序运行时,根据标记装载库至内存;发布软件时,将程序所依赖的所有动态库都复制给用户
运行时
分布式程序:需要多个运行程序,分别部署于多个计算机物理环境
代码快照:描述程序运行时内存里变量层面的状态
内存转储(Memory dump):一个包含进程内存拷贝的磁盘文件,包含程序异常退出时的寄存器、调用栈、程序数据等,调试器可以加载转储文件并显示信息
执行跟踪(Execution tracing):软件层面,用日志方式记录程序执行的调用次序
事件日志:系统层面的日志
2 Software construction : Transformation between views (视图转换)
3 Quality properties of software systems 软件系统的质量因素
外部质量因素:可被用户感知的因素,如软件速度、易用性;影响用户
内部质量因素:作为软件产品的质量,如代码可读性;影响软件本身和它的开发者
外部质量取决于内部质量。
(1)外部质量因素
1. 正确性 Correctness
正确性:按照预先定义的规约执行,是最重要的质量指标。每一层保证自己的正确性,同时假设其下层是正确的。
测试和调试:发现不正确、消除不正确
防御式编程:在写程序的时候就确保正确性
形式化方法:通过形式化验证发现问题
2. 健壮性/鲁棒性 Robustness
健壮性:针对异常情况的处理,关键在于出现异常时不要崩溃。
健壮性是对正确性的补充,正确性保证了软件的行为要严格符合规约中定义的行为;健壮性保证了出现规约定义之外的情形的时候,软件要做出恰当的反应。
“正常”和“异常”是主观而非客观的,未被规约覆盖的情况即为“异常情况”。
3. 可扩展性 Extendibility
可扩展性:对软件的规约进行修改,是否足够容易。原因:应对变化。
软件规模越大,扩展起来越不容易。
4. 可复用性 Reusability
可复用性:一次开发,多次使用
5. 兼容性 Compatibility
兼容性:不同的软件系统之间相互可容易的集成
核心是保持设计的同构性,关键在标准化。
6. 性能 Efficiency
除非有足够的正确性,否则性能毫无意义。对性能的关注要与其他质量属性进行折中,过度的优化会导致软件不再适应变化和复用。
7. 可移植性 Portability
可移植性:软件可方便的在不同的技术环境之间移植,包括硬件和操作系统
8. 易用性 Ease of use
易用性:对用户而言容易学、安装、操作、监控
提升易用性的方法是给用户提供详细的指南。
9. 功能性(Functionality)
功能性是指系统提供的可能性范围。程序设计中一种不适宜的趋势,即软件开发者增加越来越多的功能,企图跟上竞争,其结果是程序极为复杂、不灵活、占用过多的磁盘空间,忽视整体质量,失去可持续性。
10. 及时性(Timeliness)
及时性:在用户有对应需求前放出新版本
10++. 可验证性(Verifiability)、完整性(Integrity)、可修复性(Repairability)、经济性(Economy)
(2)内部质量因素
源码方面:行数(LoC)、逻辑复杂度
结构方面:耦合coupling,、内聚cohesion,(尊崇高内聚、低耦合)
从模块粒度来看,高内聚:尽可能类的每个成员方法只完成一件事(最大限度的聚合); 低耦合:减少类内部,一个成员方法调用另一个成员方法。从类角度来看, 高内聚低耦合:减少类内部,对其他类的调用;从功能块来看 高内聚低耦合:减少模块之间的交互复杂度(接口数量,参数数据)即横向:类与类之间、模块与模块之间;纵向:层次之间;尽可能,内容内聚,数据耦合。
除此之外还有代码可读性、易于理解、清晰、大小等。
(3)Tradeoff between quality properties 质量因素之间的权衡
正确的软件开发过程中,开发者应该将不同质量因素之间如何做出折中的设计决策和标准明确的写下来。
虽然需要折中,但“正确性‘决不能与其他质量因素折中。
4 Five key quality objectives of software construction 5个核心质量因素
– Easy to understand: elegant and beautiful code / understandability
– Ready for change: maintainability and adaptability
– Cheap for develop: design for/with reuse: reusability
– Safe from bugs: robustness / correctness
– Efficient to run: performance
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理