auto commit

This commit is contained in:
CyC2018 2018-03-04 15:02:40 +08:00
parent 1da18aa1a1
commit 1634228ad3

View File

@ -1,6 +1,6 @@
<!-- GFM-TOC -->
* [第一章 第一个案例](#第一章-第一个案例)
* [第二章 重构原则](#第二章-重构原则)
* [第一个案例](#第一个案例)
* [重构原则](#重构原则)
* [定义](#定义)
* [为何重构](#为何重构)
* [三次法则](#三次法则)
@ -9,7 +9,7 @@
* [何时不该重构](#何时不该重构)
* [重构与设计](#重构与设计)
* [重构与性能](#重构与性能)
* [第三章 代码的坏味道](#第三章-代码的坏味道)
* [代码的坏味道](#代码的坏味道)
* [1. Duplicated Code重复代码](#1-duplicated-code重复代码)
* [2. Long Method过长函数](#2-long-method过长函数)
* [3. Large Class过大的类](#3-large-class过大的类)
@ -32,9 +32,9 @@
* [20. Data Class幼稚的数据类](#20-data-class幼稚的数据类)
* [21. Refused Bequest被拒绝的馈赠](#21-refused-bequest被拒绝的馈赠)
* [22. Comments过多的注释](#22-comments过多的注释)
* [第四章 构筑测试体系](#第四章-构筑测试体系)
* [第五章 重构列表](#第五章-重构列表)
* [第六章 重新组织函数](#第六章-重新组织函数)
* [构筑测试体系](#构筑测试体系)
* [重构列表](#重构列表)
* [重新组织函数](#重新组织函数)
* [1. Extract Method提炼函数](#1-extract-method提炼函数)
* [2. Inline Method内联函数](#2-inline-method内联函数)
* [3. Inline Temp内联临时变量](#3-inline-temp内联临时变量)
@ -44,7 +44,7 @@
* [7. Remove Assigments to Parameters移除对参数的赋值](#7-remove-assigments-to-parameters移除对参数的赋值)
* [8. Replace Method with Method Object以函数对象取代函数](#8-replace-method-with-method-object以函数对象取代函数)
* [9. Subsititute Algorithn替换算法](#9-subsititute-algorithn替换算法)
* [第七章 在对象之间搬移特性](#第七章-在对象之间搬移特性)
* [在对象之间搬移特性](#在对象之间搬移特性)
* [1. Move Method搬移函数](#1-move-method搬移函数)
* [2. Move Field搬移字段](#2-move-field搬移字段)
* [3. Extract Class提炼类](#3-extract-class提炼类)
@ -53,7 +53,7 @@
* [6. Remove Middle Man移除中间人](#6-remove-middle-man移除中间人)
* [7. Introduce Foreign Method引入外加函数](#7-introduce-foreign-method引入外加函数)
* [8. Introduce Local Extension引入本地扩展](#8-introduce-local-extension引入本地扩展)
* [第八章 重新组织数据](#第八章-重新组织数据)
* [重新组织数据](#重新组织数据)
* [1. Self Encapsulate Field自封装字段](#1-self-encapsulate-field自封装字段)
* [2. Replace Data Value with Object以对象取代数据值](#2-replace-data-value-with-object以对象取代数据值)
* [3. Change Value to Reference将值对象改成引用对象](#3-change-value-to-reference将值对象改成引用对象)
@ -70,7 +70,7 @@
* [14. Replace Type Code with Subcalsses以子类取代类型码](#14-replace-type-code-with-subcalsses以子类取代类型码)
* [15. Replace Type Code with State/Strategy (以 State/Strategy 取代类型码)](#15-replace-type-code-with-statestrategy-以-statestrategy-取代类型码)
* [16. Replace Subclass with Fields以字段取代子类](#16-replace-subclass-with-fields以字段取代子类)
* [第九章 简化条件表达式](#第九章-简化条件表达式)
* [简化条件表达式](#简化条件表达式)
* [1. Decompose Conditional分解条件表达式](#1-decompose-conditional分解条件表达式)
* [2. Consolidate Conditional Expression合并条件表达式](#2-consolidate-conditional-expression合并条件表达式)
* [3. Consolidate Duplicate Conditional Fragments (合并重复的条件片段)](#3-consolidate-duplicate-conditional-fragments-合并重复的条件片段)
@ -79,7 +79,7 @@
* [6. Replace Conditional with Polymorphism (以多态取代条件表达式)](#6-replace-conditional-with-polymorphism-以多态取代条件表达式)
* [7. Introduce Null Object引入Null对象](#7-introduce-null-object引入null对象)
* [8. Introduce Assertion引入断言](#8-introduce-assertion引入断言)
* [第十章 简化函数调用](#第十章-简化函数调用)
* [简化函数调用](#简化函数调用)
* [1. Rename Method函数改名](#1-rename-method函数改名)
* [2. Add Parameter添加参数](#2-add-parameter添加参数)
* [3. Remove Parameter移除参数](#3-remove-parameter移除参数)
@ -95,7 +95,7 @@
* [13. Encapsulate Downcast封装向下转型](#13-encapsulate-downcast封装向下转型)
* [14. Replace Error Code with Exception (以异常取代错误码)](#14-replace-error-code-with-exception-以异常取代错误码)
* [15. Replace Exception with Test以测试取代异常](#15-replace-exception-with-test以测试取代异常)
* [第十一章 处理概括关系](#第十一章-处理概括关系)
* [处理概括关系](#处理概括关系)
* [1. Pull Up Field字段上移](#1-pull-up-field字段上移)
* [2. Pull Up Method函数上移](#2-pull-up-method函数上移)
* [3. Pull Up Constructor Body构造函数本体上移](#3-pull-up-constructor-body构造函数本体上移)
@ -111,7 +111,7 @@
<!-- GFM-TOC -->
# 第一章 第一个案例
# 第一个案例
如果你发现自己需要为程序添加一个特性,而代码结构使你无法很方便地达成目的,那就先重构这个程序。
@ -162,7 +162,7 @@ double getTotalCharge() {
<br><div align="center"> <img src="https://github.com/CyC2018/InterviewNotes/blob/master/pics//76b48b4c-8999-4967-893b-832602e73285.png"/> </div><br>
但是由于 Movie 可以在其生命周期内修改自己的类别,一个对象却不能在生命周期内修改自己所属的内,因此这种方案不可行。可以通过使用策略模式来解决这种问题(原书写的是使用状态模式,但是这里应该为策略模式,具体可以参考设计模式内容)。
但是由于 Movie 可以在其生命周期内修改自己的类别,一个对象却不能在生命周期内修改自己所属的类,因此这种方案不可行。可以使用策略模式来解决这个问题(原书写的是使用状态模式,但是这里应该为策略模式,具体可以参考设计模式内容)。
下图中Price 有多种实现Movie 组合了一个 Price 对象,并且在运行时可以改变组合的 Price 对象,从而使得它的计费方式发生改变。
@ -174,7 +174,7 @@ double getTotalCharge() {
<br><div align="center"> <img src="https://github.com/CyC2018/InterviewNotes/blob/master/pics//8c139711-3500-4f71-8456-c1adaf429ad0.png"/> </div><br>
# 第二章 重构原则
# 重构原则
## 定义
@ -230,7 +230,7 @@ double getTotalCharge() {
应当只关注关键代码的性能,因为只有一小部分的代码是关键代码。
# 第三章 代码的坏味道
# 代码的坏味道
## 1. Duplicated Code重复代码
@ -344,7 +344,7 @@ Extract Method 会把很多参数和临时变量都当做参数,可以用 Repl
使用 Extract Method 提炼出需要注释的部分,然后用函数名来解释函数的行为。
# 第四章 构筑测试体系
# 构筑测试体系
Java 可以使用 Junit 进行单元测试。
@ -352,11 +352,11 @@ Java 可以使用 Junit 进行单元测试。
应当集中测试可能出错的边界条件。
# 第五章 重构列表
# 重构列表
小步前进,频繁测试。
# 第六章 重新组织函数
# 重新组织函数
## 1. Extract Method提炼函数
@ -458,7 +458,7 @@ int discount (int inputVal, int quentity, int yearToDate){
## 9. Subsititute Algorithn替换算法
# 第七章 在对象之间搬移特性
# 在对象之间搬移特性
## 1. Move Method搬移函数
@ -532,7 +532,7 @@ Hide Delegate 有很大好处,但是它的代价是:每当客户要使用受
和 Introduce Foreign Method 目的一样,但是 Introduce Local Extension 通过建立新的类来实现。有两种方式:子类或者包装类,子类就是通过继承实现,包装类就是通过组合实现。
# 第八章 重新组织数据
# 重新组织数据
## 1. Self Encapsulate Field自封装字段
@ -643,7 +643,7 @@ public 字段应当改为 private并提供相应的访问函数。
<br><div align="center"> <img src="https://github.com/CyC2018/InterviewNotes/blob/master/pics//f2e0cee9-ecdc-4a96-853f-d9f6a1ad6ad1.jpg"/> </div><br>
# 第九章 简化条件表达式
# 简化条件表达式
## 1. Decompose Conditional分解条件表达式
@ -790,7 +790,7 @@ double getExpenseLimit() {
}
```
# 第十章 简化函数调用
# 简化函数调用
## 1. Rename Method函数改名
@ -965,7 +965,7 @@ double getValueForPeriod(int periodNumber) {
return values[periodNumber];
```
# 第十一章 处理概括关系
# 处理概括关系
## 1. Pull Up Field字段上移