软件构造知识点总结 - 1
第一章
第一节 软件构造的多维视图
BulidTime概述
三种相互关联的形式
面向词法 半结构化源代码
面向语法 (AST抽象语法树)半结构化的源代码变成语法树
面向语义UML
Runtime概述
运行时软件的高级概念
可执行程序:CPU能直接理解执行的指令序列(二进制文件)
库文件:可复用的代码,库文件本身不能执行
可执行程序的四种形式
本地机器码,自解码,静态链接,动态链接
第二节 软件开发的质量属性
外部质量属性
1.正确性: 在规格说明书描述范围之内满足正确性; 保证正确性的技术: 1.有限制的正确(只保证自己层面的正确,假设调用的都是正确的
2.测试与调试 3.防御性编程 4.形式化编程(采用很多数学技术)
健壮性: 碰到异常情况进行适当的响应;出现规格说明书之外的情况由健壮性处理(响应异常情况、给出错误提示、正常退出或降级)
可扩展性: 软件模块能否被其他程序很方便的使用(开发备注、封装)
兼容性: 能够与其他人进行交互;跨平台、跨软件,实现方法: 一致性和标准化(一致的方法和标准): 标准文件格式,标准数据结构,标准用户接口,标准协议。
效率: 程序运行中对CPU、硬盘的占用带宽(好的算法、I/O技术、内存管理)
可移植性: 是否容易由一个环境转移到另一个环境。
应用性: 用户是否容易使用,不影响专业人员的使用情况下,方便初学者(结构清晰的设置、UI设计要理解用户需求)
功能性: 蠕变特征,原则是在保证整体质量不降低的情况下进行更新,策略:增量式模型
及时性: 在规定时间内完成: 时间效率高
其他质量特性: 可验证性(如管理系统的效果难以验证)、完整性(不会被非法访问干扰修改,防止数据不一致)、可修改性、资金
内部质量属性
五个关键的质量属性
easy to understand
ready fot change
cheap for develop
safe from bugs
efficient to run
可理解性: 1.在构建时: 代码层要注意(函数规约): 变量/子程序/语句的命名与构造标准;代码布局与风格;注释;复杂度 组件层要注意构建和项目的可理解性: 包的组织;文件的组织;命名空间 在时段中,代码层注意重构 2.在运行时,代码层注意跟踪日志
可复用性: 1.构建时 代码层应注意:ADT/OOP;接口与实现分离;继承/重载/重写;
组合/代理;多态;自类型与泛型编程;OO设计模式 组件层注意:API接口设计;类库;框架
可维护性与适用性: 1.构建时(面对需求的改变,能否做出及时的调整) 代码层可采用:模块化设计;高内聚,低耦合;SOLID原则;OO设计模式;面向图表的编程;面向状态编程;面向语法编程 组件层除注意SOLID原则外,还应考虑GRASP原则 在时段内使用SCM进行版本控制
健壮性: 1.Code level-build time-Moment:错误处理;异常处理;断言;防御性编程;测试优先编程 2.Component level-build time-period:单元测试;集成测试 3.Build time-period:回归测试 4.run time-moment:测试转储 5.run time-period:跟踪日志
性能: 1.构建时,使用指定的设计模式 2.运行时 在代码层次: 通过内存管理考虑空间复杂度;通过算法性能计算时间复杂度;利用代码调优生成更高效的目标代码;在时段内进行性能分析和调整 在组件层次:采用分布式系统;编写多线程的并行程序
第二章
第一节 软件声明周期和版本控制(配置管理)
软件生命周期
声明周期:两种形态 1.从0到1:SDLC 2.从1到n:运用版本控制技术实现迭代更新
瀑布模型:Requirements->Design->Implementation->Verification->Maintenance
增量模型:运用分治的思想,将需求分段,成为一系列增量产品,每个增量颞部仍使用瀑布模型
V模型:对瀑布模型的改变,强调测试与继承,对代码、分析文档进行质量保证
螺旋模型:采用一种周期性的方法来进行系统开发。优点:设计上的灵活性,可以在项目的各个阶段进行变更,以小的分段来构建大型系统,使成本计算变得简单容易。
#### 版本控制工具—Git
Git的整体架构——四个仓库(本地由三个):工作目录;暂存区域(在menmory中,对用户不可见)(隐藏的.git文件夹中的stage);本地库:源代码;云端软件服务器(远程仓库)
利用对象图结构:每个节点保存:父节点、如提交时间的信息;VCS还原差异、Git保存完整文件;Git对于重复文件,不复制文件,只修改指针;减少冗余;访问速度快
分支代码:git(创建) branc(切换) -b(branch) iss53;git merge hitfix(合并);是用git把文件添加进去,实际上就是把文件修改添加到暂存区;用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
本地库和远程库:clone:将整个库完整的复制;fetch:将某一分支复制下来;push:将粉直推送到服务器上;pull:将某一分支复制下来合并在当前分支上
第二节 软件构造的过程、系统和工具
广义的软件构造过程:
1.编程
开发语言:使用IDE的优势:方便编写代码和管理文件(有代码编辑器,代码重构工具、文件和库管理工具) 能够编译、构建(有编译器、解释器、自动构建工具) 结构清晰(有面向对象的类层次结构图和类浏览器) 有GUI界面 支持第三方扩展工具
建模语言:UML(统一建模语言):UML是用来对软件系统进行可视化建模的一种语言; UML的结构由一组一致的规则定义; 建模的目的:有助于按照需求对系统进行可视化分析 能够理解系统的结构或行为 给出了构造系统的模板 对做出的决策进行文档化
配置语言:键值文件(.ini;.properties;.rc);XML,YAML,JSON:配置语言用于配hi程序的参数和初始化设置 目的:部署环境设置;应用程序功能的变体;组件之间连接的变体
2.静态代码分析:
是指不运行被测程序本身,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性(提供了对代码结构的理解、有助于确保代码符合行业标准)
3.动态代码分析:
是指通过运行被测试程序,检查运行结果与预期结果的差异,并分析运行效率、正确性和健壮性等功能(必须执行足够的测试输入,使用诸如代码覆盖率之类的软件测试措施有助于确保已经观察到程序的一组可能i行为的足够部分)
狭义的软件构造过程
1.主要的知识结构
Build场景综述:
用传统编译语言如C、C++、Java编写软件(complilation)
用解释型语言(如Perl、python)编写软件的打包和测试(packing and testing)
用基于Web的应用程序进行编译和打包(使用静态HTML页面、使用Java或C#编写的源代码、使用JSP、ASP或PHP语法编写的混合文件以及多种类型额配置文件)
执行单元测试代码的其余部分对软件进行隔离验证
执行静态分析工具来识别程序源代码中的错误
生成PDF或HTML文档