重構 - Ch8 - 移動功能
移動函式(Move Function)
當你的函式參考其他環境的元素數量,比目前所處的物件來得多時,把他與那些元素放在一起,通常可以改善封裝,讓軟體的其他部分比較不依賴模組的細節
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 
 | class Account
 {
 public function getBankCharge();
 
 
 public function getOverDraftCharge();
 }
 
 
 class Account
 {
 public function getBankCharge();
 public function getOverDraftCharge()
 {
 return $this->AccountType->getOverDraftCharge()
 }
 }
 
 
 class AccountType
 {
 public function getOverDraftCharge();
 }
 
 | 
移動欄位(Move Field)
- 當傳遞A變數的時候,很常需要伴隨B變數的時候
- 如果對一筆紀錄的修改,常常導致另一筆紀錄的更動時
- 如果我必須更新多個不同結構的同一個欄位時,他應該在同一個地方被,讓他只需要更新一次
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 
 | class Customer
 {
 public $name;
 public $discountRate;
 public $contract
 }
 
 class CustomerContract
 {
 public $startDate
 }
 
 
 class Customer
 {
 public $name;
 public $contract
 }
 
 class CustomerContract
 {
 public $startDate
 public $discountRate;
 }
 
 
 | 
將陳述式移入函式(Move Statements into Function)
當我在很多地方重複執行同一段程式時,將他們整理在一起,這樣一來我如果需要做修改就在一個地方就可以修改完成。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 
 | public function A()
 {
 ...
 
 ...
 }
 
 public function B()
 {
 ...
 
 ...
 }
 
 public function A()
 {
 ...
 $this->doSomething();
 ...
 }
 
 public function B()
 {
 ...
 $this->doSomething();
 ...
 }
 
 public function doSomething();
 
 
 | 
將陳述式移入呼叫方(Move Statements to Callers)
將陳述式移入函式(Move Statements into Function) 的逆操作
如果有一段code被封裝成function並在多處被使用,但有些地方需要更改呼叫他的方式,就有機會使用這個重構方法。
將內聯的程式碼換成函式呼叫式(Replace Inline Code with Function Call)
當看到現有的程式碼做的事情與既有的函式相同時,通常會把現有的程式碼使用既有的函式取代。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | 
 $fruits = ['Apple', 'Banana'];
 $last_fruit = $fruit[count($fruits)-1];
 unset($fruit[count($fruits)-1]);
 
 
 
 $fruits = ['Apple', 'Banana'];
 $last_fruit = array_pop($fruits);
 
 
 | 
移動陳述式(Slide Statements)
將彼此相關的東西放在一起,可以讓程式碼更容易理解。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 | 
 public function shopping()
 {
 $price = getPrice();
 $order = getOrder();
 $charge = '';
 $chargePerUnit = $this->PricePlane->getUnit();
 }
 
 
 public function shopping()
 {
 $price = getPrice();
 $order = getOrder();
 $chargePerUnit = $this->PricePlane->getUnit();
 $charge = '';
 }
 
 
 | 
拆開迴圈(Split Loop)
如果迴圈裡面做了兩件事情,你要修改他時你必須要先了解那兩件事情,把迴圈拆開的話,一方面你只需要去理解你想改的那個迴圈做的事情就好,另外一方面可以使迴圈的內容更容易被重用。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 
 | 
 
 foreach ($array => $key as $value) {
 
 
 }
 
 
 
 foreach ($array => $key as $value) {
 
 }
 
 foreach ($array => $key as $value) {
 
 }
 
 
 | 
將迴圈改成流程(Replace Loop with Pipeline)
用流程來表示邏輯運作比較容易讓人理解,可讓人從上而下閱讀,查看過程經歷了什麼流程。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 
 | 
 
 $programmer_user_names = [];
 
 foreach ($users => $key as $user) {
 if($user['job'] == 'programmer') {
 $programmer_user_names[] = $user['name'];
 }
 }
 
 
 
 $users = collect(
 [
 ['job' => 'programmer', 'name' => 'name_a'],
 ['job' => 'programmer', 'name' => 'name_b'],
 ['job' => 'aaa', 'name' => 'name_c'],
 ['job' => 'bbb', 'name' => 'name_d'],
 ]
 );
 
 $programmer_user_names = $users->filter(
 function ($user) {
 return $user['job'] == 'programmer';
 }
 )->pluck('name');
 
 
 | 
廢除死碼(Remove Dead Code)
沒有用途的程式碼在你試著了解軟體如何工作時,會成為絆腳石。他沒有明確訊號告知我們可以忽略他,所以多數時候我們被迫去理解這些程式碼的用途。