重构第二版勘误

关于我的书,有一件事我可以准确地预测,那就是我会犯错误。以下是我知道的关于重构第二版的错误。如果你发现我没有列出的错误,请告诉我。错误将在以后的印刷版中修正。

第二版及以后印刷版的错误

第 xix 页(致谢)

第一段,最后一句。“if we wasn't writing” 应改为 “if he wasn't writing”

第 27 页(第一个例子:将计算和格式化阶段分开)

此时,我可以从 renderPlainText 中删除 plays 参数,因为它现在未使用。然而,我在重构时忽略了这一点,所以它在后面继续出现。

第 54 页(我该怎么告诉我的经理?)

在页面上的最后一段,“I've certainly seen places were refactoring…" 应改为 “I've certainly seen places where refactoring…

第 96 页(构建测试:探测边界)

在代码示例中,行

  name: "no proudcers"

应改为

  name: "no producers"

第 127 页(更改函数声明)

在简单机制部分的最后一段,“I want to rename the a changeAddress” 应改为 “I want to rename the a  changeAddress

第 149 页(将函数合并为转换)

在动机部分的第二段,“Then, to examine the derivations, all I need do” 应改为 “Then, to examine the derivations, all I need to do”

第 155 页(拆分阶段)

第二段,“It's a basic task is to take” 应改为 “It's a basic task is to take”

第 210 页(移动字段)

在第二个代码示例中,行 this._setDiscountRate(discountRate) 应该是在执行滑动语句后显示代码状态时构造函数的最后一行。

第 214 页(将语句移入函数)

在代码示例中,函数 renderPerson 有一个参数 outStream,该参数在函数体中未使用。这使得示例比应有的更令人困惑,可以安全地忽略。

第 219 页(将语句移到调用者)

第二段的第二行。“cut last line from renderPerson” 应改为 “cut last line from emitPhotoData

第 224 页(滑动语句)

在代码示例中,函数 retreiveOrder 应拼写为 retrieveOrder

第 248 页(用查询替换派生变量)

在第一段的最后一句,“I do advocate minimizing the scope of mutable data at much as possible” 应改为 “I do advocate minimizing the scope of mutable data as much as possible.”

第 253 页(将引用更改为值)

在最后一个代码示例上面的行,“enhance the constructor to call the setters” 应改为 “enhance the constructor to set these fields

第 291 页(引入特殊情况)

从底部算起第四行,“But if I change the customer class” 应改为 “But if I change the site class”

第 360 页(向下推方法)

步骤“Remove the method from each superclass that doesn't need it” 应改为 “Remove the method from each subclass that doesn't need it”

第 361 页(向下推字段)

在我的草图中,访问修饰符的方向错了。before 部分应该是 “protected String quota”,after 部分应该是 “private String quota”

第 364 页(用子类替换类型代码)

页面中间。“The employee subclass is simple” 应改为 “The engineer subclass is simple”

第 371 页(删除子类)

从顶部算起第四行。“When it comes to creating subclasses…" 应改为 “When it comes to removing subclasses…"

第一版印刷版的错误

第 xix 页(致谢)

第一段,最后一句。“if we wasn't writing” 应改为 “if he wasn't writing”

第 2 页(第一个例子:起点):第一句话:“Image a company of theatrical players” 应改为 “Imagine a company of theatrical players” [在第二版印刷版中已更正]

第 27 页(第一个例子:将计算和格式化阶段分开)

此时,我可以从 renderPlainText 中删除 plays 参数,因为它现在未使用。然而,我在重构时忽略了这一点,所以它在后面继续出现。

第 32 页(第一个例子:状态:分离到两个文件(和阶段))

在代码中,行

function renderPlainText(data, plays)

应改为

function renderPlainText(data)
[在第二版印刷版中已更正]

第 39 页(第一个例子:使性能计算器多态):第一行,“createPerformanceData” 应改为 “createStatementData” [在第二版印刷版中已更正]

第 43 页(第一个例子:状态:使用多态计算器创建数据):第二段:“createPerformanceData” 应改为 “createStatementData” [在第二版印刷版中已更正]

第 54 页(我该怎么告诉我的经理?)

在页面上的最后一段,“I've certainly seen places were refactoring…" 应改为 “I've certainly seen places where refactoring…

第 68 页(原则:自动重构):在“Brandt” 部分的第二段中,应拼写为 “Brant”。(抱歉,约翰,我似乎对你的名字有持续的盲点。)[在第二版印刷版中已更正]

第 81 页(代码味道:中间人):第二段,删除“If there is additional behavior” 之后的所有文本。[在第二版印刷版中已更正]

第 96 页(构建测试:探测边界)

在代码示例中,行

  name: "no proudcers"

应改为

  name: "no producers"

