作为软件工程专业的核心课程之一软件构造结束了,不为博客分数,只为能留下点什么。
PS:下面大多都是我个人的理解,用词上可能不太严谨。

一.多维视图

Snipaste_2019-06-23_22-58-36.png

讲述了一个完整的程序的解剖图,不难看出,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。

十四.等价性

观察等价性:调用Observer,Producer,Creater等查看是否相等。(更加严格)

行为等价性:所有操作的任意方法的结果都一致。

十五.协变与逆变

协变:越来越具体

协变:越来越抽象

十六.性能相关设计模式

1.轻量模式:Word中字母的例子,每一个字母表示其本身,有26个对象,字体大小等以参数的形式有Client来操作给出。

2.原型模式:就是做好一个,然后后面的都拷贝这个对象,减少new,注意默认为浅拷贝,深拷贝才好。

3.对象池模式:把所有的对象存起来不让GC,一空间换取时间。

文章目录