重构-改善既有代码的设计-重新组织函数
重新组织函数(函数相关的重构手法)
1.Extract Method(提炼函数)(过长的函数或者需要注释才能让人理解用途的代码,那么就该提炼出来放到一个独立的函数里面)
做法:
1.创造一个新函数,根据这个函数的意图来命名
2.把提炼出来的代码拷贝到新函数里面
3.仔细检查提炼出来的代码,看看其中是否引用了“作用于限制于原函数”的变量,包括局部变量和原函数参数
4.检查是否有“仅作用于被提炼代码段的临时变量,如果有 那么在目标函数中申明为临时变量”
5.吧被提炼代码中需要读取的临时变量,当做参数传给目标函数
6.在原函数中,被提炼出来的代码段 替换为 对目标函数的调用
7.检查被提炼代码段,是否有个局部变量被修改了,如果被修改了看看是否可以处理为一个查询,如果不能,那么就不能原封不动的提炼代码了,参考Split Temporary Variable 然后在提炼,或者用Replace Temp With Query 吧临时变量消灭,再提炼
2. Inline Method(内联函数)(有一种情况是该函数没有必要成为一个独立的函数,还有一种情况是如果委托太多,有时候就需要内联了)
做法:
1.确定不具备多态性,找出所有的调用者,把函数被替换为内联
3.Inline Temp(内联临时变量)(有些临时变量是多余的,那么删掉吧)
4.Replace Temp With Query(用查询替代临时变量,程序用一个临时变量来保存某一表达式的结果,吧这个表达式提炼到一个独立的函数中再把所有表达式 替换为函数的调用,此后新函数就可以被其他使用,,,临时变量的问题在于,只在该函数可见 ,这会驱使你写更长的代码,如果替换为查询,那么情况会好得多)
做法:
找出只被赋值一次的临时变量(C++ 可用const来确认),然后提炼出函数,再用inline temp来处理临时变量
5.Introduce Explaining Variable(引入解释性变量)(把复杂的表达式或者其中一部分的结果放进一个临时变量,以此变量名称来解释表达式的用途,来增加可读性)
6.Split Temporary Variable(分解临时变量)(某个临时变量被赋值超过一次,它既不是循环变量也不用于收集计算结果,那么就该针对每次赋值,创建一个独立,对应的临时变量。保证一个临时变量值承担一个责任)
7.Remove Assignments to Parameters(移除对参数的赋值)(注意传值和转地址的区别)
8.Replace Method with Method Object(以函数对象取代函数)(如果一个大型函数无法用Extract Method 那么就可以吧这个函数放进一个单独的对象,如此一来局部变量就成了对象内的字段,然后在这个类中拆分这个大型函数)
8.Substitute Algorithm(替换算法)(吧每个算法替换为一个更清晰的算法,如:函数内部大量的if 如果可以用查询 循环来替换,那就替换吧)