哈工大-软件构造-复习
作为软件工程专业的核心课程之一软件构造结束了,不为博客分数,只为能留下点什么。 PS:下面大多都是我个人的理解,用词上可能不太严谨。
一.多维视图
讲述了一个完整的程序的解剖图,不难看出,Code-level是代码逻辑层面,Component-level是代码的物理层面代码本身的文件等等,Moment代表程序在某一时刻的情况,而Period代表程序在生产周期里面相关的事项。Build-time和Run-time就不难理解啦,一个是编译阶段,一个是运行阶段,图上的内容不需要死记硬背,根据特性记忆就可以,唯一需要说的是AST是语法分析树,就是解剖代码的东西,知道了这些,就很好判断位置啦。
二.SOLID原则
先放上对应,下面我会用尽量短的语句来介绍它们
SRP The Single Responsibility Principle 单一责任原则
OCP The Open-Closed Principle 开放-封闭原则
LSP The Liskov Substitution Principle Liskov替换原则
ISP The Interface Segregation Principle 接口聚合原则
DIP The Dependency Inversion Principle 依赖转置原则
S:一个类一个作用,自己干自己的事。 O:防止修改,开放扩展。 L:LSP原则,替换时前置更弱后置更强。总的来说就是只能更加好用。 I:不要有大型接口,尽量小一点,使用的时候再组装起来。 D:不同的类只能依赖于其抽象父类,互相尽量不要有黏连。
三.设计模式
1.Factory method pattern 工厂方法模式
利用一个工厂类制造出同一类不同的具体类。
2.Abstract factory pattern 抽象工厂模式
利用多个类的工厂聚合出有构架的对象。(Client参与构建过程,东西可能不同但是搭配一定一样)
3.Builder pattern 构造器模式
利用多个类的工厂聚合出有构架的对象。(内含复杂的构建过程,但Client不可见)
4.Bridge 桥接模式
在创建一个类的时候永久delegation进去另外一个类,利用该类特性。
5.Proxy Pattern 代理模式
通过代理类访问具体类。
6.Composite 组合模式
用一个数据结构保存很多其他组合对象。
7.Observer 观察者模式
偶像类有很多粉丝类对象,粉丝利用偶像加入偶像,偶像做出改变通知粉丝。(类似微博)
8.Visitor pattern
设计一个方法,参数是接口,供类内使用该方法时可以扩展。(OCP原则)
9.State pattern 状态模式
就是设计状态构造一个自动机。
10.Memento pattern 备忘录模式
记录一个类的历史状态,可以恢复和管理历史状态。
11.Adapter 适配器模式
某些类和接口Client无法使用,使用Adapter使其转化为可以适配的形式。
12.Decorator 修饰器
通过delegation或者继承的方式为该类增加新特性。
13.Façade 外观模式
将该类封装成简单易操作的形式。(可以想象成要做一个GUI供外界使用)
14.Strategy 策略模式
为某一个方法设计多种不同的算法。(与visitor的区别是这里侧重于算法,方法作用一致,只是性能上面有区别)
15.Template method 模板模式
做事情的步骤一样,但具体方法不同,共性的步骤在抽象类内公共实现,差异化的步骤在各个子类中实现。使用继承和重写实现模板模式。
16.Iterator 迭代器
独立于元素类型,访问容器内的所有元素。
四.线程安全
1.限制数据共享(各用各的,不会发生竞争)
2.共享不可变数据(使用不可变数据类型,防止修改竞争)
3.共享线程安全的可变数据类型(注意只是操作原子,多个方法同时使用的时候依旧会不安全)
4.使用锁的机制共享线程,防止竞争。
五.测试
白盒测试:依据代码结构测试代码(已知代码)
黑盒测试:仅根据Spec测试数据。(TDD测试驱动开发)
六.软件开发模型
基本类型:Linear 线性过程;Iterative 迭代过程
Waterfall 瀑布过程(线性非迭代)
阶段清楚,管理简单,无法适应需求变化
Incremental 增量过程(非迭代)
多个瀑布串行,比较容易适应需求的增加(有需求就增加一个瀑布)
V-Model V字模型(验证,确认)
Prototyping 原型过程(迭代)
在原型上持续不断的迭代,发现用户变化的需求 迭代:开发出来后由用户试用/评审,发现问题反馈给卡发着,开发者修改原有的实现,继续交给用户评审 时间代价高,但开发质量也高
Spiral 螺旋过程(迭代)
多轮迭代基本遵循瀑布模式 每轮迭代有明确的目标,遵循"原型"过程,进行严格的风险分析,方可进入下一轮迭代
Agile development 敏捷开发
通过快速迭代和小规模的持续改进,以快速适应变化 用户高度参与,小步骤迭代确认验证。强调人的作用
七.内部/外部质量指标
1.External quality factors 外部质量
Correctness 正确性:按照spec执行,得到正确的结果,软件的行为要严格符合规约中定义的行为 保证正确性:测试和调适、防御式编程,形式化方法(形式化语言) encapsulation, decentralization 封装、分散化
Robustness 健壮性:针对异常情况的处理:出现规约定义之外的情形,软件做出恰当的反应(出现异常时不要崩溃),未被spec覆盖的情况即为"异常情况" encapsulation, error handling封装、异常处理
Extendibility 可扩展性:是否容易使软件适应规约的变化 提升可扩展性的两个原则:简约主义设计,分离主义设计 encapsulation, information hiding封装,信息隐蔽(结构良好的对象有简单的接口,并且不向外界显漏任何内部机制。)
Reusability 可复用性:一次开发,多次使用,发现共性 modularity, component, models, patterns模块化、组件、模型、模式
Compatibility 兼容性:不同软件系统之间相互可容易的集成 保持设计的同构性:标准化文件格式,标准化数据结构,标准化用户接口
Efficient 性能:良好的运行性能
Portability 可移植性:软件可方便的在不同的技术环境之间移植:硬件、操作系统 Ease of use 易用性:易学、安装、操作、监控 给用户提供详细的指南,结构简单
Functionality 功能:功能完善。
Timeliness 及时性:及时发布等 其他质量:verifiability 可验证性、integrity完整性,repairability可修复性,economy经济型
2.Internal quality factors 内部质量
代码相关:lines of code(LOC)、cyclomatic complexity 循环复杂性
结构相关:coupling耦合度(多个模块间联系),cohesion聚合度(一个模块;高内聚,一个程序只执行一种功能) (应当 高内聚低耦合,单一责任原则)
Readability 可读性
Understandability 可理解性
Clearness 清晰
Size 文件大小
重要的内部指标:
Correctness and robustness: reliability(可靠性)
Extendibility and reusability: modularity(模块化)
八.软件构造的五个关键质量目标
1.Easy to understand: elegant and beautiful code / understandability 便于理解
Understandability:注释、命名、日志等
2.Cheap for develop: design for/with reuse: reusability 发展
Reusability:ADT、OOP、设计模式等以及复用外部文件
3.Ready for change: maintainability and adaptability 变化
Maintainability and Adaptability
4.Safe from bugs: robustness 安全
Robustness 异常处理、断言、防御式变成、测试优先原则、日志追踪、debug、内存导出
5.Efficient to run: performance 高效
Performance 代码调优、空间复杂性(内存管理)、时间复杂性(I/O性能等),分布式系统,多线程
九.软件配置管理SCM与版本控制系统VCS
1.VCS version control system
- Local VCS 本地:仓库在开发者本地机器
- Centralized VCS 集中式:仓库在独立的服务器
- Distributed VCS 分布式:仓库在独立的服务器+开发者本地机器
2.SCM 软件配置管理:追踪和控制软件的变化
- SCI 软件配置项:软件中发生变化的基本单元(如一个文件)
- Baseline 基线:软件持续变化过程中的"稳定时刻"(如 对外发布的版本)
- CMDB 配置管理数据库:存储软件的各配置项随时间发生变化的信息+基线(git的本地repository?)
- Version 版本控制
十.Git的结构、工作原理、基本指令
1.结构
- Working directory 工作目录:本地文件系统 (已修改,未暂存)
- Staging area 暂存区:隔离工作目录和git仓库 (已暂存)
- .git directory 本地仓库(本地CMDB) (已提交)
2.指令
$ git status Lists all new or modified files to be committed
$ git add [file] Snapshots the file in preparation for versioning
$ git reset [file] Unstages the file, but preserve its contents
$ git diff Shows file differences not yet staged
$ git diff --staged Shows file differences between staging and the last file version
$ git commit -m "[descriptive message]" Records file snapshots permanently in version history
$ git branch Lists all local branches in the current repository
$ git branch [branch-name] Creates a new branch
$ git checkout [branch-name] Switches to the specified branch and updates the working directory
$ git merge [branch] Combines the specified branch’s history into the current branch
$ git branch -d [branch-name] Deletes the specified branch
$ git init [project-name] Creates a new local repository with the specified name
$ git clone [url] Downloads a project and its entire version history
$ git fetch [bookmark] Downloads all history from the repository bookmark
$ git merge [bookmark]/[branch] Combines bookmark’s branch into current local branch
$ git push [alias] [branch] Uploads all local branch commits to GitHub
$ git pull Downloads bookmark history and incorporates changes
上面需要注意pull=fetch + merge
2.Object Graph
版本之间的演化关系图,一条边B->A表示在版本A的基础上做出改变,形成了版本B,这代表所有的顶点至少有一个入度,至少有0个出度
十一.Mutable & Immutable
1.final关键字
final类无法产生子类,final变量无法改变值和引用,final方法无法被子类重写
2.snapshot图
不可变类型使用双线椭圆,可变类型用单线椭圆。 不可变引用使用双线箭头,可变引用用单线箭头。 双线不可以被划掉。
十二.ADT的四种操作类型
1.Creator:ex:Integer.valueOF() 返回值为类本身
1.Mutator:ex:a.add() 一般返回值为void
1.Producer:ex:Collcetions.unmodifiableList() 返回值为本身
1.Observer:ex:a.size() 返回值一般为其他类型
十三.AF与RI
1.AF:抽象函数,Rep与抽象空间建立的函数。
2.RI:表示的合法性。
PS:同样的RI也可能有不同的AF。