第 127 页(更改函数声明)

在简单机制部分的最后一段,“I want to rename the a changeAddress” 应改为 “I want to rename the a  changeAddress

第 135 页(封装变量):从底部算起第 3 段。“Now, any attempt to reassign the properties of the default owner will cause an error” 应改为 “Now, any attempt to reassign the properties of the default owner will be ignored” [在第二版印刷版中已更正]

第 142 页(引入参数对象):在最后一个代码示例的正上方。“adjust it to pass in the correct date range” 应改为 “adjust it to pass in the correct temperature range” [在第二版印刷版中已更正]

第 149 页(将函数合并为转换)

在动机部分的第二段,“Then, to examine the derivations, all I need do” 应改为 “Then, to examine the derivations, all I need to do”

第 155 页(拆分阶段)

第二段,“It's a basic task is to take” 应改为 “It's a basic task is to take”

第 158 页(拆分阶段):在代码的第 5 行中,应突出显示 discount: discount [在第二版印刷版中已更正]

第 162 页(封装记录)

动机部分的第一段似乎偷偷地去当地酒吧喝了一杯。它应该如下所示

记录结构是编程语言中的常见功能。它们提供了一种直观的方式将相关数据分组在一起,允许我传递有意义的数据单元,而不是松散的块。但是简单的记录结构有缺点。最令人讨厌的是,它们迫使我清楚地将存储在记录中的内容与计算值分开。考虑一个包含整数的范围的概念。我可以将其存储为 {start: 1, end:5}{start: 1, length:5}(甚至 {end: 5, length:5},如果我想炫耀我的反叛性)。但无论我存储什么,我都想知道开始、结束和长度是什么。

[在第二版印刷版中已更正]

第 210 页(移动字段)

在第二个代码示例中,行 this._setDiscountRate(discountRate) 应该是在执行滑动语句后显示代码状态时构造函数的最后一行。

第 214 页(将语句移入函数)

在代码示例中,函数 renderPerson 有一个参数 outStream,该参数在函数体中未使用。这使得示例比应有的更令人困惑,可以安全地忽略。

第 219 页(将语句移到调用者)

第二段的第二行。“cut last line from renderPerson” 应改为 “cut last line from emitPhotoData

第 224 页(滑动语句)

在代码示例中,函数 retreiveOrder 应拼写为 retrieveOrder

第 248 页(用查询替换派生变量)

在第一段的最后一句,“I do advocate minimizing the scope of mutable data at much as possible” 应改为 “I do advocate minimizing the scope of mutable data as much as possible.”

第 251 页(用查询替换派生变量):最后一段,“I'd be inclined, however, to leave totalProductionAjustments..." 应改为 ""I'd be inclined, however, to leave calculatedProductionAccumulator..." [在第二版印刷版中已更正]

第 253 页(将引用更改为值)

在最后一个代码示例上面的行,“enhance the constructor to call the setters” 应改为 “enhance the constructor to set these fields

第 263 页(合并条件表达式):在草图中,以及第 265 页顶部的代码示例中。“isNotEligableForDisability” 应改为 “isNotEligibleForDisability”。(我最初在第一版中犯了这个错误,在勘误中修正了它,并在编写第二版时重新引入了它。)[在第二版印刷版中已更正]

第 291 页(引入特殊情况)

从底部算起第四行,“But if I change the customer class” 应改为 “But if I change the site class”

第 295 页(引入特殊情况):顶部的段落,“I should be able to use Remove Dead Code on the global isPresent function” 应改为 “I should be able to use Remove Dead Code on the global isUnknown function” [在第二版印刷版中已更正]

第 360 页(向下推方法)

步骤“Remove the method from each superclass that doesn't need it” 应改为 “Remove the method from each subclass that doesn't need it”

第 361 页(向下推字段)

在我的草图中,访问修饰符的方向错了。before 部分应该是 “protected String quota”,after 部分应该是 “private String quota”

第 364 页(用子类替换类型代码)

页面中间。“The employee subclass is simple” 应改为 “The engineer subclass is simple”

第 371 页(删除子类)

从顶部算起第四行。“When it comes to creating subclasses…" 应改为 “When it comes to removing subclasses…"

第 405 页(参考文献):[gof] 参考文献的 ISBN 应改为 0201633612 [在第二版印刷版中已更正]


非常感谢 Jeff Xiong、Umang Bhatt、Gautier Hayoun、Congyu Lin、Dmytro Pavliuchenko、Linhao Li 李霖灏、Ty Lewis、Akira Hirasawa、Masao Tomono、Kiminobu Kodama、Christopher Wheeler、Ondrej Kvasnicka、David Stevenson、Vincent Petit、Jeff Bingaman、David Bausela 和 Ben Forshey 指出并告诉我这些错误