一猜煮、問(wèn)題的提出
在生產(chǎn)中有時(shí)候會(huì)遇到這種情況:在N行代碼中拒啰,只有中間的M行(M遠(yuǎn)遠(yuǎn)小于N)是變動(dòng)的胆数,這個(gè)時(shí)候我們就希望能夠?qū)⒅虚g的M行變化的部分提取出來(lái),然后和N行代碼中不變的部分進(jìn)行組合使用黎泣。
例如下面這個(gè)案例:
圖中紅框部分的兩個(gè)函數(shù)是屬于M行代碼恕刘,其余部分都是N行代碼中不變的部分。
現(xiàn)在想要做到整個(gè)程序只執(zhí)行collect_1day或者frm_to_dict.
如何實(shí)現(xiàn)抒倚?
二褐着、分析
首先將不變的部分全部抽出是肯定需要的。但是這個(gè)可變的部分怎么辦托呕?不妨先暫用一個(gè)func的參數(shù)替換掉含蓉。
其次定義一個(gè)新的函數(shù),這個(gè)函數(shù)調(diào)用了上面不變的函數(shù)项郊,并且馅扣,在新函數(shù)里面再定義一個(gè)func函數(shù),這個(gè)func函數(shù)和collect_1day函數(shù)發(fā)生關(guān)系着降,將collect_1day函數(shù)及參數(shù)全部打包在一起差油,這個(gè)功能就叫做閉包。
三任洞、重構(gòu)
重構(gòu)后的函數(shù)見(jiàn)下圖:
可以看到:
del_all_days函數(shù)是N行函數(shù)中不變的部分蓄喇,func作為參數(shù)傳給他,func函數(shù)傳參的時(shí)候只穿函數(shù)名交掏,而不帶()
collect_frm函數(shù)里面定義的func函數(shù)參數(shù)與del_all_days函數(shù)中的func函數(shù)的參數(shù)保持一致妆偏。
func函數(shù)內(nèi)部調(diào)用的其他函數(shù)如collect_1day函數(shù)的參數(shù),直接取用的是外部函數(shù)collect_frm輸入進(jìn)來(lái)的參數(shù).
del_all_days函數(shù)不需要frm_path耀销、dict_path參數(shù)楼眷,因?yàn)槎咴赿el_all_days函數(shù)中沒(méi)有被調(diào)用铲汪,實(shí)際上是在collect_frm函數(shù)直接傳給了collect_1day函數(shù)。