重構筆記――搬移字段
來源:程序員人生 發布時間:2015-03-03 08:34:17 閱讀次數:3624次
本文是在學習中的總結,歡迎轉載但請注明出處:http://blog.csdn.net/pistolove/article/details/42780243
在上1篇文章中介紹了“搬移函數”。本文將介紹“搬移字段”這類重構手法。
下面讓我們來學習這類重構手法吧。
開門見山
發現:程序中某個字段被其所駐類以外的另外一個類更多地用到。
解決:在目標類新建1個字段,修改原字段的所有用戶,令它們改用新字段。

動機
在類之間移動狀態和行動,是重構進程必不可少的措施。隨著軟件開發的不斷前進,你會發現需要新的類,并需要將現有的工作責任拖到新的類中。在這個星期看似公道正確的設計,到下個星期可能不再正確。這固然沒啥問題,但是如果你歷來沒遇到這類情況,那才是有問題的。
如果發現,1個字段在其所駐類以外的另外一個類有更多函數使用了它,就應當斟酌搬移這個字段。所謂“使用”多是通過設值/取值函數間接進行的。可能也會觸及移動該字段的用戶(函數),這取決因而否需要保持接口不變化。如果這些函數看上去很合適待在原地,就選擇搬移字段。
在使用“提煉函數”的時候,也可能需要搬移字段。這時候會選擇先搬移字段,然后搬移函數。
做法
(1)如果字段的訪問級別是public,將其封裝起來。
(2)編譯,測試。
(3)在目標類中建立與原字段相同的字段,并同時建立相應的設值/取值函數。
(4)編譯目標類。
(5)決定如何在原對象中援用目標對象。
(6)刪除原字段。
(7)將所有對原字段的援用替換為對某個目標函數的調用。
(8)編譯,測試。
示例
我們還是從前1篇文章中的Account類開始:
class Account {
private AccountType _type;
private double _interestRate;
double interestForAmount_days(double amount, int days) {
return _interestRate * amount * days / 365;
}
}
我想把表示利率的_interestRate搬移到AccountType類中。目前有1些函數援用了它,interestForAmount_days()就是其中之1。下1步需要在AccountType中建立_interestRate字段和相應的訪問函數:
class AccountType {
private double _interestRate;
void setInterestRate(double rate) {
_interestRate = rate;
}
double getInterestRate() {
return _interestRate;
}
}
這時候候就能夠編譯新的AccountType類了。
現在需要讓Account類中訪問_interestRate字段的函數轉而使用AccoutType對象,然后刪除Account類中的_interestRate字段。此時,必須刪除原字段,才能保證其訪問函數的確改變了操作對象,由于編譯器會幫助我們的。
class Account {
private AccountType _type;
double interestForAmount_days(double amount, int days) {
return _type.getInterestRate() * amount * days / 365;
}
}
使用自我封裝
如果有很多的函數使用了_interestRate字段,就應當先使用自我封裝:
// 自我封裝
class Account {
private AccountType _type;
private double _interestRate;
double interestForAmount_days(double amount, int days) {
return getInterestRate() * amount * days / 365;
}
void setInterestRate(double rate) {
_interestRate = rate;
}
double getInterestRate() {
return _interestRate;
}
}
這樣,在搬移字段以后,就只需要修改訪問函數:
class Account {
private AccountType _type;
double interestForAmount_days(double amount, int days) {
return getInterestRate() * amount * days / 365;
}
void setInterestRate(double rate) {
_type.setInterestRate(rate);
}
double getInterestRate() {
return _type.getInterestRate();
}
}
在以后的開發中,若有必要,我可以修改訪問函數的用戶,讓它們使用新對象。使用自我封裝使得以更輕松地使用“搬移函數”將函數搬移到目標類中。如果待搬移函數援用了字段的訪問函數,那些援用點就無需修改了。
本文主要介紹了重構手法――搬移字段。隨著開發的不斷深入,類的數量愈來愈多,可能你會發現最開始放在1個類中的字段和后來新增的類有更多的交換,這樣我們就應當將該字段搬移到使用它更多的類中。
最后,希望本文對你有所幫助。有問題可以留言,謝謝。(PS:下1篇將介紹重構筆記――提煉類)
重構筆記文章以下
重構筆記――入門篇
重構筆記――代碼的壞味道(上)
重構筆記――代碼的壞味道(下)
重構筆記――構筑測試體
重構筆記――提煉函數
重構筆記――內聯函數
重構筆記――內聯臨時變量
重構筆記――以查詢取代臨時變量
重構筆記――引入解釋性變量
重構筆記――分解臨時變量
重構筆記――移除對參數的賦值
重構筆記――搬移函數
重構筆記――搬移字段
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