重构第二版勘误
关于我的书,有一件事我可以准确地预测,那就是我会犯错误。以下是我知道的关于重构第二版的错误。如果你发现我没有列出的错误,请告诉我。错误将在以后的印刷版中修正。
第二版及以后印刷版的错误
第 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 指出并告诉我这些错误