重构(六)重构名录-搬移特性

搬移函数 Move Function 重构(六)重构名录-搬移特性
文章图片
image.png

  • 模块化是优秀软件设计的核心所在,好的模块化能够让我在修改程序时只需要理解程序的一小部分。为了设计出高度模块化的程序,我得保证互相关联的软件要素都能集中到一块儿,并确保块与块之间的联系易于查找、直观易懂。同时,我对模块设计的理解并不是一成不变的,随着我对代码的理解加深,我会知道哪些软件要素如何组织最为恰当。要将这种理解反映到代码上,就得不断地搬移这些元素。
  • 任何函数都需要具备上下文环境才能存活。这个上下文可以是全局的,但它更多时候是由某种形式的模块所提供的。对一个面向对象的程序而言,类作为最主要的模块化手段,其本身就能充当函数的上下文;通过嵌套的方式,外层函数也能为内存函数提供一个上下文。不同的语言提供的模块化机制各不相同,单这些模块的共同点是,它们都能为函数提供一个赖以存活的上下文环境。
  • 搬移函数最直接的一个动因是:它频繁引用其他上下文中的元素,而对自身上下文中的元素却关心甚少。
搬移字段 Move Field 重构(六)重构名录-搬移特性
文章图片
image.png
  • 编程活动中你需要编写许多代码,为系统实现特定的行为,但往往数据结构才是一个健壮程序的根基。一个适应于问题域的良好数据结构,可以让行为代码变得简单明了。
  • 好的数据结构至关重要,但它们很难一次做对。通常会做预先设计,设法得到最恰当的数据结构。但在不断编程过程中,对问题域的理解会加深。可能会发现当初良好的数据结构可能已经不适应需求了,那么就应该马上修缮。把不适合的字段搬移到它应当所在的位置。
搬移语句到函数 Move Statements into Function 重构(六)重构名录-搬移特性
文章图片
image.png
  • 动机:要维护代码库的健康发展,需要遵守几条黄金法则,其中最重要的一条当属“消除重复”。如果我发现调用某个函数时,总有一些相同的代码也需要每次执行,那么我会考虑将此代码合并到函数里头。这样,日后对这段代码的修改只需要改一处地方,还能对所有调用者同时生效。
  • 如果某些语句与一个函数放在一起更像一个整体,并且更有助于理解,那我就会毫不犹豫地将语句搬移到函数里去。如果它们与函数不像一个整体,但仍应与函数一起执行,那么可以使用提炼函数将语句和函数一并提炼出去。
搬移语句到调用者 Move Statements to Callers 重构(六)重构名录-搬移特性
文章图片
image.png
  • 动机:以往在多个地方共用的行为,如今需要在某些调用点面前表现出不同的行为。于是,需要把表现不同的行为从函数里挪出,并搬移到其调用处。
以函数调用取代内联代码 Replace Inline Code with Function Call 重构(六)重构名录-搬移特性
文章图片
image.png
  • 动机:states中已经有判断是否包含xxx的函数了,我们就不必再用for重复一遍了。熟悉语言的api,并善用。
移动语句 Slide Statements 重构(六)重构名录-搬移特性
文章图片
image.png
  • 动机:让存在关联的东西一起出现,可以使代码更容易理解。
拆分循环 Split Loop 重构(六)重构名录-搬移特性
文章图片
image.png
  • 动机:你常常能见到一些身兼多职的循环,它们一次做了两三件事情,不为别的,就因为这样可以只循环一次。单如果你在一次循环中做了两件不同的事,那么每当需要修改循环时,你都得同时理解两件事情。如果能够将循环拆分,让一个循环只做一件事情,那么就能确保每次修改时,你只需要理解要修改的那段代码的行为就可以了。
  • 主要令程序员不安的是,执行了两次循环。仿佛犯了天大的错误,仿佛性能因此降低了很多。
以管道取代循环 Replace Loop with PipeLine 重构(六)重构名录-搬移特性
文章图片
image.png
  • 动机:越来越多的编程语言提供了更好的语言结构来处理迭代过程,这种结构就叫做集合管道。集合管道是这样一种技术,它允许我使用一组运算来描述集合的迭代过程,其中每种运算接收的入参和返回值都是一个集合。运算得到的集合可以供管道的后续流程使用。我发现一些逻辑如果采用集合管道来编写,代码的可读性会更强——我只消从头到尾阅读一遍代码,就能弄清楚对象在管道中间的变换过程。
移除死代码 Remove Dead Code 重构(六)重构名录-搬移特性
文章图片
image.png
  • 动机:当尝试阅读代码、理解软件的运作原理时,无用代码会带来额外的思维负担。当程序员花费了许多时间,尝试理解它的工作原理时,却发现无论怎么修改这段代码都无法得到期望的输出。

    推荐阅读