重构改善既有代码的设计-学习(二):搬移特性

        这一章节总结起来就是:在不同的上下文之间搬移元素。

1、搬移函数(Move Function)

重构改善既有代码的设计-学习(二):搬移特性_第1张图片 

        如果一个函数频繁引用其他上下文中的元素,而对自身上下文中的元素却关心甚少。此时,让它去与那些更亲密的元素相会,通常能取得更好的封装效果,因为系统别处就可以减少对当前模块的依赖。 

2、搬移字段(Move Field) 

重构改善既有代码的设计-学习(二):搬移特性_第2张图片 

        总是一同出现、一同作为函数参数传递的数据,最好是规整到同一条记录中,以体现它们之间的联系

3、搬移语句到函数(Move Statements into Function)

重构改善既有代码的设计-学习(二):搬移特性_第3张图片 

        如果我发现调用某个函数时,总有一些相同的代码也需要每次执行,那么我会考虑将此段代码合并到函数里头。

        这样,日后对这段代码的修改只需改一处地方,还能对所有调用者同时生效。如果将来代码对不同的调用者需有不同的行为,那时再通过搬移语句到调用者(下一条)将它(或其一部分)搬移出来也十分简单

4、搬移语句到调用者(Move Statements to Callers)

重构改善既有代码的设计-学习(二):搬移特性_第4张图片 

        如果函数边界发生偏移,即:以往在多个地方共用的行为,如今需要在某些调用点面前表现出不同的行为。于是,我们得把表现不同的行为从函数里挪出,并搬移到其调用处。

5、以函数调用取代内联代码(Replace Inline Code with Function Call)

重构改善既有代码的设计-学习(二):搬移特性_第5张图片 

        善用函数可以帮助我将相关的行为打包起来,这对于提升代码的表达力大有裨益:

        1、一个命名良好的函数,本身就能极好地解释代码的用途,使读者不必了解其细节。

        2、函数同样有助于消除重复,因为同一段代码我不需要编写两次,每次调用一下函数即可。

        3、此外,当我需要修改函数的内部实现时,也不需要四处寻找有没有漏改的相似代码。(当然,我可能需要检查函数的所有调用点,判断它们是否都应该使用新的实现,但通常很少需要这么仔细,即便需要,也总好过四处寻找相似代码。) 

6、移动语句(Slide Statements)

重构改善既有代码的设计-学习(二):搬移特性_第6张图片 

        如果有几行代码取用了同一个数据结构,那么最好是让它们在一起出现,而不是夹杂在取用其他数据结构的代码中间。最简单的情况下,我只需使用移动语句就可以让它们聚集起来。

7、拆分循环(Split Loop) 

重构改善既有代码的设计-学习(二):搬移特性_第7张图片 

        让一个循环只做一件事情。

        但如果循环做了太多件事,那就只得返回结构型数据或者通过局部变量传值了。因此,一般拆分循环后,还会紧接着对拆分得到的循环应用提炼函数

8、以管道取代循环(Replace Loop with Pipeline)

重构改善既有代码的设计-学习(二):搬移特性_第8张图片 

const names = [];
for (const i of input) {
    if (i.job === "programmer")
        names.push(i.name);
}

        改为:

const names = input
    .filter(i => i.job === "programmer")
    .map(i => i.name);

9、移除死代码(Remove Dead Code) 

重构改善既有代码的设计-学习(二):搬移特性_第9张图片 

         一旦代码不再被使用,我们就该立马删除它。

        即使有可能以后又会需要这段代码,我也可以从版本控制系统里再次将它翻找出来。

 

 

 

你可能感兴趣的:(架构,重构,学习)