软件构造 第一章
一、课程简介
1.软件构造课程的目标
①程序设计与实现能力
②系统设计与实现能力
③系统分析与评价能力
④利用现代软件构造工具的能力
2.传统软件设计步骤
①讨论需要写的软件并实现②测试代码并改错③重复②。图示如下
3.更好的软件设计
①未雨绸缪②考虑非功能质量属性③考虑多种设计选择④把设计决策明确写下来
4.设计的目标、原则和模式
设计目标:编程的视野
设计原则:编程的标尺
设计模式:编程的经验
二、软件构造多维视图
1.什么是软件
(1)构成:
·程序program:ui, algorithms, utilities, apis, test cases, etc
·数据data:files, databases, etc
·文档documents:srs需求规格说明, sdd设计规格说明, user manuals, etc
(2)考虑因素
·用户:谁来使用
·商业目标:为何有用
·社会环境:应遵循何种法则
·技术环境:如何实施
·硬件/网络:在何处运行
2.软件构造的多维视图
(1)build-time views
概述:build-time:idea->requirement->design->code->installable/executable package (软件构造的核心过程和环节)
code-level view:源代码:在逻辑上源代码是如何由基本程序块(比如函数,类,方法,接口等等)构成的
component-level view:组件:源代码是如何通过文件,目录,包,库之间的依赖关键进行物理上的组织
moment view:时刻:在某一时刻,源代码和组件的情况
period view:时期:程序如何随时间改善
①build-time,moment,and code-level view
三种内部相互关联的形式:面向此法的源代码、面向语法的程序结构(ast(抽象语法树))、面向语义的程序结构(class diagram)
②build-time,period,and code-level view
代码随着时间变化:添加,修改或者删除文件,使其从一个版本到另一个版本
③build-time, moment, and component-level view
源代码物理地组织成文件,其进一步按目录组织
文件被封装成包、组件和子系统
可复用模块形成类库
库:库存储在自己的磁盘文件中,收集一组代码函数,可以在各种程序中重用。
来源:os预装,语言自带,第三方,自行开发
与库链接:步骤:用到的类库列表->复制类库到可执行程序中
静态链接:库是单个目标文件的集合,在编译过程中,将类库文件复制到可执行文件中,称为可执行文件的一部分
uml图
④build-time, period, and component-level view
文件,包,组件和库如何随着时间变化
软件配置项(sci)
版本控制系统(vcs)
版本控制是给计算机软件的不同 状态分配唯一的名字或者编号的过程
软件演化是指软件产生之 后,由于不同的原因对其进行持续地升级过程。
(2)runtime views
code-level : 可执行程序的内存状态,程序之间的互动、调用
component-level:软件包部署到物理环境(os、network、硬件等),及其互动
moment view:特定时刻的程序行为
period view:随着时间的行为
可执行程序:cpu执行的机器可读指令序列以及相关的数据值
库:可以由不同程序重用的常用对象代码的集合,大多数系统包含一系列库,不能直接在目标机器上加载和执行,必须首先与一个可执行程序链接。
本地机器代码:
源代码被加载入内存进行解释执行,转化为cpu能识别的机器码
程序被编译成字节码形式(如 java的class文件) ,运行时需要由解析器转换成机器码或者解释执行
解释字节码:在执行时编译为字节码解释执行
动态链接:
不将目标文件复制到可执行程序 中,而是会标注用到的类库
在运行时,加载用到的库到内存中,然后同主程序链接
部署时需要将用到的类库同程序一起部署
优点:类库 变化时,不需要重新生成可自行程序 、多个运行中程序可共享同一类 库,优化内存使用
⑤ run-time, moment, and code-level view
快照图:刻画内存中某时刻变量的状态
内存转储:包含进程内存副本的硬盘上的文件,当进程被某些内部错误或信号中止时生成
⑥run-time, period and code-level view
uml:程序单元之间的交互
⑦run-time, moment, and component-level view
uml中的部署:
⑧run-time, period, and component-level view
事件记录 | 软件追踪 |
由系统管理员使用 | 开发人员使用 |
记录高级信息 | 记录低级信息 |
不包含太多重复事件或者无用信息 | 可以包含重复事件或者无用信息 |
需要标准的输出格式 | 输出格式没有限制 |
事件日志需要本地化 | 很少考虑本地化 |
对于添加新类型的事件或消息不灵活 | 对于添加新的追踪消息必须灵活 |
三、软件构造的质量目标
外部质量:外部质量是用户能够感受到的,影响用户的使用
内部质量:影响使用代码的相关人员,影响软件本身和开发者
1.外部质量
1)正确性(主要质量):正确性是软件产品执行其规范所定义的确切任务的能力。每层都要确保自己是正确的,同时假定其调用的低层也是正确的。
检查和调试、防守编程、标准化编程
2)健壮性:健壮性是软件系统对异常情况作出适当反应的能力。
健壮性同异常情况相关,异常或非异常取决于程序的规 格说明
判断是否是异常的标准,不取决于客观的正确标准,而取决于程序的规格说明
3)可扩展性:可扩展性是指软件易于调整以适应变化的能力。
提升可扩展性的两个原则:简约主义设计,*设计
4)复用性:可重用性是软件元素用于构建许多不同应用程序的能力。
软件经常遇到相似的模式,利用共性,避 免重复实现。
难点:不同软件 有不同的设定/规定
5)兼容性:不同软件系统之间相互可容的集成
难点:不同软件 有不同的设定/规定
标准化是解决兼容性的关键:标准化文件格式,标准化数据结构,标准化用户接口
通过协议来实现更通用的兼容性
6)效率:效率是软件系统对硬件资源尽可能 少的需求的能力
正确性是效率的前提
7)可移植性:可移植性是指便于将软件产品 转移到各种硬件和软件环境。
8)易用性:用户可以轻松掌握软件的使用,也包括安 装、运行和监控的容易度
结构清晰、 理解用 户,换位思考,站在用户的角度设计软件
9)功能性:系统提供的可能性范围
过多的新功能容易带来一 致性的缺失,影响易用性
更难的问题是避免如此专注于功能而忘记其他品质
在质量提升技术的帮助下,可以在整个项目中保持质量水平不变,而不仅仅 是功能性。
10)及时性:及时性是软件系统在用户需要时或之前发布的能力。
11)其他品质:
可验证性:是否易于验证
完整性:软件系统保护其各种组件(程序和数据)免受未经授权的 访问和修改的能力。
可修复性:可修复性是促进缺陷修复的能力。
经济性:同及时性相伴,是系统能 够按照其分配的预算或低于预算完成的能力。
2.内部品质
代码:loc(圈复杂度, 用来衡量一个模块判定结构的复杂程度 )
结构:耦合度,内聚度,设计中追求高内聚和低耦合
可读性、可理解性、大小,复杂性,整洁性
内部质量因素通常用作外部质量因素的部分度量
3.质量属性间的权衡
完整性和易用性
经济性和功能性、可重用性
效率与可移植性、可重用性
及时性和可拓展性
正确性放在首要地位
4.软件构建的关键问题
系统的软件构建方法
形式化的软件规格说明
在开发过程中自动检查
更好的语言机制
一致性检查工具
5.软件构造的五个关键目标
1.可理解性:
代码的可理解性(变量/子程序/ 语句的命名与构 造标准、代码布 局与风格、注释、 复杂度)
构建-组件-时刻:构件/项目的可理解 性(包的组织、文 件的组织、命名空 间)
·构建-代码-周期:重构
·运行-代码-时刻:日志跟踪
2.可复用性
构建-代码:adt/oop; 接口与实现分离; 重载; 继承/重载/重写; 组合/代理; 多态; 子类型与泛型编 程; oo设计模式
构建-组件:api设计,库,可重用的框架
3.可维护性和适应性:
构建-代码:模块化设计; 聚合度/耦合度; solid; oo设计模式;格式化、规范化、语法化编程
构建-组件:solid grasp、软件版本控制
4.健壮性
·构建-代码:异常处理、防御编程、先验程序
·构建-组件:单元测试、集成测试
·构建-周期:回归测试
运行-时刻:调试转储
运行-周期:日志跟踪
5.性能
构建-代码:设计模式
运行-代码:空间复杂性(内 存管理); 时间复杂性(算 法性能); 代码调优
运行-组件:分布式系统
运行-代码-时期:性能分析和调整、
运行-组件-时期:并行/多线程程序
下一篇: Java 位运算符