---
# System prepended metadata

title: 拆分變數

---

## 重新組織物件資料
# 拆分變數
如果變數被指派很多次，它就應該被替換（分解）為多個變數，每個變數只承擔一個責任。

重構前：
```javascript=
var temp = 2 * (height + width);
Console.WriteLine(temp);
temp = height * width;
Console.WriteLine(temp);
```
重構後：
```javascript=
var perimeter = 2 * (height + width);
Console.WriteLine(perimeter);
var area = height * width;
Console.WriteLine(area);
```

## Sample Code
1. DistanceTravelled
- acc被使用兩次
- 修改到了Input value
2. Discount
- 修改到了Input value
- 因為是 call by value 才能這樣改

# 欄位改名

命名很重要!，對於程序中廣泛使用的記錄結構，其中字段的命名格外重要。

重構前：

```javascript=
class Organization {
    constructor(data) {
        this._name = data.name;
    }
}
```

重構後：
```javascript=
class Organization {
    constructor(data) {
        this._title = data._title;
    }
}
```
## Sample Code

1. Organization
- name?title?
- 修改到了Input value



## 以查詢取代指定變數
變動資料是程式中最大的錯誤原因之一。

很多時候，完全去掉變動數據非常困難，但還是強烈建議：盡量把變動資料的作用域限制在最小範圍。

重構前：
```javascript=
get discountedTotal() {return this._discountedTotal;}
set discount(aNumber) {
    const old = this._discount;
    this._discount = aNumber;
    this._discountedTotal += old - aNumber; 
}
```
重構後：
```javascript=
get discountedTotal() {return this._baseTotal - this._discount;}
set discount(aNumber) {this._discount = aNumber;}
```
## Sample Code

1. ProductionPlan
- 資料被Assign 不同的物件

## 將引用對象改為值對象（Change Reference to Value）

在把一個對象（或數據結構）嵌入一個對象時，位於內部的這個對象可以被視為引用對象，也可以被視為值對象。兩者的差異在於如何更新內部對象的屬性。

若視為引用對象，更新時保留原對像不動，更新內部對象的屬性；
若視為值對象，替換整個內部對象。



重構前:
```javascript=
class Product {
    applyDiscount(arg) {
        this._price.amount -= arg;
}
```

重構後
```javascript=
class Product {
    applyDiscount(arg) {
        this._price = new Money(this._price.amount - arg, this._price.currency);
}
```

## Sample Code

1. ChangeReferenceToValue

## 將值對象重新引用對象（Change Value to Reference）

將值改為引用其他物件：對於一個客觀實體，只有一個代表它的對象。

這代表需要在某個倉庫存它的對象，在這個倉庫中可以找到所有這些實體對象。只為每個實體創建一次對象，以後始終從倉庫獲取該對象
重構前：
```javascript=
var customer = new Customer(customerData);
```
重構後：
```javascript=
var customer = customerRepository.Find(customerData.Id);
```

## Sample Code

1. ChangeValueToReference
- 每次New 一個新的 Order 就會有新的Customer 物件, 十個就會有10個物件，但是有些Customer 可能會是重複的


## Project Code
1. Logon.js(拆分變數)
2. CompanyBetTypeSettingModel(欄位改名)
3. ReportModel(欄位改名 以查詢取代指定變數) 說不定是knowhow
