? ? ? ? 这一章节总结起来就是:在不同的上下文之间搬移元素。
?
? ? ? ? 如果一个函数频繁引用其他上下文中的元素,而对自身上下文中的元素却关心甚少。此时,让它去与那些更亲密的元素相会,通常能取得更好的封装效果,因为系统别处就可以减少对当前模块的依赖。?
?
????????总是一同出现、一同作为函数参数传递的数据,最好是规整到同一条记录中,以体现它们之间的联系
?
????????如果我发现调用某个函数时,总有一些相同的代码也需要每次执行,那么我会考虑将此段代码合并到函数里头。
????????这样,日后对这段代码的修改只需改一处地方,还能对所有调用者同时生效。如果将来代码对不同的调用者需有不同的行为,那时再通过搬移语句到调用者(下一条)将它(或其一部分)搬移出来也十分简单
?
? ? ? ? 如果函数边界发生偏移,即:以往在多个地方共用的行为,如今需要在某些调用点面前表现出不同的行为。于是,我们得把表现不同的行为从函数里挪出,并搬移到其调用处。
?
????????善用函数可以帮助我将相关的行为打包起来,这对于提升代码的表达力大有裨益:
? ? ? ? 1、一个命名良好的函数,本身就能极好地解释代码的用途,使读者不必了解其细节。
? ? ? ? 2、函数同样有助于消除重复,因为同一段代码我不需要编写两次,每次调用一下函数即可。
? ? ? ? 3、此外,当我需要修改函数的内部实现时,也不需要四处寻找有没有漏改的相似代码。(当然,我可能需要检查函数的所有调用点,判断它们是否都应该使用新的实现,但通常很少需要这么仔细,即便需要,也总好过四处寻找相似代码。)?
?
????????如果有几行代码取用了同一个数据结构,那么最好是让它们在一起出现,而不是夹杂在取用其他数据结构的代码中间。最简单的情况下,我只需使用移动语句就可以让它们聚集起来。
?
????????让一个循环只做一件事情。
????????但如果循环做了太多件事,那就只得返回结构型数据或者通过局部变量传值了。因此,一般拆分循环后,还会紧接着对拆分得到的循环应用提炼函数
?
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);
?
?????????一旦代码不再被使用,我们就该立马删除它。
? ? ? ? 即使有可能以后又会需要这段代码,我也可以从版本控制系统里再次将它翻找出来。
?
?
?