Introduce Explainning Variable(引入解释性变量)
Summary:
- 将该复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量名称来解释表达式用途。
Tips:
- 在条件逻辑中,Introduce Explaining Variable可以用来将每个条件子句提炼出来,以一个良好命名的临时变量来解释对应条件子句的意义。
Comments by Allen Lee:
Inline Temp与Introduce Explaining Variable:
- 两者在一定程度上(外表行为)恰恰相反。前者把临时变量的表达式直接插入调用方以便去掉临时变量,后者却把相关表达式提炼出来用一个临时变量代替。
- 前者要去掉的临时变量所代表的表达式是比较简单的,一般用来储存直接对某个函数或者某个对象的成员函数调用所得到的返回值,如order.GetResult();(函数样式)或者order.Result;(C# property 样式);而后者要提炼的表达式确实比较复杂,至少不是一眼可以看出其含义的,如textBox1.Text.ToUpperCase().Contains("@");。
- 前者一般是为实施其他重构原则,例如Extract Method,铺平道路所用;而后者则一般为提高代码,尤其是不能一眼看出其含义的复杂表达式,的可读性所用。
- 后期优化时,有时某些表达式虽然比较简单,例如order.GetResult();,但由于其内部算法复杂并只赋值一次,如果把它使用Inline Temp直接嵌入调用方,那么每次需要用到的时候都进行一次计算将会付出很大的代价。此时我们可能首先看看是否能够把该函数进行Extract Method,再看看是否能够Substitute Algorithm,尽量把函数分割,实在没办法的时候,我们就只能重新引入临时变量把结果储存一次留为后用。
Introduce Explaining Variable与Replace Temp with Query:
- 这两者可以看情况组合使用。当我们发现某些表达式返回的结果其实可以对外开放,那么,我们可以用Introduce Explaining Variable引入临时变量,然后用Replace Temp with Query把这个临时变量提取到一个单独的Query。
- 这两者组合使用有时候也等效于直接使用Extract Method。所以,如果你有时候发现要提炼的函数由于临时变量太多而逻辑不清晰,不妨把Extract Method的过程拆成这两者来用,往往会收到意想不到的效果。