リファクタリングの正誤表

本書「リファクタリング」における現在判明しているエラーを以下に示します。

24刷以降の誤植

12ページ

double型からint型への丸め処理に関する詳細な情報について問い合わせがありました。これは複合代入演算子を使用した場合に発生します。つまり

  int foo=1;
  foo += 1.5;
  

は、以下と同等であるためコンパイルされます。

  int foo = 1;
  foo = (int) (foo + 1.5);
  

この背後にある理由は調べていません。(Java言語仕様、15.26.2項を参照)

(再版では修正できません。)

148ページ

上記のコード例において、以下の行

private double  _interestRate

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

private double _interestRate

このコードはこの時点で削除されているため。

166ページ

6番目のコード例で、以下の行

class mfDate {

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateWrap {

166ページ

5番目のコード例で、以下の行

class MfDate…

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateSub

167ページ

4番目のコード例で、以下の行

class MfDate…

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateWrap…

258ページ

最初のコード例で、以下の行

return Employee.ENGINEER;

は、以下のように修正する必要があります。

return EmployeeType.ENGINEER;

301ページ

この例には問題があります。Remove Setting Methodの議論を参照してください。

(再版では修正できません。)

316ページ

この例の最初の段落で、「クライアントがリソースを要求すると、プールはそのリソースを渡します…」という記述は、「クライアントがリソースを要求すると、マネージャーはそのリソースを渡します…」に変更する必要があります。

324ページ

最初のコード例で、以下の行

void createBill(date Date) {

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

void createBill(Date date) {

351ページ: UML図において、CustomerとStatementの関係は関連ではなく依存関係である必要があります。

366ページ

図12.6への最初の参照は、実際には図12.5を参照する必要があります。

16刷~24刷の誤植

12ページ

double型からint型への丸め処理に関する詳細な情報について問い合わせがありました。これは複合代入演算子を使用した場合に発生します。つまり

  int foo=1;
  foo += 1.5;
  

は、以下と同等であるためコンパイルされます。

  int foo = 1;
  foo = (int) (foo + 1.5);
  

この背後にある理由は調べていません。(Java言語仕様、15.26.2項を参照)

(再版では修正できません。)

119ページ: メカニズムの先頭に、「代入の右辺に副作用がないことを確認する」という手順を追加する必要があります。[24刷で修正済み]

148ページ

上記のコード例において、以下の行

private double  _interestRate

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

private double _interestRate

このコードはこの時点で削除されているため。

165ページ: 最後から2番目のコードサンプルが間違っています。正しくは以下のようになります。

class MfDateSub extends Date {
  public MfDateSub nextDay()...
  public int dayOfYear()...
[24刷で修正済み]

165ページ: 最後のコードサンプルで、class mfDateclass MfDateWrapに変更する必要があります。[24刷で修正済み]

166ページ: 最後から2番目のコードサンプルで、class mfDateclass MfDateWrapに変更する必要があります。[24刷で修正済み]

166ページ

6番目のコード例で、以下の行

class mfDate {

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateWrap {

166ページ

5番目のコード例で、以下の行

class MfDate…

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateSub

167ページ: 3分の1ほど下に、equalsメソッドが間違っています。正しくは以下のようになります。

        public boolean equals(Object arg) {
             if (this == arg) return true;
             if (! (arg instanceof MfDateWrap)) return false;
             MfDateWrap other = ((MfDateWrap) arg);
             return  (_original.equals(other._original));
         }
      
[24刷で修正済み]

167ページ

4番目のコード例で、以下の行

class MfDate…

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateWrap…

258ページ

最初のコード例で、以下の行

return Employee.ENGINEER;

は、以下のように修正する必要があります。

return EmployeeType.ENGINEER;

301ページ

この例には問題があります。Remove Setting Methodの議論を参照してください。

(再版では修正できません。)

316ページ

この例の最初の段落で、「クライアントがリソースを要求すると、プールはそのリソースを渡します…」という記述は、「クライアントがリソースを要求すると、マネージャーはそのリソースを渡します…」に変更する必要があります。

324ページ

最初のコード例で、以下の行

void createBill(date Date) {

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

void createBill(Date date) {

351ページ: UML図において、CustomerとStatementの関係は関連ではなく依存関係である必要があります。

366ページ

図12.6への最初の参照は、実際には図12.5を参照する必要があります。

15刷の誤植

12ページ

double型からint型への丸め処理に関する詳細な情報について問い合わせがありました。これは複合代入演算子を使用した場合に発生します。つまり

  int foo=1;
  foo += 1.5;
  

は、以下と同等であるためコンパイルされます。

  int foo = 1;
  foo = (int) (foo + 1.5);
  

この背後にある理由は調べていません。(Java言語仕様、15.26.2項を参照)

(再版では修正できません。)

119ページ: メカニズムの先頭に、「代入の右辺に副作用がないことを確認する」という手順を追加する必要があります。[24刷で修正済み]

148ページ

上記のコード例において、以下の行

private double  _interestRate

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

private double _interestRate

このコードはこの時点で削除されているため。

153ページ: 2段落目の3行目、「Leaのセクションで説明されているように…」は、「Leaのセクションで説明されているように…」に変更する必要があります。[16刷で修正済み]

165ページ: 最後から2番目のコードサンプルが間違っています。正しくは以下のようになります。

class MfDateSub extends Date {
  public MfDateSub nextDay()...
  public int dayOfYear()...
[24刷で修正済み]

165ページ: 最後のコードサンプルで、class mfDateclass MfDateWrapに変更する必要があります。[24刷で修正済み]

166ページ: 最後から2番目のコードサンプルで、class mfDateclass MfDateWrapに変更する必要があります。[24刷で修正済み]

166ページ

6番目のコード例で、以下の行

class mfDate {

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateWrap {

166ページ

5番目のコード例で、以下の行

class MfDate…

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateSub

167ページ: 3分の1ほど下に、equalsメソッドが間違っています。正しくは以下のようになります。

        public boolean equals(Object arg) {
             if (this == arg) return true;
             if (! (arg instanceof MfDateWrap)) return false;
             MfDateWrap other = ((MfDateWrap) arg);
             return  (_original.equals(other._original));
         }
      
[24刷で修正済み]

167ページ

4番目のコード例で、以下の行

class MfDate…

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateWrap…

222ページ: ページ下部で、getCodeメソッドをprivateにしています。BloodGroupのクライアントがそのメソッドを使用している限り、明らかにそれはできません。その結果、「メソッドをprivateにすることもできます…」という文は、「クライアントが数値コードを使用していない場合、メソッドをprivateにすることもできます…」に変更する必要があります。[16刷で修正済み]

258ページ

最初のコード例で、以下の行

return Employee.ENGINEER;

は、以下のように修正する必要があります。

return EmployeeType.ENGINEER;

301ページ

この例には問題があります。Remove Setting Methodの議論を参照してください。

(再版では修正できません。)

316ページ

この例の最初の段落で、「クライアントがリソースを要求すると、プールはそのリソースを渡します…」という記述は、「クライアントがリソースを要求すると、マネージャーはそのリソースを渡します…」に変更する必要があります。

324ページ

最初のコード例で、以下の行

void createBill(date Date) {

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

void createBill(Date date) {

351ページ: UML図において、CustomerとStatementの関係は関連ではなく依存関係である必要があります。

366ページ

図12.6への最初の参照は、実際には図12.5を参照する必要があります。

13刷~15刷の誤植

12ページ

double型からint型への丸め処理に関する詳細な情報について問い合わせがありました。これは複合代入演算子を使用した場合に発生します。つまり

  int foo=1;
  foo += 1.5;
  

は、以下と同等であるためコンパイルされます。

  int foo = 1;
  foo = (int) (foo + 1.5);
  

この背後にある理由は調べていません。(Java言語仕様、15.26.2項を参照)

(再版では修正できません。)

83ページ: 推測的汎化セクション、最初の段落、2番目の文。「ああ、これを行う機能が必要だと思います…」は、「ああ、これを行う機能が必要だと思います…」に変更する必要があります。[15刷で修正済み]

98ページ: testReadAtEndメソッドが間違っています。ソースファイルを確認したところ、メソッドは以下のように記述されていました。

 public
  void testReadAtEnd() throws IOException {
    int ch = -1234;
    for (int i = 0; i < 141; i++)
      ch = _input.read();
    assertEquals("read at end", -1, _input.read());
  }
  
これが、今日ではソースコードを自動挿入している理由の一つです![15刷で修正済み]

115ページ: 3行目、「rerun」は「return」に変更する必要があります。[15刷で修正済み]

119ページ: メカニズムの先頭に、「代入の右辺に副作用がないことを確認する」という手順を追加する必要があります。[24刷で修正済み]

120ページ: 最終行、「…一度だけ割り当てられます…」は、「…一度だけ割り当てられます…」に変更する必要があります。[15刷で修正済み]

120ページ: 解決策の説明で、「tempへのすべての参照を式に置き換える」というフレーズは、「tempへのすべての参照を新しいメソッドに置き換える」に変更する必要があります。[15刷で修正済み]

128ページ: モチベーションの最初の段落で、式「for (int i=0; i<10; i++)」には、前のテキストの括弧のバランスを取るために追加の括弧が必要です。[15刷で修正済み]

148ページ

上記のコード例において、以下の行

private double  _interestRate

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

private double _interestRate

このコードはこの時点で削除されているため。

153ページ: 2段落目の3行目、「Leaのセクションで説明されているように…」は、「Leaのセクションで説明されているように…」に変更する必要があります。[16刷で修正済み]

165ページ: 最後から2番目のコードサンプルが間違っています。正しくは以下のようになります。

class MfDateSub extends Date {
  public MfDateSub nextDay()...
  public int dayOfYear()...
[24刷で修正済み]

165ページ: 最後のコードサンプルで、class mfDateclass MfDateWrapに変更する必要があります。[24刷で修正済み]

166ページ: 最後から2番目のコードサンプルで、class mfDateclass MfDateWrapに変更する必要があります。[24刷で修正済み]

166ページ

6番目のコード例で、以下の行

class mfDate {

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateWrap {

166ページ

5番目のコード例で、以下の行

class MfDate…

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateSub

167ページ: 3分の1ほど下に、equalsメソッドが間違っています。正しくは以下のようになります。

        public boolean equals(Object arg) {
             if (this == arg) return true;
             if (! (arg instanceof MfDateWrap)) return false;
             MfDateWrap other = ((MfDateWrap) arg);
             return  (_original.equals(other._original));
         }
      
[24刷で修正済み]

167ページ

4番目のコード例で、以下の行

class MfDate…

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateWrap…

176ページ: 2段落目(メカニズムの手順)で、「getterメソッドを変更する」は、「setterメソッドを変更する」に変更する必要があります。[15刷で修正済み]

222ページ: ページ下部で、getCodeメソッドをprivateにしています。BloodGroupのクライアントがそのメソッドを使用している限り、明らかにそれはできません。その結果、「メソッドをprivateにすることもできます…」という文は、「クライアントが数値コードを使用していない場合、メソッドをprivateにすることもできます…」に変更する必要があります。[16刷で修正済み]

258ページ

最初のコード例で、以下の行

return Employee.ENGINEER;

は、以下のように修正する必要があります。

return EmployeeType.ENGINEER;

301ページ

この例には問題があります。Remove Setting Methodの議論を参照してください。

(再版では修正できません。)

316ページ

この例の最初の段落で、「クライアントがリソースを要求すると、プールはそのリソースを渡します…」という記述は、「クライアントがリソースを要求すると、マネージャーはそのリソースを渡します…」に変更する必要があります。

324ページ

最初のコード例で、以下の行

void createBill(date Date) {

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

void createBill(Date date) {

349ページ: 最初の段落は、最初の行の括弧と一致するように閉じ括弧で終わる必要があります。[15刷で修正済み]

351ページ: UML図において、CustomerとStatementの関係は関連ではなく依存関係である必要があります。

366ページ

図12.6への最初の参照は、実際には図12.5を参照する必要があります。

12刷の誤植

12ページ

double型からint型への丸め処理に関する詳細な情報について問い合わせがありました。これは複合代入演算子を使用した場合に発生します。つまり

  int foo=1;
  foo += 1.5;
  

は、以下と同等であるためコンパイルされます。

  int foo = 1;
  foo = (int) (foo + 1.5);
  

この背後にある理由は調べていません。(Java言語仕様、15.26.2項を参照)

(再版では修正できません。)

83ページ: 推測的汎化セクション、最初の段落、2番目の文。「ああ、これを行う機能が必要だと思います…」は、「ああ、これを行う機能が必要だと思います…」に変更する必要があります。[15刷で修正済み]

98ページ: testReadAtEndメソッドが間違っています。ソースファイルを確認したところ、メソッドは以下のように記述されていました。

 public
  void testReadAtEnd() throws IOException {
    int ch = -1234;
    for (int i = 0; i < 141; i++)
      ch = _input.read();
    assertEquals("read at end", -1, _input.read());
  }
  
これが、今日ではソースコードを自動挿入している理由の一つです![15刷で修正済み]

115ページ: 3行目、「rerun」は「return」に変更する必要があります。[15刷で修正済み]

119ページ: メカニズムの先頭に、「代入の右辺に副作用がないことを確認する」という手順を追加する必要があります。[24刷で修正済み]

120ページ: 最終行、「…一度だけ割り当てられます…」は、「…一度だけ割り当てられます…」に変更する必要があります。[15刷で修正済み]

120ページ: 解決策の説明で、「tempへのすべての参照を式に置き換える」というフレーズは、「tempへのすべての参照を新しいメソッドに置き換える」に変更する必要があります。[15刷で修正済み]

121ページ: これは以前のエラーに対する間違った修正でした。メカニズムの最終行で、リファクタリング「一時変数をインライン化」は「一時変数をインライン化」に変更する必要があります。同じ問題が122ページにも発生します。[13刷で修正済み]

128ページ: モチベーションの最初の段落で、式「for (int i=0; i<10; i++)」には、前のテキストの括弧のバランスを取るために追加の括弧が必要です。[15刷で修正済み]

148ページ

上記のコード例において、以下の行

private double  _interestRate

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

private double _interestRate

このコードはこの時点で削除されているため。

153ページ: 2段落目の3行目、「Leaのセクションで説明されているように…」は、「Leaのセクションで説明されているように…」に変更する必要があります。[16刷で修正済み]

165ページ: 最後から2番目のコードサンプルが間違っています。正しくは以下のようになります。

class MfDateSub extends Date {
  public MfDateSub nextDay()...
  public int dayOfYear()...
[24刷で修正済み]

165ページ: 最後のコードサンプルで、class mfDateclass MfDateWrapに変更する必要があります。[24刷で修正済み]

166ページ: 最後から2番目のコードサンプルで、class mfDateclass MfDateWrapに変更する必要があります。[24刷で修正済み]

166ページ

6番目のコード例で、以下の行

class mfDate {

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateWrap {

166ページ

5番目のコード例で、以下の行

class MfDate…

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateSub

167ページ: 3分の1ほど下に、equalsメソッドが間違っています。正しくは以下のようになります。

        public boolean equals(Object arg) {
             if (this == arg) return true;
             if (! (arg instanceof MfDateWrap)) return false;
             MfDateWrap other = ((MfDateWrap) arg);
             return  (_original.equals(other._original));
         }
      
[24刷で修正済み]

167ページ

4番目のコード例で、以下の行

class MfDate…

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateWrap…

176ページ: 2段落目(メカニズムの手順)で、「getterメソッドを変更する」は、「setterメソッドを変更する」に変更する必要があります。[15刷で修正済み]

222ページ: ページ下部で、getCodeメソッドをprivateにしています。BloodGroupのクライアントがそのメソッドを使用している限り、明らかにそれはできません。その結果、「メソッドをprivateにすることもできます…」という文は、「クライアントが数値コードを使用していない場合、メソッドをprivateにすることもできます…」に変更する必要があります。[16刷で修正済み]

225ページ: createメソッドの最初の言及で、staticキーワードが欠けています。[13刷で修正済み]

258ページ

最初のコード例で、以下の行

return Employee.ENGINEER;

は、以下のように修正する必要があります。

return EmployeeType.ENGINEER;

301ページ

この例には問題があります。Remove Setting Methodの議論を参照してください。

(再版では修正できません。)

316ページ

この例の最初の段落で、「クライアントがリソースを要求すると、プールはそのリソースを渡します…」という記述は、「クライアントがリソースを要求すると、マネージャーはそのリソースを渡します…」に変更する必要があります。

324ページ

最初のコード例で、以下の行

void createBill(date Date) {

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

void createBill(Date date) {

349ページ: 最初の段落は、最初の行の括弧と一致するように閉じ括弧で終わる必要があります。[15刷で修正済み]

351ページ: UML図において、CustomerとStatementの関係は関連ではなく依存関係である必要があります。

363ページ: このページのリファクタリングへの参照は、通常のページ参照ではなく、章参照と相互参照されています。さらに悪いことに、Extract Classの章は7章である必要があります。[13刷で修正済み]

366ページ

図12.6への最初の参照は、実際には図12.5を参照する必要があります。

8刷~12刷の誤植

2ページ: 最初の段落で、「そして映画の種類を特定します」は、「そして映画の種類を特定します」に変更する必要があります。[12刷で修正済み]

12ページ

double型からint型への丸め処理に関する詳細な情報について問い合わせがありました。これは複合代入演算子を使用した場合に発生します。つまり

  int foo=1;
  foo += 1.5;
  

は、以下と同等であるためコンパイルされます。

  int foo = 1;
  foo = (int) (foo + 1.5);
  

この背後にある理由は調べていません。(Java言語仕様、15.26.2項を参照)

(再版では修正できません。)

40ページ: 40ページと41ページのコード例では、フィールド_nameへの参照は_titleに変更する必要があります。[12刷で修正済み]

83ページ: 推測的汎化セクション、最初の段落、2番目の文。「ああ、これを行う機能が必要だと思います…」は、「ああ、これを行う機能が必要だと思います…」に変更する必要があります。[15刷で修正済み]

98ページ: testReadAtEndメソッドが間違っています。ソースファイルを確認したところ、メソッドは以下のように記述されていました。

 public
  void testReadAtEnd() throws IOException {
    int ch = -1234;
    for (int i = 0; i < 141; i++)
      ch = _input.read();
    assertEquals("read at end", -1, _input.read());
  }
  
これが、今日ではソースコードを自動挿入している理由の一つです![15刷で修正済み]

115ページ: 3行目、「rerun」は「return」に変更する必要があります。[15刷で修正済み]

119ページ: メカニズムの先頭に、「代入の右辺に副作用がないことを確認する」という手順を追加する必要があります。[24刷で修正済み]

120ページ: 最終行、「…一度だけ割り当てられます…」は、「…一度だけ割り当てられます…」に変更する必要があります。[15刷で修正済み]

120ページ: 解決策の説明で、「tempへのすべての参照を式に置き換える」というフレーズは、「tempへのすべての参照を新しいメソッドに置き換える」に変更する必要があります。[15刷で修正済み]

121ページ: これは以前のエラーに対する間違った修正でした。メカニズムの最終行で、リファクタリング「一時変数をインライン化」は「一時変数をインライン化」に変更する必要があります。同じ問題が122ページにも発生します。[13刷で修正済み]

128ページ: モチベーションの最初の段落で、式「for (int i=0; i<10; i++)」には、前のテキストの括弧のバランスを取るために追加の括弧が必要です。[15刷で修正済み]

148ページ

上記のコード例において、以下の行

private double  _interestRate

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

private double _interestRate

このコードはこの時点で削除されているため。

153ページ: 2段落目の3行目、「Leaのセクションで説明されているように…」は、「Leaのセクションで説明されているように…」に変更する必要があります。[16刷で修正済み]

165ページ: 最後から2番目のコードサンプルが間違っています。正しくは以下のようになります。

class MfDateSub extends Date {
  public MfDateSub nextDay()...
  public int dayOfYear()...
[24刷で修正済み]

165ページ: 最後のコードサンプルで、class mfDateclass MfDateWrapに変更する必要があります。[24刷で修正済み]

166ページ: 最後から2番目のコードサンプルで、class mfDateclass MfDateWrapに変更する必要があります。[24刷で修正済み]

166ページ

6番目のコード例で、以下の行

class mfDate {

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateWrap {

166ページ

5番目のコード例で、以下の行

class MfDate…

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateSub

167ページ: 3分の1ほど下に、equalsメソッドが間違っています。正しくは以下のようになります。

        public boolean equals(Object arg) {
             if (this == arg) return true;
             if (! (arg instanceof MfDateWrap)) return false;
             MfDateWrap other = ((MfDateWrap) arg);
             return  (_original.equals(other._original));
         }
      
[24刷で修正済み]

167ページ

4番目のコード例で、以下の行

class MfDate…

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateWrap…

176ページ: 2段落目(メカニズムの手順)で、「getterメソッドを変更する」は、「setterメソッドを変更する」に変更する必要があります。[15刷で修正済み]

185ページ: 2段落目「biwise xor」は「bitwise xor」に変更する必要があります。[12刷で修正済み]

222ページ: ページ下部で、getCodeメソッドをprivateにしています。BloodGroupのクライアントがそのメソッドを使用している限り、明らかにそれはできません。その結果、「メソッドをprivateにすることもできます…」という文は、「クライアントが数値コードを使用していない場合、メソッドをprivateにすることもできます…」に変更する必要があります。[16刷で修正済み]

225ページ: createメソッドの最初の言及で、staticキーワードが欠けています。[13刷で修正済み]

258ページ

最初のコード例で、以下の行

return Employee.ENGINEER;

は、以下のように修正する必要があります。

return EmployeeType.ENGINEER;

301ページ

この例には問題があります。Remove Setting Methodの議論を参照してください。

(再版では修正できません。)

316ページ

この例の最初の段落で、「クライアントがリソースを要求すると、プールはそのリソースを渡します…」という記述は、「クライアントがリソースを要求すると、マネージャーはそのリソースを渡します…」に変更する必要があります。

324ページ

最初のコード例で、以下の行

void createBill(date Date) {

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

void createBill(Date date) {

349ページ: 最初の段落は、最初の行の括弧と一致するように閉じ括弧で終わる必要があります。[15刷で修正済み]

351ページ: UML図において、CustomerとStatementの関係は関連ではなく依存関係である必要があります。

363ページ: このページのリファクタリングへの参照は、通常のページ参照ではなく、章参照と相互参照されています。さらに悪いことに、Extract Classの章は7章である必要があります。[13刷で修正済み]

366ページ

図12.6への最初の参照は、実際には図12.5を参照する必要があります。

5刷~8刷の誤植

2ページ: 最初の段落で、「そして映画の種類を特定します」は、「そして映画の種類を特定します」に変更する必要があります。[12刷で修正済み]

12ページ

double型からint型への丸め処理に関する詳細な情報について問い合わせがありました。これは複合代入演算子を使用した場合に発生します。つまり

  int foo=1;
  foo += 1.5;
  

は、以下と同等であるためコンパイルされます。

  int foo = 1;
  foo = (int) (foo + 1.5);
  

この背後にある理由は調べていません。(Java言語仕様、15.26.2項を参照)

(再版では修正できません。)

25ページ: 図1.7のキャプション「抽出前のシーケンス図…」は「抽出後のシーケンス図…」に変更する必要があります。[8刷で修正済み]

40ページ: 40ページと41ページのコード例では、フィールド_nameへの参照は_titleに変更する必要があります。[12刷で修正済み]

76ページ: 「重複コード」の3段落目。「両方のクラスで、次にフィールドを上に移動する(320)」は、「両方のクラスで、次にメソッドを上に移動する(322)」に変更する必要があります。[8刷で修正済み]

83ページ: 推測的汎化セクション、最初の段落、2番目の文。「ああ、これを行う機能が必要だと思います…」は、「ああ、これを行う機能が必要だと思います…」に変更する必要があります。[15刷で修正済み]

98ページ: testReadAtEndメソッドが間違っています。ソースファイルを確認したところ、メソッドは以下のように記述されていました。

 public
  void testReadAtEnd() throws IOException {
    int ch = -1234;
    for (int i = 0; i < 141; i++)
      ch = _input.read();
    assertEquals("read at end", -1, _input.read());
  }
  
これが、今日ではソースコードを自動挿入している理由の一つです![15刷で修正済み]

115ページ: 3行目、「rerun」は「return」に変更する必要があります。[15刷で修正済み]

119ページ: メカニズムの先頭に、「代入の右辺に副作用がないことを確認する」という手順を追加する必要があります。[24刷で修正済み]

120ページ: 最終行、「…一度だけ割り当てられます…」は、「…一度だけ割り当てられます…」に変更する必要があります。[15刷で修正済み]

120ページ: 解決策の説明で、「tempへのすべての参照を式に置き換える」というフレーズは、「tempへのすべての参照を新しいメソッドに置き換える」に変更する必要があります。[15刷で修正済み]

121ページ: メカニズムの最後のステップで、一時変数をクエリで置き換える(120)を使用するように指示していますが、これは一時変数をインライン化(119)への参照に置き換える必要があります。そうでなければ、再帰的なリファクタリングが発生します。この問題は、122ページの例でも続き、クロスリファレンスを一時変数をインライン化(119)にする必要があります。これは8刷で間違って修正されました(下記参照)。[8刷で修正済み]

121ページ: これは以前のエラーに対する間違った修正でした。メカニズムの最終行で、リファクタリング「一時変数をインライン化」は「一時変数をインライン化」に変更する必要があります。同じ問題が122ページにも発生します。[13刷で修正済み]

128ページ: モチベーションの最初の段落で、式「for (int i=0; i<10; i++)」には、前のテキストの括弧のバランスを取るために追加の括弧が必要です。[15刷で修正済み]

148ページ

上記のコード例において、以下の行

private double  _interestRate

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

private double _interestRate

このコードはこの時点で削除されているため。

153ページ: 2段落目の3行目、「Leaのセクションで説明されているように…」は、「Leaのセクションで説明されているように…」に変更する必要があります。[16刷で修正済み]

165ページ: 最後から2番目のコードサンプルが間違っています。正しくは以下のようになります。

class MfDateSub extends Date {
  public MfDateSub nextDay()...
  public int dayOfYear()...
[24刷で修正済み]

165ページ: 最後のコードサンプルで、class mfDateclass MfDateWrapに変更する必要があります。[24刷で修正済み]

166ページ: 最後から2番目のコードサンプルで、class mfDateclass MfDateWrapに変更する必要があります。[24刷で修正済み]

166ページ

6番目のコード例で、以下の行

class mfDate {

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateWrap {

166ページ

5番目のコード例で、以下の行

class MfDate…

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateSub

167ページ: 3分の1ほど下に、equalsメソッドが間違っています。正しくは以下のようになります。

        public boolean equals(Object arg) {
             if (this == arg) return true;
             if (! (arg instanceof MfDateWrap)) return false;
             MfDateWrap other = ((MfDateWrap) arg);
             return  (_original.equals(other._original));
         }
      
[24刷で修正済み]

167ページ

4番目のコード例で、以下の行

class MfDate…

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateWrap…

176ページ: 2段落目(メカニズムの手順)で、「getterメソッドを変更する」は、「setterメソッドを変更する」に変更する必要があります。[15刷で修正済み]

176ページ: numberOfOrdersForメソッドで、if (each.getCustomerName().equals(customer)) result++;となっている行は、if (each.getCustomer().equals(customer)) result++;に変更する必要があります。[8刷で修正済み]

177ページ: setCustomerメソッドの最初の状態では、_customer = new Customer (customer);となっている行は、_customer = new Customer (arg);に変更する必要があります。[8刷で修正済み]

185ページ: 2段落目「biwise xor」は「bitwise xor」に変更する必要があります。[12刷で修正済み]

219ページ: ページ中央付近の段落で、「…コードを返す新しいメソッドが必要」という文は、「…新しいクラスのインスタンスを返す新しいメソッドが必要」に変更する必要があります。[8刷で修正済み]

222ページ: ページ下部で、getCodeメソッドをprivateにしています。BloodGroupのクライアントがそのメソッドを使用している限り、明らかにそれはできません。その結果、「メソッドをprivateにすることもできます…」という文は、「クライアントが数値コードを使用していない場合、メソッドをprivateにすることもできます…」に変更する必要があります。[16刷で修正済み]

222ページ: 取り消し線のあるコードで、メソッド"public int getBloodGroup() {""public int getBloodGroupCode() {"である必要があります(名前を変更したばかりです!)。[8刷で修正済み]

225ページ: createメソッドの最初の言及で、staticキーワードが欠けています。[13刷で修正済み]

258ページ

最初のコード例で、以下の行

return Employee.ENGINEER;

は、以下のように修正する必要があります。

return EmployeeType.ENGINEER;

285ページ: beforeコードには、アサーションが常に実行されるため、リファクタリングが対処することを意図しているものよりもはるかに深刻なエラーが含まれています。beforeコードは以下のように変更する必要があります。

  void setValue (String name, int value) {
    if (name.equals("height")) {
      _height = value;
      return;
    }
    if (name.equals("width")) {
      _width = value;
      return;
    }
    Assert.shouldNeverReachHere();
  }
  
[8刷で修正済み]

301ページ

この例には問題があります。Remove Setting Methodの議論を参照してください。

(再版では修正できません。)

313ページ

以下のコード行

  Assert.isTrue("amount too large", amount > _balance); 
  

は、ブールの意味が逆であるため、エラーです。より良い行は以下になります。

  Assert.isTrue("sufficient funds", amount <= _balance);
  
[8刷で修正済み]

316ページ

この例の最初の段落で、「クライアントがリソースを要求すると、プールはそのリソースを渡します…」という記述は、「クライアントがリソースを要求すると、マネージャーはそのリソースを渡します…」に変更する必要があります。

324ページ

最初のコード例で、以下の行

void createBill(date Date) {

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

void createBill(Date date) {

324ページ: 上部のコード例で、double chargeAmount = charge (lastBillDate, date)となっている行は、double chargeAmount = chargeFor (lastBillDate, date)に変更する必要があります。(メソッド名を図と矛盾させました。)[8刷で修正済み]

328ページ: モチベーションの段落で、「メソッドを上に移動する」は、「メソッドを下に移動する」に変更する必要があります。(すべてにリンクを使用しない場合に起こることです!)[8刷で修正済み]

349ページ: 最初の段落は、最初の行の括弧と一致するように閉じ括弧で終わる必要があります。[15刷で修正済み]

351ページ: UML図において、CustomerとStatementの関係は関連ではなく依存関係である必要があります。

363ページ: このページのリファクタリングへの参照は、通常のページ参照ではなく、章参照と相互参照されています。さらに悪いことに、Extract Classの章は7章である必要があります。[13刷で修正済み]

366ページ

図12.6への最初の参照は、実際には図12.5を参照する必要があります。

4刷の誤植

xxページ: 「ジョシュアはコードスケッチのアイデアを提案しました」は、「ジョシュア・ケリエフスキーはコードスケッチのアイデアを提案しました」に変更する必要があります。[5刷で修正済み]

2ページ: 最初の段落で、「そして映画の種類を特定します」は、「そして映画の種類を特定します」に変更する必要があります。[12刷で修正済み]

12ページ

double型からint型への丸め処理に関する詳細な情報について問い合わせがありました。これは複合代入演算子を使用した場合に発生します。つまり

  int foo=1;
  foo += 1.5;
  

は、以下と同等であるためコンパイルされます。

  int foo = 1;
  foo = (int) (foo + 1.5);
  

この背後にある理由は調べていません。(Java言語仕様、15.26.2項を参照)

(再版では修正できません。)

25ページ: 図1.7のキャプション「抽出前のシーケンス図…」は「抽出後のシーケンス図…」に変更する必要があります。[8刷で修正済み]

40ページ: 40ページと41ページのコード例では、フィールド_nameへの参照は_titleに変更する必要があります。[12刷で修正済み]

76ページ: 「重複コード」の3段落目。「両方のクラスで、次にフィールドを上に移動する(320)」は、「両方のクラスで、次にメソッドを上に移動する(322)」に変更する必要があります。[8刷で修正済み]

83ページ: 推測的汎化セクション、最初の段落、2番目の文。「ああ、これを行う機能が必要だと思います…」は、「ああ、これを行う機能が必要だと思います…」に変更する必要があります。[15刷で修正済み]

98ページ: testReadAtEndメソッドが間違っています。ソースファイルを確認したところ、メソッドは以下のように記述されていました。

 public
  void testReadAtEnd() throws IOException {
    int ch = -1234;
    for (int i = 0; i < 141; i++)
      ch = _input.read();
    assertEquals("read at end", -1, _input.read());
  }
  
これが、今日ではソースコードを自動挿入している理由の一つです![15刷で修正済み]

115ページ: 3行目、「rerun」は「return」に変更する必要があります。[15刷で修正済み]

119ページ: メカニズムの先頭に、「代入の右辺に副作用がないことを確認する」という手順を追加する必要があります。[24刷で修正済み]

120ページ: 最終行、「…一度だけ割り当てられます…」は、「…一度だけ割り当てられます…」に変更する必要があります。[15刷で修正済み]

120ページ: 解決策の説明で、「tempへのすべての参照を式に置き換える」というフレーズは、「tempへのすべての参照を新しいメソッドに置き換える」に変更する必要があります。[15刷で修正済み]

121ページ: メカニズムの最後のステップで、一時変数をクエリで置き換える(120)を使用するように指示していますが、これは一時変数をインライン化(119)への参照に置き換える必要があります。そうでなければ、再帰的なリファクタリングが発生します。この問題は、122ページの例でも続き、クロスリファレンスを一時変数をインライン化(119)にする必要があります。これは8刷で間違って修正されました(下記参照)。[8刷で修正済み]

121ページ: これは以前のエラーに対する間違った修正でした。メカニズムの最終行で、リファクタリング「一時変数をインライン化」は「一時変数をインライン化」に変更する必要があります。同じ問題が122ページにも発生します。[13刷で修正済み]

128ページ: モチベーションの最初の段落で、式「for (int i=0; i<10; i++)」には、前のテキストの括弧のバランスを取るために追加の括弧が必要です。[15刷で修正済み]

148ページ

上記のコード例において、以下の行

private double  _interestRate

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

private double _interestRate

このコードはこの時点で削除されているため。

153ページ: 2段落目の3行目、「Leaのセクションで説明されているように…」は、「Leaのセクションで説明されているように…」に変更する必要があります。[16刷で修正済み]

165ページ: 最後から2番目のコードサンプルが間違っています。正しくは以下のようになります。

class MfDateSub extends Date {
  public MfDateSub nextDay()...
  public int dayOfYear()...
[24刷で修正済み]

165ページ: 最後のコードサンプルで、class mfDateclass MfDateWrapに変更する必要があります。[24刷で修正済み]

166ページ: 最後から2番目のコードサンプルで、class mfDateclass MfDateWrapに変更する必要があります。[24刷で修正済み]

166ページ

6番目のコード例で、以下の行

class mfDate {

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateWrap {

166ページ

5番目のコード例で、以下の行

class MfDate…

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateSub

167ページ: 3分の1ほど下に、equalsメソッドが間違っています。正しくは以下のようになります。

        public boolean equals(Object arg) {
             if (this == arg) return true;
             if (! (arg instanceof MfDateWrap)) return false;
             MfDateWrap other = ((MfDateWrap) arg);
             return  (_original.equals(other._original));
         }
      
[24刷で修正済み]

167ページ

4番目のコード例で、以下の行

class MfDate…

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateWrap…

176ページ: 2段落目(メカニズムの手順)で、「getterメソッドを変更する」は、「setterメソッドを変更する」に変更する必要があります。[15刷で修正済み]

176ページ: numberOfOrdersForメソッドで、if (each.getCustomerName().equals(customer)) result++;となっている行は、if (each.getCustomer().equals(customer)) result++;に変更する必要があります。[8刷で修正済み]

177ページ: setCustomerメソッドの最初の状態では、_customer = new Customer (customer);となっている行は、_customer = new Customer (arg);に変更する必要があります。[8刷で修正済み]

185ページ: 2段落目「biwise xor」は「bitwise xor」に変更する必要があります。[12刷で修正済み]

193ページ: 「interval windowがObservableを実装することを宣言するために」は、「interval windowがObserverを実装することを宣言するために」に変更する必要があります。[5刷で修正済み]

219ページ: ページ中央付近の段落で、「…コードを返す新しいメソッドが必要」という文は、「…新しいクラスのインスタンスを返す新しいメソッドが必要」に変更する必要があります。[8刷で修正済み]

222ページ: ページ下部で、getCodeメソッドをprivateにしています。BloodGroupのクライアントがそのメソッドを使用している限り、明らかにそれはできません。その結果、「メソッドをprivateにすることもできます…」という文は、「クライアントが数値コードを使用していない場合、メソッドをprivateにすることもできます…」に変更する必要があります。[16刷で修正済み]

222ページ: 取り消し線のあるコードで、メソッド"public int getBloodGroup() {""public int getBloodGroupCode() {"である必要があります(名前を変更したばかりです!)。[8刷で修正済み]

225ページ: createメソッドの最初の言及で、staticキーワードが欠けています。[13刷で修正済み]

258ページ

最初のコード例で、以下の行

return Employee.ENGINEER;

は、以下のように修正する必要があります。

return EmployeeType.ENGINEER;

261ページ: ロンの話、4段落目、「もちろん、検査を始めるとすぐに…」は、「もちろん、検査を始めるとすぐに…」に変更する必要があります。[5刷で修正済み]

285ページ: beforeコードには、アサーションが常に実行されるため、リファクタリングが対処することを意図しているものよりもはるかに深刻なエラーが含まれています。beforeコードは以下のように変更する必要があります。

  void setValue (String name, int value) {
    if (name.equals("height")) {
      _height = value;
      return;
    }
    if (name.equals("width")) {
      _width = value;
      return;
    }
    Assert.shouldNeverReachHere();
  }
  
[8刷で修正済み]

300ページ: メカニズムのセクションでは、フィールドはプロセスの最後にfinalにする必要があり、最初にfinalにする必要はありません。[5刷で修正済み]

301ページ

この例には問題があります。Remove Setting Methodの議論を参照してください。

(再版では修正できません。)

307ページ: 「class.forNameを警戒するもう一つの理由は…」は、「Class.forNameを警戒するもう一つの理由は…」に変更する必要があります(Classは大文字のCである必要があります)。[5刷で修正済み]

307ページ: 「異なるアプローチを使用できます…」は、「異なるアプローチを使用できます…」に変更する必要があります(スペル)。[5刷で修正済み]

311ページ: 「例外がチェックされている場合、呼び出し側を調整します…」は、「例外がチェックされている場合、呼び出し側を調整します…」に変更する必要があります。[5刷で修正済み]

313ページ

以下のコード行

  Assert.isTrue("amount too large", amount > _balance); 
  

は、ブールの意味が逆であるため、エラーです。より良い行は以下になります。

  Assert.isTrue("sufficient funds", amount <= _balance);
  
[8刷で修正済み]

316ページ

この例の最初の段落で、「クライアントがリソースを要求すると、プールはそのリソースを渡します…」という記述は、「クライアントがリソースを要求すると、マネージャーはそのリソースを渡します…」に変更する必要があります。

324ページ

最初のコード例で、以下の行

void createBill(date Date) {

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

void createBill(Date date) {

324ページ: 上部のコード例で、double chargeAmount = charge (lastBillDate, date)となっている行は、double chargeAmount = chargeFor (lastBillDate, date)に変更する必要があります。(メソッド名を図と矛盾させました。)[8刷で修正済み]

328ページ: モチベーションの段落で、「メソッドを上に移動する」は、「メソッドを下に移動する」に変更する必要があります。(すべてにリンクを使用しない場合に起こることです!)[8刷で修正済み]

333ページ: 「引数は作業項目で必要であり、一部は必要ではありません」は、「一部の引数は必要です…」に変更する必要があります(単語が抜けています)。[5刷で修正済み]

346ページ: 「2つの類似したメソッドが見られるたびに」は、「2つの類似したメソッドが見られるたびに」に変更する必要があります(複数形)。[5刷で修正済み]

346ページ: 「statementメソッドはステートメントを出力します」は、「statementメソッドはステートメントを出力します」に変更する必要があります(フォント)。[5刷で修正済み]

349ページ: 最初の段落は、最初の行の括弧と一致するように閉じ括弧で終わる必要があります。[15刷で修正済み]

351ページ: UML図において、CustomerとStatementの関係は関連ではなく依存関係である必要があります。

363ページ: このページのリファクタリングへの参照は、通常のページ参照ではなく、章参照と相互参照されています。さらに悪いことに、Extract Classの章は7章である必要があります。[13刷で修正済み]

366ページ

図12.6への最初の参照は、実際には図12.5を参照する必要があります。

3刷の誤植

xxページ: 「ジョシュアはコードスケッチのアイデアを提案しました」は、「ジョシュア・ケリエフスキーはコードスケッチのアイデアを提案しました」に変更する必要があります。[5刷で修正済み]

2ページ: 最初の段落で、「そして映画の種類を特定します」は、「そして映画の種類を特定します」に変更する必要があります。[12刷で修正済み]

12ページ

double型からint型への丸め処理に関する詳細な情報について問い合わせがありました。これは複合代入演算子を使用した場合に発生します。つまり

  int foo=1;
  foo += 1.5;
  

は、以下と同等であるためコンパイルされます。

  int foo = 1;
  foo = (int) (foo + 1.5);
  

この背後にある理由は調べていません。(Java言語仕様、15.26.2項を参照)

(再版では修正できません。)

25ページ: 図1.7のキャプション「抽出前のシーケンス図…」は「抽出後のシーケンス図…」に変更する必要があります。[8刷で修正済み]

40ページ: 40ページと41ページのコード例では、フィールド_nameへの参照は_titleに変更する必要があります。[12刷で修正済み]

76ページ: 「重複コード」の3段落目。「両方のクラスで、次にフィールドを上に移動する(320)」は、「両方のクラスで、次にメソッドを上に移動する(322)」に変更する必要があります。[8刷で修正済み]

83ページ: 推測的汎化セクション、最初の段落、2番目の文。「ああ、これを行う機能が必要だと思います…」は、「ああ、これを行う機能が必要だと思います…」に変更する必要があります。[15刷で修正済み]

98ページ: testReadAtEndメソッドが間違っています。ソースファイルを確認したところ、メソッドは以下のように記述されていました。

 public
  void testReadAtEnd() throws IOException {
    int ch = -1234;
    for (int i = 0; i < 141; i++)
      ch = _input.read();
    assertEquals("read at end", -1, _input.read());
  }
  
これが、今日ではソースコードを自動挿入している理由の一つです![15刷で修正済み]

115ページ: 3行目、「rerun」は「return」に変更する必要があります。[15刷で修正済み]

119ページ: メカニズムの先頭に、「代入の右辺に副作用がないことを確認する」という手順を追加する必要があります。[24刷で修正済み]

120ページ: 最終行、「…一度だけ割り当てられます…」は、「…一度だけ割り当てられます…」に変更する必要があります。[15刷で修正済み]

120ページ: 解決策の説明で、「tempへのすべての参照を式に置き換える」というフレーズは、「tempへのすべての参照を新しいメソッドに置き換える」に変更する必要があります。[15刷で修正済み]

121ページ: メカニズムの最後のステップで、一時変数をクエリで置き換える(120)を使用するように指示していますが、これは一時変数をインライン化(119)への参照に置き換える必要があります。そうでなければ、再帰的なリファクタリングが発生します。この問題は、122ページの例でも続き、クロスリファレンスを一時変数をインライン化(119)にする必要があります。これは8刷で間違って修正されました(下記参照)。[8刷で修正済み]

121ページ: これは以前のエラーに対する間違った修正でした。メカニズムの最終行で、リファクタリング「一時変数をインライン化」は「一時変数をインライン化」に変更する必要があります。同じ問題が122ページにも発生します。[13刷で修正済み]

128ページ: モチベーションの最初の段落で、式「for (int i=0; i<10; i++)」には、前のテキストの括弧のバランスを取るために追加の括弧が必要です。[15刷で修正済み]

148ページ

上記のコード例において、以下の行

private double  _interestRate

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

private double _interestRate

このコードはこの時点で削除されているため。

153ページ: 2段落目の3行目、「Leaのセクションで説明されているように…」は、「Leaのセクションで説明されているように…」に変更する必要があります。[16刷で修正済み]

165ページ: 最後から2番目のコードサンプルが間違っています。正しくは以下のようになります。

class MfDateSub extends Date {
  public MfDateSub nextDay()...
  public int dayOfYear()...
[24刷で修正済み]

165ページ: 最後のコードサンプルで、class mfDateclass MfDateWrapに変更する必要があります。[24刷で修正済み]

166ページ: 最後から2番目のコードサンプルで、class mfDateclass MfDateWrapに変更する必要があります。[24刷で修正済み]

166ページ

6番目のコード例で、以下の行

class mfDate {

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateWrap {

166ページ

5番目のコード例で、以下の行

class MfDate…

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateSub

167ページ: 3分の1ほど下に、equalsメソッドが間違っています。正しくは以下のようになります。

        public boolean equals(Object arg) {
             if (this == arg) return true;
             if (! (arg instanceof MfDateWrap)) return false;
             MfDateWrap other = ((MfDateWrap) arg);
             return  (_original.equals(other._original));
         }
      
[24刷で修正済み]

167ページ

4番目のコード例で、以下の行

class MfDate…

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateWrap…

176ページ: 2段落目(メカニズムの手順)で、「getterメソッドを変更する」は、「setterメソッドを変更する」に変更する必要があります。[15刷で修正済み]

176ページ: numberOfOrdersForメソッドで、if (each.getCustomerName().equals(customer)) result++;となっている行は、if (each.getCustomer().equals(customer)) result++;に変更する必要があります。[8刷で修正済み]

177ページ: setCustomerメソッドの最初の状態では、_customer = new Customer (customer);となっている行は、_customer = new Customer (arg);に変更する必要があります。[8刷で修正済み]

185ページ: 2段落目「biwise xor」は「bitwise xor」に変更する必要があります。[12刷で修正済み]

193ページ: 「interval windowがObservableを実装することを宣言するために」は、「interval windowがObserverを実装することを宣言するために」に変更する必要があります。[5刷で修正済み]

219ページ: ページ中央付近の段落で、「…コードを返す新しいメソッドが必要」という文は、「…新しいクラスのインスタンスを返す新しいメソッドが必要」に変更する必要があります。[8刷で修正済み]

222ページ: ページ下部で、getCodeメソッドをprivateにしています。BloodGroupのクライアントがそのメソッドを使用している限り、明らかにそれはできません。その結果、「メソッドをprivateにすることもできます…」という文は、「クライアントが数値コードを使用していない場合、メソッドをprivateにすることもできます…」に変更する必要があります。[16刷で修正済み]

222ページ: 取り消し線のあるコードで、メソッド"public int getBloodGroup() {""public int getBloodGroupCode() {"である必要があります(名前を変更したばかりです!)。[8刷で修正済み]

225ページ: createメソッドの最初の言及で、staticキーワードが欠けています。[13刷で修正済み]

241ページ: ページ下部のコード例では、メソッドisEligibleForDisabilityisNotEligibleForDisabilityである必要があります。[4刷で修正済み]

258ページ

最初のコード例で、以下の行

return Employee.ENGINEER;

は、以下のように修正する必要があります。

return EmployeeType.ENGINEER;

261ページ: ロンの話、4段落目、「もちろん、検査を始めるとすぐに…」は、「もちろん、検査を始めるとすぐに…」に変更する必要があります。[5刷で修正済み]

285ページ: beforeコードには、アサーションが常に実行されるため、リファクタリングが対処することを意図しているものよりもはるかに深刻なエラーが含まれています。beforeコードは以下のように変更する必要があります。

  void setValue (String name, int value) {
    if (name.equals("height")) {
      _height = value;
      return;
    }
    if (name.equals("width")) {
      _width = value;
      return;
    }
    Assert.shouldNeverReachHere();
  }
  
[8刷で修正済み]

300ページ: メカニズムのセクションでは、フィールドはプロセスの最後にfinalにする必要があり、最初にfinalにする必要はありません。[5刷で修正済み]

301ページ

この例には問題があります。Remove Setting Methodの議論を参照してください。

(再版では修正できません。)

307ページ: 「class.forNameを警戒するもう一つの理由は…」は、「Class.forNameを警戒するもう一つの理由は…」に変更する必要があります(Classは大文字のCである必要があります)。[5刷で修正済み]

307ページ: 「異なるアプローチを使用できます…」は、「異なるアプローチを使用できます…」に変更する必要があります(スペル)。[5刷で修正済み]

311ページ: 「例外がチェックされている場合、呼び出し側を調整します…」は、「例外がチェックされている場合、呼び出し側を調整します…」に変更する必要があります。[5刷で修正済み]

313ページ

以下のコード行

  Assert.isTrue("amount too large", amount > _balance); 
  

は、ブールの意味が逆であるため、エラーです。より良い行は以下になります。

  Assert.isTrue("sufficient funds", amount <= _balance);
  
[8刷で修正済み]

315ページ: 問題文は、「呼び出し側が最初にチェックできた条件で例外をスローしています」(リファクタリングはチェックされた例外だけでなく、すべての例外に適用されます)に変更する必要があります。[4刷で修正済み]

316ページ

この例の最初の段落で、「クライアントがリソースを要求すると、プールはそのリソースを渡します…」という記述は、「クライアントがリソースを要求すると、マネージャーはそのリソースを渡します…」に変更する必要があります。

324ページ

最初のコード例で、以下の行

void createBill(date Date) {

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

void createBill(Date date) {

324ページ: 上部のコード例で、double chargeAmount = charge (lastBillDate, date)となっている行は、double chargeAmount = chargeFor (lastBillDate, date)に変更する必要があります。(メソッド名を図と矛盾させました。)[8刷で修正済み]

328ページ: モチベーションの段落で、「メソッドを上に移動する」は、「メソッドを下に移動する」に変更する必要があります。(すべてにリンクを使用しない場合に起こることです!)[8刷で修正済み]

333ページ: 「引数は作業項目で必要であり、一部は必要ではありません」は、「一部の引数は必要です…」に変更する必要があります(単語が抜けています)。[5刷で修正済み]

346ページ: 「2つの類似したメソッドが見られるたびに」は、「2つの類似したメソッドが見られるたびに」に変更する必要があります(複数形)。[5刷で修正済み]

346ページ: 「statementメソッドはステートメントを出力します」は、「statementメソッドはステートメントを出力します」に変更する必要があります(フォント)。[5刷で修正済み]

349ページ: 最初の段落は、最初の行の括弧と一致するように閉じ括弧で終わる必要があります。[15刷で修正済み]

351ページ: UML図において、CustomerとStatementの関係は関連ではなく依存関係である必要があります。

363ページ: このページのリファクタリングへの参照は、通常のページ参照ではなく、章参照と相互参照されています。さらに悪いことに、Extract Classの章は7章である必要があります。[13刷で修正済み]

366ページ

図12.6への最初の参照は、実際には図12.5を参照する必要があります。

1刷~3刷の誤植

xxページ: 「ジョシュアはコードスケッチのアイデアを提案しました」は、「ジョシュア・ケリエフスキーはコードスケッチのアイデアを提案しました」に変更する必要があります。[5刷で修正済み]

2ページ: 最初の段落で、「そして映画の種類を特定します」は、「そして映画の種類を特定します」に変更する必要があります。[12刷で修正済み]

12ページ

double型からint型への丸め処理に関する詳細な情報について問い合わせがありました。これは複合代入演算子を使用した場合に発生します。つまり

  int foo=1;
  foo += 1.5;
  

は、以下と同等であるためコンパイルされます。

  int foo = 1;
  foo = (int) (foo + 1.5);
  

この背後にある理由は調べていません。(Java言語仕様、15.26.2項を参照)

(再版では修正できません。)

25ページ: 図1.7のキャプション「抽出前のシーケンス図…」は「抽出後のシーケンス図…」に変更する必要があります。[8刷で修正済み]

37ページ: 「Class rental」は「class Rental」(大文字)に変更し、「class movie」は「class Movie」(大文字)に変更する必要があります。[3刷で修正済み]

40ページ: 40ページと41ページのコード例では、フィールド_nameへの参照は_titleに変更する必要があります。[12刷で修正済み]

48ページ: 2行目:「class Rental…」は「class Movie…」に変更する必要があります。[3刷で修正済み]

70ページ: スティーブ・マコネルの姓が2カ所で誤って綴られています。[3刷で修正済み]

76ページ: 「重複コード」の3段落目。「両方のクラスで、次にフィールドを上に移動する(320)」は、「両方のクラスで、次にメソッドを上に移動する(322)」に変更する必要があります。[8刷で修正済み]

82ページ: 「switchに新しい節を追加する場合は、これらのswitch文をすべて見つけて変更する必要があります。」2番目のカンマを削除する必要があります。[3刷で修正済み]

83ページ: 推測的汎化セクション、最初の段落、2番目の文。「ああ、これを行う機能が必要だと思います…」は、「ああ、これを行う機能が必要だと思います…」に変更する必要があります。[15刷で修正済み]

85ページ: 不適切な親密さにおける「委譲を継承で置き換える(355)」は、「継承を委譲で置き換える(352)」に変更する必要があります。[3刷で修正済み]

92ページ: 図4.1において、TestSuiteからTestへの線は汎化ではなく関連であるべきです(下記図参照)。また、パッケージ名はjunit.frameworkであるべきです。[第3刷で修正済み]

92ページ: 例のテストファイルにおいて、ジョージ・ヘッドリーの通算テストラン数は実際には2190でした。[第3刷で修正済み]

98ページ: testReadAtEndメソッドが間違っています。ソースファイルを確認したところ、メソッドは以下のように記述されていました。

 public
  void testReadAtEnd() throws IOException {
    int ch = -1234;
    for (int i = 0; i < 141; i++)
      ch = _input.read();
    assertEquals("read at end", -1, _input.read());
  }
  
これが、今日ではソースコードを自動挿入している理由の一つです![15刷で修正済み]

115ページ: 2文目の"oustanding"は"outstanding"の間違いです。[第3刷で修正済み]

115ページ: 3行目、「rerun」は「return」に変更する必要があります。[15刷で修正済み]

119ページ: メカニズムの先頭に、「代入の右辺に副作用がないことを確認する」という手順を追加する必要があります。[24刷で修正済み]

120ページ: 最終行、「…一度だけ割り当てられます…」は、「…一度だけ割り当てられます…」に変更する必要があります。[15刷で修正済み]

120ページ: 解決策の説明で、「tempへのすべての参照を式に置き換える」というフレーズは、「tempへのすべての参照を新しいメソッドに置き換える」に変更する必要があります。[15刷で修正済み]

121ページ: メカニズムの最後のステップで、一時変数をクエリで置き換える(120)を使用するように指示していますが、これは一時変数をインライン化(119)への参照に置き換える必要があります。そうでなければ、再帰的なリファクタリングが発生します。この問題は、122ページの例でも続き、クロスリファレンスを一時変数をインライン化(119)にする必要があります。これは8刷で間違って修正されました(下記参照)。[8刷で修正済み]

121ページ: これは以前のエラーに対する間違った修正でした。メカニズムの最終行で、リファクタリング「一時変数をインライン化」は「一時変数をインライン化」に変更する必要があります。同じ問題が122ページにも発生します。[13刷で修正済み]

128ページ: モチベーションの最初の段落で、式「for (int i=0; i<10; i++)」には、前のテキストの括弧のバランスを取るために追加の括弧が必要です。[15刷で修正済み]

148ページ

上記のコード例において、以下の行

private double  _interestRate

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

private double _interestRate

このコードはこの時点で削除されているため。

153ページ: 2段落目の3行目、「Leaのセクションで説明されているように…」は、「Leaのセクションで説明されているように…」に変更する必要があります。[16刷で修正済み]

165ページ: 最後から2番目のコードサンプルが間違っています。正しくは以下のようになります。

class MfDateSub extends Date {
  public MfDateSub nextDay()...
  public int dayOfYear()...
[24刷で修正済み]

165ページ: 最後のコードサンプルで、class mfDateclass MfDateWrapに変更する必要があります。[24刷で修正済み]

166ページ: 最後から2番目のコードサンプルで、class mfDateclass MfDateWrapに変更する必要があります。[24刷で修正済み]

166ページ

6番目のコード例で、以下の行

class mfDate {

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateWrap {

166ページ

5番目のコード例で、以下の行

class MfDate…

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateSub

167ページ: 3分の1ほど下に、equalsメソッドが間違っています。正しくは以下のようになります。

        public boolean equals(Object arg) {
             if (this == arg) return true;
             if (! (arg instanceof MfDateWrap)) return false;
             MfDateWrap other = ((MfDateWrap) arg);
             return  (_original.equals(other._original));
         }
      
[24刷で修正済み]

167ページ

4番目のコード例で、以下の行

class MfDate…

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

class MfDateWrap…

176ページ: 2段落目(メカニズムの手順)で、「getterメソッドを変更する」は、「setterメソッドを変更する」に変更する必要があります。[15刷で修正済み]

176ページ: numberOfOrdersForメソッドで、if (each.getCustomerName().equals(customer)) result++;となっている行は、if (each.getCustomer().equals(customer)) result++;に変更する必要があります。[8刷で修正済み]

177ページ: setCustomerメソッドの最初の状態では、_customer = new Customer (customer);となっている行は、_customer = new Customer (arg);に変更する必要があります。[8刷で修正済み]

185ページ: 2段落目「biwise xor」は「bitwise xor」に変更する必要があります。[12刷で修正済み]

193ページ: 「interval windowがObservableを実装することを宣言するために」は、「interval windowがObserverを実装することを宣言するために」に変更する必要があります。[5刷で修正済み]

219ページ: ページ中央付近の段落で、「…コードを返す新しいメソッドが必要」という文は、「…新しいクラスのインスタンスを返す新しいメソッドが必要」に変更する必要があります。[8刷で修正済み]

222ページ: ページ下部で、getCodeメソッドをprivateにしています。BloodGroupのクライアントがそのメソッドを使用している限り、明らかにそれはできません。その結果、「メソッドをprivateにすることもできます…」という文は、「クライアントが数値コードを使用していない場合、メソッドをprivateにすることもできます…」に変更する必要があります。[16刷で修正済み]

222ページ: 取り消し線のあるコードで、メソッド"public int getBloodGroup() {""public int getBloodGroupCode() {"である必要があります(名前を変更したばかりです!)。[8刷で修正済み]

225ページ: createメソッドの最初の言及で、staticキーワードが欠けています。[13刷で修正済み]

241ページ: ページ下部のコード例では、メソッドisEligibleForDisabilityisNotEligibleForDisabilityである必要があります。[4刷で修正済み]

258ページ

最初のコード例で、以下の行

return Employee.ENGINEER;

は、以下のように修正する必要があります。

return EmployeeType.ENGINEER;

261ページ: ロンの話、4段落目、「もちろん、検査を始めるとすぐに…」は、「もちろん、検査を始めるとすぐに…」に変更する必要があります。[5刷で修正済み]

285ページ: beforeコードには、アサーションが常に実行されるため、リファクタリングが対処することを意図しているものよりもはるかに深刻なエラーが含まれています。beforeコードは以下のように変更する必要があります。

  void setValue (String name, int value) {
    if (name.equals("height")) {
      _height = value;
      return;
    }
    if (name.equals("width")) {
      _width = value;
      return;
    }
    Assert.shouldNeverReachHere();
  }
  
[8刷で修正済み]

300ページ: メカニズムのセクションでは、フィールドはプロセスの最後にfinalにする必要があり、最初にfinalにする必要はありません。[5刷で修正済み]

301ページ

この例には問題があります。Remove Setting Methodの議論を参照してください。

(再版では修正できません。)

307ページ: 「class.forNameを警戒するもう一つの理由は…」は、「Class.forNameを警戒するもう一つの理由は…」に変更する必要があります(Classは大文字のCである必要があります)。[5刷で修正済み]

307ページ: 「異なるアプローチを使用できます…」は、「異なるアプローチを使用できます…」に変更する必要があります(スペル)。[5刷で修正済み]

311ページ: 「例外がチェックされている場合、呼び出し側を調整します…」は、「例外がチェックされている場合、呼び出し側を調整します…」に変更する必要があります。[5刷で修正済み]

313ページ

以下のコード行

  Assert.isTrue("amount too large", amount > _balance); 
  

は、ブールの意味が逆であるため、エラーです。より良い行は以下になります。

  Assert.isTrue("sufficient funds", amount <= _balance);
  
[8刷で修正済み]

315ページ: 問題文は、「呼び出し側が最初にチェックできた条件で例外をスローしています」(リファクタリングはチェックされた例外だけでなく、すべての例外に適用されます)に変更する必要があります。[4刷で修正済み]

316ページ

この例の最初の段落で、「クライアントがリソースを要求すると、プールはそのリソースを渡します…」という記述は、「クライアントがリソースを要求すると、マネージャーはそのリソースを渡します…」に変更する必要があります。

324ページ

最初のコード例で、以下の行

void createBill(date Date) {

は、この時点でコードが削除されているため、以下のように読み替える必要があります。

void createBill(Date date) {

324ページ: 上部のコード例で、double chargeAmount = charge (lastBillDate, date)となっている行は、double chargeAmount = chargeFor (lastBillDate, date)に変更する必要があります。(メソッド名を図と矛盾させました。)[8刷で修正済み]

328ページ: モチベーションの段落で、「メソッドを上に移動する」は、「メソッドを下に移動する」に変更する必要があります。(すべてにリンクを使用しない場合に起こることです!)[8刷で修正済み]

333ページ: 「引数は作業項目で必要であり、一部は必要ではありません」は、「一部の引数は必要です…」に変更する必要があります(単語が抜けています)。[5刷で修正済み]

346ページ: 「2つの類似したメソッドが見られるたびに」は、「2つの類似したメソッドが見られるたびに」に変更する必要があります(複数形)。[5刷で修正済み]

346ページ: 「statementメソッドはステートメントを出力します」は、「statementメソッドはステートメントを出力します」に変更する必要があります(フォント)。[5刷で修正済み]

349ページ: 最初の段落は、最初の行の括弧と一致するように閉じ括弧で終わる必要があります。[15刷で修正済み]

351ページ: UML図において、CustomerとStatementの関係は関連ではなく依存関係である必要があります。

355ページ: 「Motivation」セクションの1行目、「…委譲を継承で置き換える(355)」は「継承を委譲で置き換える(352)」とするべきです。[第3刷で修正済み]

363ページ: このページのリファクタリングへの参照は、通常のページ参照ではなく、章参照と相互参照されています。さらに悪いことに、Extract Classの章は7章である必要があります。[13刷で修正済み]

366ページ

図12.6への最初の参照は、実際には図12.5を参照する必要があります。

390ページ: 「…vivc.edu」は「uiuc.edu」の間違いです。[第3刷で修正済み]

405ページ: 右下の最後のボックスは「Hello World」であるべきです(「out」ではありません)。[第3刷で修正済み]

405ページ: プログラムの構文木において、「hello」(メソッド名)は小文字であるべきです。[第3刷で修正済み]

414ページ: URL「compuserv」のJUnitへの参照は「compuserve」の間違いです。[第3刷で修正済み]

92ページの図4.1の修正版。

corrected figure 4.1


これらの誤りを発見し、報告してくださったMike Anderson、Alex Aptekman、Beth Egan Bradtke、Greg Cohoon、George Cowan、Bruce Crawford、John Dale、Nick Dallet、Dion Dock、Jutta Eckstein、Raimar Falke、Paul Haahr、平澤明(Akira Hirasawa)、John Hollister、Heinz Kabutz、Bernd Kahlbrandt、Adam Kiezun、Bart Koestner、Kim Jung-joon、Mark Kinzie、Hamish Lawson、Lee Hwijae、Lee Jaeik、Marc Lepage、Ron Lusk、Chuck McKinnon、Rory Molinari、Anthon van der Neut、Jonas Nyrup、Orjan Petersson、Jon Reid、Oliver Rode、Gavin Scott、Patricia Shanahan、Pradyumn Sharma、Joel Smith、Ellen Spertus、Dawie Strauss、Frank Tip、Madhavi Tolety、Bill Wake、矢崎弘秀(Hirohide Yazaki)の皆様に深く感謝申し上げます。