優雅編程之這樣簡化函數,你就“正常”了(二十四)

開心一笑

【甲:我用什么詞都會造句。
乙:那么你用“希望”找一個句子。
甲:我不會用希望造句。
乙:你怎么又不會了呢?
甲:我照的就是:“我不會用希望造句”。】

提出問題

項目開發中如何簡化函數調用???

解決問題

勵志圖片

以下來自《重構》的簡單總結:

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);
}

不是一種意料外的事件,并不應該拋異常

讀書感悟

來自史鐵生《病隙碎筆》

  • 人有一種壞習慣,記得住倒霉,記不住走運,這實在有失厚道。
  • 生命就是這樣一個過程,一個不斷超越自身局限的過程,這就是命運,任何人都是一樣,在這過程中我們遭遇痛苦、超越局限、從而感受幸福。所以一切人都是平等的,我們毫不特殊。
  • 人可以走向天堂,不可以走到天堂。走向,意味彼岸的成立。走到,豈非彼岸的消失?彼岸的消失即信仰的終結、拯救的放棄。因而天堂不是一處空間,不是一種物質性存在,而是道路,是精神的恒途。
  • 徹底的圓滿只不過是徹底的無路可走。
  • 相信愛才是人類唯一的救助。 這愛,不單是友善、慈悲、助人為樂,它根本是你自己的福。 這愛,非居高的施舍,乃謙恭地仰望,接受苦難,從而走向精神的超越。

其他

如果有帶給你一絲絲小快樂,就讓快樂繼續傳遞下去,歡迎轉載,點贊,頂,歡迎留下寶貴的意見,多謝支持!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內容

  • 閱讀《重構》的筆記獻上。 重構的定義 重構是在不改變軟件可觀察行為的前提下改善其內部結構。 重構的節奏 以微小的步...
    陳宇明閱讀 11,657評論 13 64
  • 1 Rename Method(函數改名) 修改函數名字以良好表達函數的用途。Motivation:各種大師特別推...
    hklbird閱讀 528評論 0 0
  • 開心一笑 【唐僧4人西天取經。,一天,一位女施主纏著唐僧。唐山對孫悟空說:悟空啊,幫我鑒定一下,是人是妖。孫悟空用...
    架構師啟示錄閱讀 547評論 1 9
  • 《重構》讀書筆記 總覽 第一部分 第一章從實例程序出發,展示設計的缺陷,對其重構可以了解重構的過程和方法。 第二部...
    白樺葉閱讀 2,413評論 2 5
  • 有些事不是因為有意義而堅持,而是因為堅持了才有意義! 自從2月3日立春以來,自己堅持不斷的每天更新一篇文章。117...
    薛靜春閱讀 532評論 2 3