auto commit
This commit is contained in:
parent
1da18aa1a1
commit
1634228ad3
46
notes/重构.md
46
notes/重构.md
|
@ -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(字段上移)
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user