Skip to content

Commit

Permalink
update tech books
Browse files Browse the repository at this point in the history
  • Loading branch information
adahsuzixin committed Jul 30, 2021
1 parent 6c85c53 commit be5c953
Show file tree
Hide file tree
Showing 21 changed files with 8,177 additions and 1 deletion.
48 changes: 48 additions & 0 deletions _posts/2021-01-01-TheArtofUnitTesting.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
---
title: 单元测试的艺术
layout: post
categories: 测试
tags: 单元测试 书籍
excerpt: 单元测试的艺术
---
# 第 1 章 单元测试基础
**回归**是以前运行良好但是现在不工作的一个或多个工作单元。

**遗留代码**在维基百科中定义为“与一个不再受支持或继续生产的操作系统,或其他计算机技术相关的源代码”,但是很多公司把任何比当前维护的应用更老旧的版本都称为遗留代码。这个词经常用来指代那些难以使用,难以测试,通常也更难以阅读的代码。

一个**单元测试**是一段自动化的代码,这段代码调用被测试的工作单元,之后对这个单元的单个最终结果的某些假设进行检验。单元测试几乎都是用单元测试框架编写的。单元测试容易编写,能快速运行。单元测试可靠、可读,并且可维护。只要产品代码不发生变化,单元测试的结果是稳定的。

## 1.7 成功进行TDD的三种核心技能
成功进行测试驱动开发,你需要三种技能集:知道如何编写优秀的测试、在编码前编写测试,以及良好的测试设计。

- 仅仅做到先编写测试,并不能保证测试是可维护、可读以及可靠的。你正在读的这本书讲的全都是进行优秀单元测试的技巧。
- 仅仅做到编写的测试可读、可维护,并不能保证你获得先编写测试的各种好处。市面上大部分讲TDD的书介绍的都是测试优先的技能,而不讲授优秀测试技能。我特别推荐Kent Beck的Test-Driven Development: by Example(Addison-Wesly Professional,2002)。
- 仅仅做到先编写测试,并且测试可读、可维护,并不能保证你得到一个设计完善的系统。设计能力才是使代码优美、可维护的关键。关于这方面的好书,我推荐Steve Freeman和Nat Pryce的Growing Object-Oriented Software, Guided by Tests(Addison-Wesly Professional,2009)以及Robert C. Martin的《程序员的职业素养》。

## 1.8 小结
一个优秀单元测试应具有的特质,如下所示:
- 一段自动化的代码,它调用另一个方法,然后检验关于此方法或类的逻辑行为的某些假设;
- 用一个自动化测试框架编写。
- 容易编写。
- 运行快速。
- 能由开发团队里的任何人重复执行。

