## 重新組織物件資料 # 拆分變數 如果變數被指派很多次,它就應該被替換(分解)為多個變數,每個變數只承擔一個責任。 重構前: ```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
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up