開心一笑
【甲:我用什么詞都會造句。
乙:那么你用“希望”找一個句子。
甲:我不會用希望造句。
乙:你怎么又不會了呢?
甲:我照的就是:“我不會用希望造句”。】
提出問題
項目開發中如何簡化函數調用???
解決問題
以下來自《重構》的簡單總結:
Rename Method(函數改名)
函數的名稱皆是函數的用途。一個好的函數名稱可以體現一個程序員的水平和素養。
Add Parameter(添加參數)
某個函數需要從調用端得到更多信息。為此函數添加一個對象參數。讓該對象帶進函數所需信息。
請記住,在之前的文章中有提到,如果一個函數的參數超過3個,那么這個函數就需要重構
Remove Parameter(移除參數)
函數本體不再需要這個參數,將該參數去除。(將多余參數刪除,不要留下壞味道)
Separate Query from Modifier(將查詢函數和修改函數分離)
某個函數既返回對象狀態值,又修改對象狀態。建立兩個不同的函數,其中一個負責查詢,另一個負責修改。
Parameterize Method(令函數攜帶參數)
若干函數做了類似的工作,但在函數主體中卻包含了不同的值,建立單一函數,以參數表達那些不同的值
重構前:
class Employee{
void tenPercentRaise(){
salary *= 1.1;
}
void fivePercentRaise(){
salary *= 1.05;
}
}
重構后:
void raise(double factor){
salary *= (1 + factor)
}
Replace Parameter with Explicit Methods(以明確函數取代參數)
你有一個函數,其中完全取決于參數值而采取不同行為。針對該參數的每一個可能值,建立一個獨立函數。
Preserve Whole Object(保存對象完整)
你從某個對象中取出若干值,將它們作為某一次函數調用時的參數。改為傳遞整個對象。
重構前:
int low = daysTempRange().getLow();
int high = daysTempRange().getHigh();
withinPlan = plan.withinRange(low,high)
重構后:
withinPlan = plan.withinRange(daysTempRange())
Replace Parameter with Methods(以函數取代參數)
對象調用某個函數,并將所得結果作為參數,傳遞給另一個函數,而接受該參數的函數本身也能夠調用前一個函數。讓參數接受者去除該線參數,并直接調用前一個函數。
重構前
int basePrice = _quantity * _itemPrice;
discountLevel = getDiscountLevel();
double finalPrice = discountedPrice(basePrice,discountLevel);
重構后:
int basePrice = _quantity * _itemPrice;
double finalPrice = discountedPrice(basePrice);
Introduce Parameter Object(引入參數對象)
某些參數總是很自然地同時出現,以一個對象取代這些參數。
代碼用一對值來表示一個范圍。例如表示日期范圍的開始和結束,表示數值范圍的upper和lower等等。
Remove Setting Method(移除設置函數)
類中的某個字段應該在對象創建時被設置,然后就不再改變。
Hide Method(隱藏函數)
有一個函數,從來沒有被其他任何類用到,將這個函數修改為private
Replace Contructor with Factory Method(以工廠函數取代構造函數)
你希望在創建對象時不僅僅是做簡單的,建構動作,將構建函數替換為工廠函數。
Encapsulate Downcast(封裝向下轉型)
某個函數返回的對象,需要由函數調用者執行向下轉型,將向下轉型動作移到函數中。
Replace Error Code With Exception(以異常取代錯誤碼)
某個函數返回一個特定的代碼,用以表示某種錯誤情況。改用異常。
Replace Exception with Test(以測試取代異常)
面對一個調用者可以預先檢查的條件,你拋出了一個異常。修改調用者,使它在調用函數之前先做檢查。
重構前:
double getValueForPeriod(int periodNumber){
try{
_values(periodNumber);
}catch(ArrayIndexOutOfBoundsException e){
return 0;
}
}
重構后:
double getValueForPeriod(int periodNumber){
//在這里提前檢查條件,而不是濫用異常
if(periodNumber >= _values.length) return 0
return _values(periodNumber);
}
不是一種意料外的事件,并不應該拋異常
讀書感悟
來自史鐵生《病隙碎筆》
- 人有一種壞習慣,記得住倒霉,記不住走運,這實在有失厚道。
- 生命就是這樣一個過程,一個不斷超越自身局限的過程,這就是命運,任何人都是一樣,在這過程中我們遭遇痛苦、超越局限、從而感受幸福。所以一切人都是平等的,我們毫不特殊。
- 人可以走向天堂,不可以走到天堂。走向,意味彼岸的成立。走到,豈非彼岸的消失?彼岸的消失即信仰的終結、拯救的放棄。因而天堂不是一處空間,不是一種物質性存在,而是道路,是精神的恒途。
- 徹底的圓滿只不過是徹底的無路可走。
- 相信愛才是人類唯一的救助。 這愛,不單是友善、慈悲、助人為樂,它根本是你自己的福。 這愛,非居高的施舍,乃謙恭地仰望,接受苦難,從而走向精神的超越。
其他
如果有帶給你一絲絲小快樂,就讓快樂繼續傳遞下去,歡迎轉載,點贊,頂,歡迎留下寶貴的意見,多謝支持!