《重构 Ruby版》PDF下载

  • 购买积分:11 如何计算积分?
  • 作  者:(美)Jay Fields,(美)Shane Harvie,(美)Martin Fowler等著
  • 出 版 社:北京:机械工业出版社
  • 出版年份:2010
  • ISBN:9787111300786
  • 页数:297 页
图书介绍:本书是专门为职业Ruby程序员编写的重构指导。它的目标是向你展示如何以一种既受到严格控制又高效的方式进行重构。

第1章 重构初体验 1

1.1 起点 1

1.1.1 Movie 2

1.1.2 Rental 2

1.1.3 Customer 2

1.1.4 对起始程序的评价 4

1.2 重构第一步 5

1.3 Statement方法的分解和再组合 5

1.3.1 移动Amount的计算 9

1.3.2 提炼常客积分的计算 12

1.3.3 移除临时变量 15

1.4 用多态替换价格代码中的条件逻辑 19

1.5 小结 27

第2章 重构的基本原理 28

2.1 重构的起源 28

2.2 重构的定义 29

2.3 重构的理由 30

2.3.1 重构可以改进软件的设计 30

2.3.2 重构让软件变得易于理解 31

2.3.3 重构可以帮助你发现bug 32

2.3.4 重构可以帮助你更快地编程 32

2.4 重构的时机 32

2.4.1 事不过三 32

2.4.2 在添加功能时重构 33

2.4.3 在需要修复bug时重构 33

2.4.4 在进行代码复审时重构 33

2.4.5 为了更好地理解而重构(或者说,向着同一个目标进行重构) 34

2.5 为什么重构能起作用 34

2.6 我怎么跟经理说 35

2.7 抽象和重构 36

2.8 重构的问题 37

2.8.1 改变接口 37

2.8.2 数据库 38

2.8.3 难以重构的设计变化 38

2.8.4 什么时候不应该重构 39

2.9 重构和设计 40

2.10 竹篮打水一场空 41

2.11 重构和性能 42

2.12 优化薪资系统 43

第3章 代码里的坏味道 44

3.1 重复代码 44

3.2 方法过长 45

3.3 类太大 46

3.4 参数列表太长 46

3.5 发散型变化 47

3.6 霰弹型修改 47

3.7 特性依赖 47

3.8 数据泥团 48

3.9 基本类型偏执 48

3.10 case语句 49

3.11 平行继承体系 49

3.12 冗赘类 49

3.13 纯臆测的泛化 50

3.14 临时字段 50

3.15 消息链 50

3.16 中间人 51

3.17 过分亲密 51

3.18 异曲同工的类 51

3.19 不完善的类库 51

3.20 数据类 52

3.21 被拒绝的遗赠 52

3.22 注释 52

3.23 狂热的元编程 53

3.24 脱节的API 53

3.25 不断重复的样板文本 53

第4章 构建测试 55

4.1 自我测试代码的价值 55

4.2 Test∷Unit测试框架 56

4.3 程序员测试和质量保证测试 58

4.4 添加更多的测试 59

第5章 重构花名册 62

5.1 重构的格式 62

5.2 查找引用 63

第6章 组织方法 64

6.1 提炼方法 64

6.1.1 动机 65

6.1.2 手法 65

6.1.3 示例:没有局部变量 66

6.1.4 示例:使用局部变量 67

6.1.5 示例:重新给局部变量赋值 67

6.2 内联化方法 69

6.2.1 动机 69

6.2.2 手法 70

6.3 内联化临时变量 70

6.3.1 动机 70

6.3.2 手法 71

6.4 使用查询替换临时变量 71

6.4.1 动机 71

6.4.2 手法 71

6.4.3 示例 72

6.5 使用链式调用替换临时变量 73

6.5.1 动机 74

6.5.2 手法 74

6.5.3 示例 74

6.6 引入解释性变量 76

6.6.1 动机 76

6.6.2 手法 77

6.6.3 示例 77

6.6.4 采用提炼方法的手法 78

6.7 分解临时变量 78

6.7.1 动机 79

6.7.2 手法 79

6.7.3 示例 79

6.8 移除对参数赋值 81

6.8.1 动机 81

6.8.2 手法 81

6.8.3 示例 82

6.9 使用方法对象替换方法 83

6.9.1 动机 84

6.9.2 手法 84

6.9.3 示例 84

6.10 替换算法 86

6.10.1 动机 86

6.10.2 手法 87

6.11 使用集合闭包方法替换循环 87

6.11.1 动机 87

6.11.2 手法 87

6.11.3 示例 87

6.12 提炼环绕方法 88

6.12.1 动机 89

6.12.2 手法 89

6.12.3 示例 90

6.13 引入类标注 91

6.13.1 动机 92

6.13.2 手法 92

6.13.3 示例 92

6.14 引入命名参数 93

