From c9fd81f26177700f6c6de608d9e2556ca29c08fe Mon Sep 17 00:00:00 2001
From: CyC2018 <1029579233@qq.com>
Date: Sun, 4 Mar 2018 15:18:49 +0800
Subject: [PATCH] auto commit
---
notes/重构.md | 26 ++++++++++++------
pics/2c8a7a87-1bf1-4d66-9ba9-225a1add0a51.png | Bin 0 -> 11264 bytes
pics/9d549816-60b7-4899-9877-23b01503ab13.png | Bin 0 -> 17408 bytes
3 files changed, 17 insertions(+), 9 deletions(-)
create mode 100644 pics/2c8a7a87-1bf1-4d66-9ba9-225a1add0a51.png
create mode 100644 pics/9d549816-60b7-4899-9877-23b01503ab13.png
diff --git a/notes/重构.md b/notes/重构.md
index 772db892..0e697888 100644
--- a/notes/重构.md
+++ b/notes/重构.md
@@ -13,7 +13,7 @@
* [1. Duplicated Code(重复代码)](#1-duplicated-code重复代码)
* [2. Long Method(过长函数)](#2-long-method过长函数)
* [3. Large Class(过大的类)](#3-large-class过大的类)
- * [4. Long Parameter List(过长的参数列)](#4-long-parameter-list过长的参数列)
+ * [4. Long Parameter List(过长的参数列表)](#4-long-parameter-list过长的参数列表)
* [5. Divergent Change(发散式变化)](#5-divergent-change发散式变化)
* [6. Shotgun Surgery(散弹式修改)](#6-shotgun-surgery散弹式修改)
* [7. Feature Envy(依恋情结)](#7-feature-envy依恋情结)
@@ -170,9 +170,9 @@ double getTotalCharge() {
重构后整体的类图和时序图如下:
-
+
-
+
# 重构原则
@@ -232,6 +232,10 @@ double getTotalCharge() {
# 代码的坏味道
+本章主要介绍一些不好的代码,也就是说这些代码应该被重构。
+
+文中提到的具体重构原则可以先忽略。
+
## 1. Duplicated Code(重复代码)
同一个类的两个函数有相同表达式,则用 Extract Method 提取出重复代码;
@@ -244,21 +248,25 @@ double getTotalCharge() {
## 2. Long Method(过长函数)
-间接层的价值:解释能力、共享能力、选择能力;
+函数应该尽可能小,因为小函数具有解释能力、共享能力、选择能力。
-分解函数的原则:当需要用注释来说明一段代码时,就需要把这部分代码写入一个独立的函数中。
+分解长函数的原则:当需要用注释来说明一段代码时,就需要把这部分代码写入一个独立的函数中。
Extract Method 会把很多参数和临时变量都当做参数,可以用 Replace Temp with Query 消除临时变量,Introduce Parameter Object 和 Preserve Whole Object 可以将过长的参数列变得更简洁。
-条件和循环往往也需要提取到新的函数中。
+条件和循环语句往往也需要提取到新的函数中。
## 3. Large Class(过大的类)
-过大的类做了过多事情,需要使用 Extract Class 或 Extract Subclass。
+应该尽可能让一个类只做一件事,而过大的类做了过多事情,需要使用 Extract Class 或 Extract Subclass。
-先确定客户端如何使用它们,然后运用 Extract Interface 为每一种使用方式提取出一个接口。
+先确定客户端如何使用该类,然后运用 Extract Interface 为每一种使用方式提取出一个接口。
-## 4. Long Parameter List(过长的参数列)
+## 4. Long Parameter List(过长的参数列表)
+
+太长的参数列表往往会造成前后不一致,不易使用。
+
+面向对象程序中,函数所需要的数据通常内在宿主类中找到。
## 5. Divergent Change(发散式变化)
diff --git a/pics/2c8a7a87-1bf1-4d66-9ba9-225a1add0a51.png b/pics/2c8a7a87-1bf1-4d66-9ba9-225a1add0a51.png
new file mode 100644
index 0000000000000000000000000000000000000000..1659fdaea39947d537811ca3867a66c4234c5a02
GIT binary patch
literal 11264
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
literal 0
HcmV?d00001
diff --git a/pics/9d549816-60b7-4899-9877-23b01503ab13.png b/pics/9d549816-60b7-4899-9877-23b01503ab13.png
new file mode 100644
index 0000000000000000000000000000000000000000..9c4e04cc901dc959c32d2811762d6db69820e56d
GIT binary patch
literal 17408
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