按阶段划分:build-time(构造阶段)和run-time(运行阶段)
按动态划分:moment(时刻)和period(时期)
按层次划分:code(代码层面)和component(组件,文件层面)
1.build time view
Build-time(构造阶段):idea=>requirement=>design=>code=>installable(可安装)/executable package(可执行包)
Code-level view: source code.代码的逻辑组织:functions(函数),classes(类),methods(方法),interfaces(接口)
Component-level view:architecture(结构).代码的物理组织:files(文件),directories(目录),packages(包),libraries(库)
Moment view:特定时刻的软件形态
Period view:软件形态随时间的变化
(1)build-time,moment,and code-level view
三个内部关联的层面
1.词汇层面:lexical-oriented source code(面向词法的源代码)
2.语法层面:syntax-oriented program structure(面向语法的程序结构)AST(一种彻底结构化,将源代码变成一棵树,对树做各种操作==对源代码的修改)
3.语义层面:semantics-oriented program structure(面向语义的程序结构)(源代码具体想实现什么目标)
compoment-level
source code organized into directories
files encapsulated into package,components and sub-systems
reusable modules in the form of libraries
versioning
版本控制是给计算机软件的不同状态分配唯一的名字或者编号的过程
2.runtime view(运行阶段)
runtime:运行时:程序被载入目标机器,开始执行
Code-level view(代码层面):逻辑实体在内存中如何呈现
Component-level view(构件层面):物理实体在物理硬件环境中如何呈现
Moment view:逻辑/物理实体在内存/硬件环境中特定时刻的形态如何?
Period view:逻辑/物理实体在内存/硬件环境中的形态随时间如何变化?
high-level concepts run-time software
1.executable programs(可执行程序)
2,libraries(库项目)
3.configuration and data files(数据包和布局)
4.distributed programs(分散项目)
executable program
1.native machine code(原生机器码)
2.full program interpretation(程序完全解释执行)
3.interpreted byte codes(解释型字节码) 运用工具JVM和JIT
perl or python:在执行时为字节码解释执行
dynamic linking
库文件不会在build阶段被加入可执行软件中,仅仅做出标记
程序运行时,根据标记装载库至内存
发布软件时,需要将程序所依赖的所有动态库都复制给用户
优点:
类库变化时,不需要重新生成可执行程序
多个运行中程序可共享同一类库,优化内存使用
Run-moment-code:snapshot 快照 描述程序运行时内存里变量层面的状态 ,
Memory dump(内存转储/导出),一般用于程序发生故障终止
Run-period-code:sequence diagram序列图(时序交互)
Execution tracing 执行跟踪(代码层面,用日志方式记录程序执行的调用次序)
Run-moment-component:Deployment diagram(部署图:设备、操作系统)
Run-period-component:Event logging 事件日志(系统层面)
Event logging:系统管理员使用,高层次信息(如安装程序失败),有一定输出格式,不必敏捷
Execution tracing:开发者使用,低层次信息(如抛出异常),较低格式限制,必须敏捷
software construction:transformation between views
0到1(开发):计划-需求-设计-构造-测试-部署-运行维护
1到n(更新):更新维护
3.软件系统的质量因素
概述:外部质量因素影响用户;内部质量因素影响软件本身和它的开发者;外部质量取决于内部质量
(1)外部质量因素
正确性:
最重要的质量指标
按照预先定义的“规约”执行
每一层保证自己的正确性,同时假设其下层是正确的
测试和调试:发现不正确,消除不正确
防御式编程:在写程序的时候就保证正确性
形式化方法:通过形式化验证发现问题
健壮性:
针对异常情况的处理
健壮性是对正确性的补充
正确性:软件的行为要严格的符合规约中定义的行为
健壮性要求出现规约定义之外的情形的时候,软件要做出恰当的反应,并且在出现异常时不崩溃。
可扩展性:
对于软件的规约进行修改是否容易
通常,软件规模越大,扩展起来越不容易
可复用性:
一次开发,多次使用,发现共性
兼容性:
不同软件系统之间相互可容易的集成,标准化
性能:
性能毫无意义,除非有足够的正确性
对性能的关注要与其他质量属性进行折中
过度优化导致软件不再适应变化和复用
可移植性:
软件可方便的在不同的技术环境(硬件,操作系统)之间移植
易用性:
容易学习,安装,操作,监控
给用户提供详细的指南
功能性:
程序设计中一种不适宜的趋势,即软件开发者增加越来越多的功能,企图跟上竞争,其结果是程序极为复杂、不灵活、占用过多的磁盘空间。
每增加一小点功能,都确保其他质量属性不受到损失。
及时性:
当用户需要的时候,要能及时地设计出来
其他:可验证性(易于测试),完整性(预防非法破坏系统),可修复性(易于修复受损),经济性(性价比高)
(2)内部因素
复杂性几乎是所有外部质量因素的敌人
源代码相关的因素:代码行数,圈复杂度(一种代码复杂度的衡量标准。它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立线性路径条数,也可理解为覆盖所有的可能情况最少使用的测试用例数。圈复杂度大说明程序代码的判断逻辑复杂,可能质量低且难于测试和维护。程序的可能错误和高的圈复杂度有着很大关系。)
结构相关的因素:耦合度,聚合度(一个模块间内部各个元素间紧密程度的度量)
最重要的几个质量因素
Correctness and robustness:
reliability(可靠性)
Extendibility and reusability:
modularity(模块化)
软件构造中的五个关键质量目标
1.elegant and beautiful code/easy to understand
2.design for /with reuse/cheap for develop
3.low complexity/ready for change
4.rebustness and correctness/safe for bug
4.performance and efficiency/efficient to run
4.质量折中
正确的软件开发过程中,开发者应该将不同质量因素之间如何做出折中的设计决策和标准明确的写下来,
虽然需要折中,但正确性决不能与其他质量因素折中。