6.14.1 动机 94

6.14.2 手法 94

6.14.3 示例1:命名全部参数 94

6.14.4 示例2:只命名可选参数 95

6.15 移除命名参数 97

6.15.1 动机 97

6.15.2 手法 98

6.15.3 示例 98

6.16 移除未使用的默认参数 99

6.16.1 动机 100

6.16.2 手法 100

6.16.3 示例 100

6.17 动态方法定义 101

6.17.1 动机 101

6.17.2 手法 101

6.17.3 示例:通过def_each来定义相似的方法 102

6.17.4 instance_exec方法 102

6.17.5 示例:用类标注来定义实例方法 103

6.17.6 示例:通过扩展一个动态定义的模块来定义方法 104

6.18 使用动态方法定义替换动态接收器 105

6.18.1 动机 105

6.18.2 手法 105

6.18.3 示例:不用method_missing进行动态委托 105

6.18.4 示例:使用自定义数据来定义方法 106

6.19 隔离动态接收器 107

6.19.1 动机 107

6.19.2 手法 108

6.19.3 示例 108

6.20 把计算从运行时移到解析时 110

6.20.1 动机 111

6.20.2 手法 111

第7章 在对象之间移动特性 112

7.1 移动方法 112

7.1.1 动机 112

7.1.2 手法 113

7.1.3 示例 114

7.2 移动字段 115

7.2.1 动机 116

7.2.2 手法 116

7.2.3 示例 116

7.2.4 示例:使用自封装 117

7.3 提炼类 117

7.3.1 动机 118

7.3.2 手法 118

7.3.3 示例 118

7.4 内联化类 120

7.4.1 动机 120

7.4.2 手法 120

7.4.3 示例 121

7.5 隐藏委托 122

7.5.1 动机 122

7.5.2 手法 123

7.5.3 示例 123

7.6 移除中间人 124

7.6.1 动机 124

7.6.2 手法 125

7.6.3 示例 125

第8章 组织数据 126

8.1 自封装字段 126

8.1.1 动机 127

8.1.2 手法 127

8.1.3 示例 127

8.2 使用对象替换数据值 128

8.2.1 动机 129

8.2.2 手法 129

8.2.3 示例 129

8.3 将值对象改为引用对象 131

8.3.1 动机 131

8.3.2 手法 131

8.3.3 示例 132

8.4 将引用对象改为值对象 133

8.4.1 动机 134

8.4.2 手法 134

8.4.3 示例 134

8.5 使用对象替换数组 136

8.5.1 动机 136

8.5.2 手法 136

8.5.3 示例 136

8.5.4 使用Deprecation进行重构 138

8.6 使用对象替换Hash 139

8.6.1 动机 139

8.6.2 手法 140

8.6.3 示例 140

8.7 将单向关联改为双向关联 142

8.7.1 动机 142

8.7.2 手法 143

8.7.3 示例 143

8.8 将双向关联改为单向关联 145

8.8.1 动机 145

8.8.2 手法 145

8.8.3 示例 146

8.9 使用符号常数代替魔法数 147

8.9.1 动机 148

8.9.2 手法 148

8.10 封装集合 148

8.10.1 动机 148

8.10.2 手法 149

8.10.3 示例 149

8.10.4 将行为移入类里 151

8.11 使用数据类替换记录 152

8.11.1 动机 152

8.11.2 手法 152

8.12 使用多态替换类型码 152

8.12.1 动机 153

8.12.2 移除条件逻辑 153

8.12.3 手法 154

8.12.4 示例 154

8.13 使用模块扩展替换类型码 158

8.13.1 动机 158

8.13.2 手法 159

8.13.3 示例 159

8.14 使用状态或策略模式替换类型码 163

8.14.1 动机 163

8.14.2 手法 163

8.14.3 示例 164

8.15 使用字段替换子类 172

8.15.1 动机 172

8.15.2 手法 172

8.15.3 示例 173

8.16 惰性初始化的属性 175

8.16.1 动机 175

8.16.2 手法 175

8.16.3 以‖=为例 175

8.16.4 以instance_variable_defined?为例 176

8.17 及早初始化的属性 176

8.17.1 动机 176

8.17.2 讨论 177

8.17.3 手法 177

8.17.4 示例 177

第9章 简化条件表达式 178

9.1 分解条件语句 178

9.1.1 动机 179

9.1.2 手法 179

9.1.3 示例 179

9.2 重组条件语句 180

9.2.1 动机 180

9.2.2 示例:使用“Or”赋值替换三元操作符 180

9.2.3 示例:使用显式返回替换条件语句 180

9.3 合并条件表达式 181

9.3.1 动机 181

9.3.2 手法 181

9.3.3 示例:Ors 182

9.3.4 示例:Ands 182

9.4 合并重复的条件片段 183

9.4.1 动机 183