# 第 2 章 第一个单元测试
## 2.1 单元测试框架
## 2.1.1 单元测试框架提供什么
![JCmpnI.png](https://s1.ax1x.com/2020/04/15/JCmpnI.png)
![](http://www.ituring.com.cn/figures/2020/ArtUnitTesting/02-001.png)

# 第 3 章 使用存根破除依赖
# 第 4 章 使用模拟对象进行交互测试
# 第 5 章 隔离(模拟)框架
# 第 6 章 深入了解隔离框架
# 第 7 章 测试层次和组织
# 第 8 章 优秀单元测试的支柱
# 第 9 章 在组织中引入单元测试
# 第 10 章 遗留代码
# 第 11 章 设计与可测试性
# 其他参考书籍
- Test-Driven development: by Example
- 程序员的职业素养
- Growing Object-Oriented Software, Guided by Tests
331 changes: 331 additions & 0 deletions _posts/2021-01-01-designPattern.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,331 @@
---
title: 大话设计模式
layout: post
categories: 设计模式
tags: C++ 设计模式 书籍
excerpt: 大话设计模式
---
# 第1章 代码无错就是优?——简单工厂模式
## 1.4 面向对象编程
- 封装
将业务计算`operation`封装成单独的运算类。
- 继承
- 多态

## 1.8 业务的封装
将业务逻辑和界面逻辑分开,让它们之间的耦合度下降。

## 1.9 紧耦合vs.松耦合
将加减乘除等运算分离,修改其中一个不影响另外的几个,通过继承来做到这一点。

## 1.10 简单工厂模式
创建一个工厂类来根据输入创建不同的类,`autosar`中的插件工厂就使用了这种模式。
```csharp
public class OperationFactory
{
public static Operation createOperate(string operate)
{
Operation oper = null;
switch (operate)
{
case "+":
{
oper = new OperationAdd();
break;
}
case "-":
{
oper = new OperationSub();
break;
}
case "*":
{
oper = new OperationMul();
break;
}
case "/":
{
oper = new OperationDiv();
break;
}
}
return oper;
}
}
```


第2章 商场促销——策略模式 17
2.1 商场收银软件 17
2.2 增加打折 18
2.3 简单工厂实现 19
2.4 策略模式 22
2.5 策略模式实现 25
2.6 策略与简单工厂结合 27
2.7 策略模式解析 28
第3章 拍摄UFO——单一职责原则 30
3.1 新手机 30
3.2 拍摄 30
3.3 没用的东西 31
3.4 单一职责原则 31
3.5 方块游戏的设计 31
3.6 手机职责过多吗? 33
第4章 考研求职两不误——开放-封闭原则 34
4.1 考研失败 34
4.2 开放-封闭原则 35
4.3 何时应对变化 36
4.4 两手准备,并全力以赴 37
第5章 会修电脑不会修收音机?——依赖倒转原则 38
5.1 MM请求修电脑 38
5.2 电话遥控修电脑 39
5.3 依赖倒转原则 40
5.4 里氏代换原则 41
5.5 修收音机 43
第6章 穿什么有这么重要?——装饰模式 44
6.1 穿什么有这么重要? 44
6.2 小菜扮靓第一版 45
6.3 小菜扮靓第二版 47
6.4 装饰模式 50
6.5 小菜扮靓第三版 53
6.6 装饰模式总结 56
第7章 为别人做嫁衣——代理模式 57
7.1 为别人做嫁衣! 57
7.2 没有代理的代码 58
7.3 只有代理的代码 60
7.4 符合实际的代码 61
7.5 代理模式 63
7.6 代理模式应用 65
7.7 秀才让小六代其求婚 66
第8章 雷锋依然在人间——工厂方法模式 67
8.1 再现活雷锋 67
8.2 简单工厂模式实现 68
8.3 工厂方法模式实现 69
8.4 简单工厂vs.工厂方法 71
8.5 雷锋工厂 72
第9章 简历复印——原型模式 77
9.1 夸张的简历 77
9.2 简历代码初步实现 78
9.3 原型模式 80
9.4 简历的原型实现 82
9.5 浅复制与深复制 84
9.6 简历的深复制实现 87
9.7 复制简历vs.手写求职信 89
第10章 考题抄错会做也白搭——模板方法模式 90
10.1 选择题不会做,蒙呗! 90
10.2 重复=易错+难改 91
10.3 提炼代码 93
10.4 模板方法模式 96
10.5 模板方法模式特点 98
10.6 主观题,看你怎么蒙 98
第11章 无熟人难办事?——迪米特法则 100
11.1 第一天上班 100
11.2 无熟人难办事 100
11.3 迪米特法则 102
第12章 牛市股票还会亏钱?——外观模式 103
12.1 牛市股票还会亏钱? 103
12.2 股民炒股代码 104
12.3 投资基金代码 106
12.4 外观模式 108
12.5 何时使用外观模式 110
第13章 好菜每回味不同——建造者模式 112
13.1 炒面没放盐 112
13.2 建造小人一 113
13.3 建造小人二 114
13.4 建造者模式 115
13.5 建造者模式解析 118
13.6 建造者模式基本代码 119
第14章 老板回来,我不知道——观察者模式 123
14.1 老板回来?我不知道! 123
14.2 双向耦合的代码 124
14.3 解耦实践一 126
14.4 解耦实践二 128
14.5 观察者模式 131
14.6 观察者模式特点 134
14.7 观察者模式的不足 135
14.8 事件委托实现 136
14.9 事件委托说明 139
14.10 石守吉失手机后的委托 140
第15章 就不能不换DB吗?——抽象工厂模式 141
15.1 就不能不换DB吗? 141
15.2 最基本的数据访问程序 142
15.3 用了工厂方法模式的数据访问程序 143
15.4 用了抽象工厂模式的数据访问程序 146
15.5 抽象工厂模式 149
15.6 抽象工厂模式的优点与缺点 151
15.7 用简单工厂来改进抽象工厂 151
15.8 用反射+抽象工厂的数据访问程序 154
15.9 用反射+配置文件实现数据访问程序 157
15.10 无痴迷,不成功 157
第16章 无尽加班何时休——状态模式 158
16.1 加班,又是加班! 158
16.2 工作状态-函数版 159
16.3 工作状态-分类版 160
16.4 方法过长是坏味道 162
16.5 状态模式 163
16.6 状态模式好处与用处 165
16.7 工作状态-状态模式版 166
第17章 在NBA我需要翻译——适配器模式 171
17.1 在NBA我需要翻译! 171
17.2 适配器模式 171
17.3 何时使用适配器模式 174
17.4 篮球翻译适配器 174
17.5 适配器模式的.NET应用 178
17.6 扁鹊的医术 178
第18章 如果再回到从前——备忘录模式 180
18.1 如果再给我一次机会…… 180
18.2 游戏存进度 180
18.3 备忘录模式 183
18.4 备忘录模式基本代码 184
18.5 游戏进度备忘 186
第19章 分公司=一部门——组合模式 189
19.1 分公司不就是一部门吗? 189
19.2 组合模式 190
19.3 透明方式与安全方式 193
19.4 何时使用组合模式 194
19.5 公司管理系统 194
19.6 组合模式好处 198
第20章 想走?可以!先买票——迭代器模式 200
20.1 乘车买票,不管你是谁! 200
20.2 迭代器模式 201
20.3 迭代器实现 202
20.4 .NET的迭代器实现 206
20.5 迭代高手 208

# 第21章 有些类也需计划生育——单例模式
## 21.1 类也需要计划生育
问题:有些类不需要反复创建实例

## 21.2 判断对象是否是null
解决办法:判断对象是否是null , 若是,创造新的实例;否则引用即可。
- 在不使用实例的时候要即使释放对象或者设置一个标志变量
- 将获取实例封装成一个方法

## 21.3 生还是不生是自己的责任
```cs
class Singleton
{
private static Singleton instance;
private static readonly object syncRoot = new object();
private Singleton()
{
}

public static Singleton GetInstance()
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
```
- 构造函数`Singleton``private`的,所以实例化这个对象的任务交给了这个类本身
- `GetInstance``public`的,外部只想着获取一个实例就可以了。

## 21.4 单例模式
```plantuml
@startuml
class Singleton{
-instance :Singleton
-Singleton()
+GetInstance()
}
@enduml
```

## 21.5 多线程时的单例
在获取实例的时候需要加锁

## 21.6 双重锁定
`if (instance == null)`这个判断需要做两次来避免错误。

## 21.7 静态初始化
饿汉单例模式:自己被加载时就将自己实例化
懒汉单例模式:要在第一次被引用时 ,才会将自己实例化

-----

第22章 手机软件何时统一——桥接模式 220
22.1 凭什么你的游戏我不能玩 220
22.2 紧耦合的程序演化 221
22.3 合成/聚合复用原则 225
22.4 松耦合的程序 226
22.5 桥接模式 229
22.6 桥接模式基本代码 231
22.7 我要开发“好”游戏 233
第23章 烤羊肉串引来的思考——命令模式 234
23.1 吃烤羊肉串! 234
23.2 烧烤摊vs.烧烤店 235
23.3 紧耦合设计 236
23.4 松耦合设计 237
23.5 松耦合后 240
23.6 命令模式 242
23.7 命令模式作用 244
第24章 加薪非要老总批?——职责链模式 245
24.1 老板,我要加薪! 245
24.2 加薪代码初步 246
24.3 职责链模式 249
24.4 职责链的好处 251
24.5 加薪代码重构 252
24.6 加薪成功 256
第25章 世界需要和平——中介者模式 257
25.1 世界需要和平! 257
25.2 中介者模式 258
25.3 安理会做中介 262
25.4 中介者模式优缺点 265
第26章 项目多也别傻做——享元模式 267
26.1 项目多也别傻做! 267
26.2 享元模式 269
26.3 网站共享代码 272
26.4 内部状态与外部状态 274
26.5 享元模式应用 277
第27章 其实你不懂老板的心——解释器模式 279
27.1 其实你不懂老板的心 279
27.2 解释器模式 280
27.3 解释器模式好处 282
27.4 音乐解释器 283
27.5 音乐解释器实现 284
27.6 料事如神 289
第28章 男人和女人——访问者模式 291
28.1 男人和女人! 291
28.2 最简单的编程实现 292
28.3 简单的面向对象实现 293
28.4 用了模式的实现 295
28.5 访问者模式 300
28.6 访问者模式基本代码 301
28.7 比上不足,比下有余 304
第29章 OOTV杯超级模式大赛——模式总结 305
29.1 演讲任务 305
29.2 报名参赛 305
29.3 超模大赛开幕式 306
29.4 创建型模式比赛 309
29.5 结构型模式比赛 314
29.6 行为型模式一组比赛 321
29.7 行为型模式二组比赛 325
29.8 决赛 330
29.9 梦醒时分 333
29.10 没有结束的结尾 334
附 录 A 培训实习生——面向对象基础 335
A.1 培训实习生 335
A.2 类与实例 335
A.3 构造方法 337
A.4 方法重载 338
A.5 属性与修饰符 340
A.6 封装 342
A.7 继承 343
A.8 多态 347
A.9 重构 350
A.10 抽象类 353
A.11 接口 354
A.12 集合 358
A.13 泛型 360
A.14 委托与事件 362
A.15 客套 366
附 录 B 参考文献 367
7 changes: 7 additions & 0 deletions _posts/2021-01-01-dsaa_c++4.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
title: 数据结构与算法分析c++描述
layout: post
categories: 算法
tags: C++ 算法 书籍
excerpt: 数据结构与算法分析c++描述
---
2 changes: 1 addition & 1 deletion _posts/2021-01-01-postgresql-c1.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: PostgreSQL 数据库内核分析-c1
layout: post
categories: PostgreSQL
tags: PostgreSQL 代码架构
tags: PostgreSQL 体系结构 书籍
excerpt: PostgreSQL 数据库内核分析-c1
---
# 1. PostgreSQL代码结构
Expand Down
Loading

0 comments on commit be5c953

Please sign in to comment.