软件构造 第一章

一、课程简介

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.性能

构建-代码:设计模式

运行-代码:空间复杂性(内 存管理); 时间复杂性(算 法性能); 代码调优

运行-组件:分布式系统

运行-代码-时期:性能分析和调整、

运行-组件-时期:并行/多线程程序

 

猜你喜欢

转载自www.cnblogs.com/boston-o/p/10462860.html