9.4.2 手法 183

9.4.3 示例 183

9.5 移除控制位 184

9.5.1 动机 184

9.5.2 手法 184

9.5.3 示例:使用break替换简单的控制位 185

9.5.4 示例:返回控制位的结果 186

9.6 使用守卫子句替换嵌套条件语句 187

9.6.1 动机 188

9.6.2 手法 188

9.6.3 示例 189

9.6.4 示例:逆转条件 190

9.7 使用多态替换条件语句 191

9.7.1 动机 191

9.7.2 手法 192

9.7.3 示例 192

9.8 引入null对象 194

9.8.1 动机 195

9.8.2 手法 196

9.8.3 示例 197

9.8.4 示例:测试接口 199

9.8.5 其他特殊情况 200

9.9 引入断言 200

9.9.1 动机 200

9.9.2 手法 201

9.9.3 示例 201

第10章 简化方法调用 203

10.1 重命名方法 204

10.1.1 动机 204

10.1.2 手法 204

10.1.3 示例 205

10.2 添加参数 205

10.2.1 动机 205

10.2.2 手法 206

10.3 移除参数 206

10.3.1 动机 206

10.3.2 手法 207

10.4 分离查询方法和修改方法 207

10.4.1 动机 207

10.4.2 手法 208

10.4.3 示例 208

10.4.4 并发问题 210

10.5 参数化方法 210

10.5.1 动机 210

10.5.2 手法 211

10.5.3 示例 211

10.6 使用显式方法替换参数 212

10.6.1 动机 212

10.6.2 手法 213

10.6.3 示例 213

10.7 保留完整对象 214

10.7.1 动机 214

10.7.2 手法 215

10.7.3 示例 215

10.8 使用方法替换参数 217

10.8.1 动机 217

10.8.2 手法 218

10.8.3 示例 218

10.9 引入参数对象 219

10.9.1 动机 219

10.9.2 手法 220

10.9.3 示例 220

10.10 移除设值方法 222

10.10.1 动机 222

10.10.2 手法 223

10.10.3 示例 223

10.11 隐藏方法 224

10.11.1 动机 224

10.11.2 手法 224

10.12 使用工厂方法替换构造函数 225

10.12.1 动机 225

10.12.2 手法 226

10.12.3 示例 226

10.13 使用异常替换错误码 228

10.13.1 动机 228

10.13.2 手法 228

10.13.3 示例 229

10.13.4 示例:在调用之前检查条件 229

10.13.5 示例:调用方捕捉异常 230

10.14 使用检测替换异常 231

10.14.1 动机 231

10.14.2 手法 232

10.14.3 示例 232

10.15 引入网关 234

10.15.1 动机 234

10.15.2 手法 234

10.15.3 示例 234

10.16 引入表达式构造器 238

10.16.1 动机 238

10.16.2 手法 238

10.16.3 示例 239

第11章 处理通用化 243

11.1 方法上移 243

11.1.1 动机 243

11.1.2 手法 244

11.1.3 示例 244

11.2 方法下移 245

11.2.1 动机 245

11.2.2 手法 245

11.3 提炼模块 246

11.3.1 动机 246

11.3.2 手法 247

11.3.3 示例 247

11.4 内联化模块 249

11.4.1 动机 249

11.4.2 手法 249

11.5 提炼子类 249

11.5.1 动机 250

11.5.2 手法 250

11.5.3 示例 250

11.6 引入继承 253

11.6.1 动机 253

11.6.2 手法 254

11.6.3 示例 254

11.7 削减层次 255

11.7.1 动机 256

11.7.2 手法 256

11.8 构造模板方法 256

11.8.1 动机 257

11.8.2 手法 257

11.8.3 示例1:使用继承的模板方法 257

11.8.4 示例2:使用模块扩展的模板方法 261

11.9 使用委托替换继承 266

11.9.1 动机 266

11.9.2 手法 267

11.9.3 示例 267

11.10 使用层次替换委托 268

11.10.1 动机 269

11.10.2 手法 269

11.10.3 示例 269

11.11 使用模块替换抽象父类 270

11.11.1 动机 271

11.11.2 手法 271

11.11.3 示例 271

第12章 大型重构 274

12.1 重构的本质 274

12.2 为什么大型重构很重要 275

12.3 四种大型重构 275

12.4 解开纠缠的继承 275

12.4.1 动机 275

12.4.2 手法 276

12.4.3 示例 277

12.5 将过程设计转换成对象设计 279

12.5.1 动机 280

12.5.2 手法 280

12.5.3 示例 281

12.6 将领域和表现分开 281

12.6.1 动机 281

12.6.2 手法 281

12.6.3 示例 282

12.7 提炼层次 285

12.7.1 动机 286

12.7.2 手法 286

12.7.3 示例 286

第13章 总结 289

参考文献 292

重构手法列表 293