将所有对该变量的引用动作,替换为对它赋值那个表达式本身。
将这个表达式提炼到一个独立函数中,将这个临时变量的所有引用点替换为对新函数的调用。此后,新函数就可被其他函数使用。
将复杂表达式的结果放进一个临时变量,以此变量名称来解释表达式用途。
「动机」
在条件逻辑中,引入解释性变量特别有价值,你可以用这项重构将每个条件子句提炼出来,以一个良好命名的临时变量来解释对应条件子句的意义。使用这项重构的另一种情况是,在较长算法中,可以运用临时变量来解释每一步运算的意义。
针对每次赋值,创造一个独立、对应的临时变量。
「动机」
如果临时变量被赋值超过一次,就意味着它们在函数中承担了一个以上的责任。如果临时变量承担多个责任,它就应该被替换为多个临时变量,每个变量只承担一个责任。同一个临时变量承担两件不同的事情,会另代码阅读者糊涂。
/**
@startTime 2020-12-21 21:30
@endTime 2020-12-21 23:50
@startPage 131
@endPage 188
@efficiency 188/6 = 31.3页/天
@needDays 412/31.3 = 13天
@overDay 2020-12-16 + 13天 = 2020-12-28
*/
**以一个临时变量取代该参数的位置。
首先,我要确定大家都清楚“对参数赋值”这个说法的意思。如果你把一个名为user的对象作为参数传给某个函数,那么“对参数赋值”意味着改变user,使它引用另外一个对象。如果你在“被传入对象”身上进行什么操作,那没问题,我也总是这样干。我只针对“user被改而指向另一个对象”这种情况来讨论。**
你有一个大型函数,其中对局部变量的使用使你无法采用提取函数,将这个函数放进一个单独对象中,如此一来局部变量就成了对象内的字段,然后你可以在同一个对象中将这个大型函数分解为多个小型函数。
「动机」
我在本书中不断向读者强调小型函数的优美动人。只要将相对独立的代码从大型函数中提炼出来,就可以大大提高代码的可读性。
「做法」
-
建立一个新类,根据待处理函数的用途,为这个类命名。
-
在新类中建立一个final字段,用以保存原先大型函数