一、问题的提出
在生产中有时候会遇到这种情况:在N行代码中,只有中间的M行(M远远小于N)是变动的,这个时候我们就希望能够将中间的M行变化的部分提取出来,然后和N行代码中不变的部分进行组合使用。
例如下面这个案例:
图中红框部分的两个函数是属于M行代码,其余部分都是N行代码中不变的部分。
现在想要做到整个程序只执行collect_1day或者frm_to_dict.
如何实现?
图1 案例二、分析
首先将不变的部分全部抽出是肯定需要的。但是这个可变的部分怎么办?不妨先暂用一个func的参数替换掉。
其次定义一个新的函数,这个函数调用了上面不变的函数,并且,在新函数里面再定义一个func函数,这个func函数和collect_1day函数发生关系,将collect_1day函数及参数全部打包在一起,这个功能就叫做闭包。
三、重构
重构后的函数见下图:
图2 重构后的函数可以看到:
del_all_days函数是N行函数中不变的部分,func作为参数传给他,func函数传参的时候只穿函数名,而不带()
collect_frm函数里面定义的func函数参数与del_all_days函数中的func函数的参数保持一致。
func函数内部调用的其他函数如collect_1day函数的参数,直接取用的是外部函数collect_frm输入进来的参数.
del_all_days函数不需要frm_path、dict_path参数,因为二者在del_all_days函数中没有被调用,实际上是在collect_frm函数直接传给了collect_1day函数。
网友评论