likes
comments
collection
share

重构 改善既有代码的设计

作者站长头像
站长
· 阅读数 49

一、提炼函数(P106)

1. 什么是提炼函数:

  • 浏览一段代码,理解其作用,并且发现这段代码可以提取出来
  • 将这段代码放进一个独立函数中,并让函数名称解释该函数的用途

2. 什么时候需要提炼函数:

  • 函数过长
  • 难以理解,你需要花时间浏览一段代码才能弄清它到底在干什么

3. 提炼函数的注意点:

  • 写非常小的函数,不必担心短函数的大量调用会影响性能
  • 重点关注函数的命名,函数的注释往往会提供一个好名字
  • 函数名的长度并不重要,关键是将函数的意图与实现分离

4. 如何提炼函数:

  1. 找出需要提炼成函数的代码片段
  2. 创建一个新函数,并对这个函数名实现意图化表达(以它“做什么”来命名,而不是以它“怎样做”命名)
  3. 将需要提炼的代码片段复制一份到新函数中
  4. 对提炼函数的变量进行处理(参照下方 -- 提炼函数变量处理)
  5. 将原函数的代码片段注释,并在此处进行提炼函数的调用
  6. 对函数功能进行测试
  7. 删除注释掉的代码片段

5. 提炼函数变量的处理:

  • 不存在变量作用域的问题

    • 如果提炼出的新函数嵌套在原函数内部,不需要进行处理
    • 如果提炼出的新函数不需要用到原函数的变量,不需要进行处理
  • 存在变量作用域的问题(提炼函数引用了作用域限于原函数,在提炼出的新函数访问不到的变量)

    • 这些作用域限于原函数的变量通常为局部变量或原函数的参数,可以作为参数传递给提炼函数
    • 如果变量是在提炼部分之外声明但只在提炼函数中被使用,就把变量声明也搬移到提炼函数中去
    • 如果变量传递给提炼函数,并且变量值被修改了,看看是否能够将提炼函数处理为一个查询,并将返回值赋值给相关变量
    • 如果提炼部分被赋值的局部变量太多,就需要使用 “分解临时变量” 或 “以查询取代临时变量“ 进行处理,然后再尝试提炼。

6. 涉及知识点

  • 以查询取代临时变量(P178)
  • 拆分变量(P240)
  • 内联变量(P123)
  • 将查询函数和修改函数分离(P306)