第8章 搬移特性
搬移函数(Move Function)
模块化是优秀软件设计的核心所在,好的模块化可以让程序修改只需要理解一小部分。
任何函数都需要具备上下文环境才能存活,类本身就是函数的上下文。
搬移函数最直接的动机是:它频繁引用其他上下文中的元素,而对自身上下文的元素却关心甚少。
搬移字段(Move Field)
往往数据结构才是一个健壮程序的根基。一个适应于问题域的良好数据结构,可以让行为代码变得简单明了。
好的数据结构至关重要——不过它们很难一次做对。
领域驱动设计方面的经验和知识,往往有助于你更好地设计数据结构。
如果修改一条记录时,总是需要同时改动另一条记录,那么说明很可能有字段放错了位置。
搬移裸记录:先为记录创建相应的访问函数,并修改所有读取和更新记录的地方,使它们引用新创建的访问函数。
搬移语句到函数(Move Statements into Function)
”消除重复“
搬移语句到调用者(Move Statements to Callers)
程序员的职责就是设计出结构一致、抽象适宜的程序,而程序抽象能力的源泉正是来自函数。
抽象的边界随着系统能力发生演进,原先的边界总会悄无声息地发生偏移。
函数边界发生偏移的一个征兆是,以往在多个地方共用的行为,如今需要在某些调用点表现出不同的行为。
当函数边界偏移较小时,可先将表现不同的行为调整到函数的开头或结尾,然后再将语句搬移到调用点。如果函数边界偏移较大,此时只能重新进行设计了。
以函数调用取代内联代码(Replace Inline Code with Function Call)
善用函数可帮助将相关的行为打包起来,有助于提升代码的表达力、消除重复。
一个命名良好的函数,本身就能极好地解释代码的用途,使读者不必了解其细节。
移动语句(Slide Statements)
让存在关联的东西一起出现,可以使代码更容易理解。
变量声明在离它第一次使用最近的地方。
拆分循环(Split Loop)
如果你在循环中做了两件不同的事,那么每当需要修改循环时,你都得同时理解这两件事。
一个循环只做一件事,这样修改时只需要理解一件事即可。考虑堆每个循环引用提炼函数。
先进行重构,然后再进行性能优化。80% 的性能瓶颈在于 20% 的代码。循环本身很少成为性能瓶颈,而且拆分出来的循环通常还使得更强大的优化手段变得可能。
以管道取代循环(Replace Loop with Pipeline)
采用集合管道来编写,比循环的可读性更强。
移除死代码(Remove Dead Code)
一旦代码不再被使用,我们就该立马删除它。