Java言語で学ぶリファクタリング入門
ソフトバンククリエイティブ
著者:結城浩
はじめに
本書の特徴
本書の読者
本書の構成
本書のサンプルプログラム
サンプルプログラムの入手方法
Mainクラスについて
謝辞
本書の図について
UMLについて
クラス図
シーケンス図
コメント役割
第0章 リファクタリングとは
この章で学ぶこと
リファクタリングとは
リファクタリングの定義
リファクタリング・クイズ
リファクタリングとユニットテスト
リファクタリングの目的
リファクタリングの限界
リファクタリングと「不吉な匂い」
不吉な匂いとは
不吉な匂いを示すセリフ
リファクタリング・カタログ
リファクタリング・カタログとは
システマティックな修正
リファクタリングのエッセンス
ステップ・バイ・ステップ:2つの修正を1度に行わない
ステップ・バイ・ステップ:後戻りしやすいように
ステップ・バイ・ステップ:ステップごとの確認
ステップ・バイ・ステップ:古いものを新しいものに変えていく
リファクタリングQ&A
リファクタリングは万能薬か
リファクタリングを学ぶ価値はあるか
動いているコードに手を入れていいのか
どこまでが「外部」なのか
初期設計をしっかりするほうが有効ではないか
適切なリファクタリングを見つけるには
全部覚える必要はあるか
エクストリーム・プログラミングと関係があるか
デザインパターンと関係あるか
いまの職場でリファクタリングは難しい
練習問題
練習問題の解答
第1章 <シンボリック定数によるマジックナンバーの置き換え>-ソースに100と書いてあったら
この章で学ぶこと
リファクタリング
<シンボリック定数によるマジックナンバーの置き換え>
サンプルプログラム
リファクタリング前
リファクタリング実行
リファクタリング後
あなたの考えを広げるためのヒント
タイプコードをクラスで置き換える
enum
シンボリック定数にしないほうがよい場合
バイトコードに埋め込まれる定数に注意
この章で学んだこと
練習問題
練習問題の解答
第2章 <制御フラグの削除>-制御フラグでコードが読みにくいなら
この章で学ぶこと
リファクタリング
<制御フラグの削除>
サンプルプログラム(FindInt)
リファクタリング前
リファクタリング実行(breakを使う場合)
リファクタリング実行(returnを使う場合)
サンプルプログラム(SimpleDtabase)
リファクタリング前
リファクタリング実行
あなたの考えを広げるためのヒント
breakやreturnで可読性が高くなる理由
インスタンスフィールドになった制御フラグの危険性
フラグの名前
boolean以外のフラグ
正規表現パッケージを使ってみると
この章で学んだこと
練習問題
練習問題の解答
第3章 <アサーションの導入>-「これが成り立つはず」というコメントがあったら「
この章で学ぶこと
リファクタリング
<アサーションの導入>
サンプルプログラム
リファクタリング前
リファクタリング実行
リファクタリング後
コンパイルと実行
アサーションの動作確認
あなたの考えを広げるためのヒント
Javaのアサーション記法
アサーションはエラー処理の代わりには使えない
Javaのアサーションはクラスライブラリではない
アサーションの完全削除
他の言語環境でのアサーション
この章で学んだこと
練習問題
練習問題の解答
第4章 <ヌルオブジェクトの導入>-nullチェックが多すぎるなら
この章で学ぶこと
リファクタリング
<ヌルオブジェクトの導入>
サンプルプログラム
リファクタリング前
リファクタリング実行
リファクタリング後
あなたの考えを広げるためのヒント
Factory Methodパターン
Singltonパターン
ヌルオブジェクトとしてネストしたクラスを使う
nullチェックは悪なのか
パターン魔にならないように
定数としてのヌルオブジェクト
isNullメソッドは必要なのか
元になるクラスを修正できないときはどうするか
この章で学んだこと
練習問題
練習問題の解答
第5章 <メソッドの抽出>-コードが長すぎて読みにくいなら
この章で学ぶこと
リファクタリング
<メソッドの抽出>
サンプルプログラム
リファクタリング前
リファクタリング実行
リファクタリング後
あなたの考えを広げるためのヒント
逆のリファクタリング
<メソッドの抽出>は当たり前?
メソッドは長くなっていくもの
この章で学んだこと
練習問題
練習問題の解答
第6章 <クラスの抽出>-クラスの責任が多すぎるなら
この章で学ぶこと
リファクタリング
<クラスの抽出>
サンプルプログラム
リファクタリング前
リファクタリング実行
リファクタリング後
あなたの考えを広げるためのヒント
双方向リンクは避ける
機能追加とリファクタリング
Immutable Interface
逆のリファクタリング<クラスのインライン化>
この章で学んだこと
練習問題
練習問題の解答
第7章 <クラスによるタイプコードの置き換え>-オブジェクトの識別にintが使われていたら
この章で学ぶこと
リファクタリング
<クラスによるタイプコードの置き換え>
サンプルプログラム
リファクタリング前
基本型を使ったタイプコードの問題点
リファクタリング実行
リファクタリング後
あなたの考えを広げるためのヒント
基本型を使ったタイプコードの問題点
enum
この章で学んだこと
練習問題
練習問題の解答
第8章 <サブクラスによるタイプコードの置き換え>-タイプコードごとに振る舞いが違うなら(1)
この章で学ぶこと
リファクタリング
<サブクラスによるタイプコードの置き換え>
「構造」と「振る舞い」
サンプルプログラム
リファクタリング前
リファクタリング実行
リファクタリング後
あなたの考えを広げるためのヒント
switch文とinstanceof演算子は不吉な匂いを放つ
オブジェクト生成のswitch分の削除
Factory Methodを複数個用意する
どこまでリファクタリングすべきか
この章で学んだこと
練習問題
練習問題の解答
第9章 <State/Strategyによるタイプコードの置き換え>-タイプコードごとに振る舞いが違うなら(2)
この章で学ぶこと
リファクタリング
<State/Strategyによるタイプコードの置き換え>
サンプルプログラム
リファクタリング前
リファクタリング実行
リファクタリング後
コードのさらなる修正
enumを使う
状態依存のコードを状態オブジェクトに移動する
さらに整える
あなたの考えを広げるためのヒント
タイプコードを置き換える3つの方法の比較
[Stateパターン]と[Strategyパターン]の違い
多態的な解決とdefaultの消失
この章で学んだこと
練習問題
練習問題の解答
第10章 <例外によるエラーコードの置き換え>-エラー処理が散らばっているなら
この章で学ぶこと
リファクタリング
<例外によるエラーコードの置き換え>
サンプルプログラム
リファクタリング前
リファクタリング実行
リファクタリング後
コードのさらなる修正
<State/Strategyによるタイプコードの置き換え>
あなたの考えを広げるためのヒント
チェックされる例外とチェックされない例外
例外の階層
java.io.EOFExceptionをめぐって
チェックされない例外と事前チェック用メソッド
エラーアトミック性
この章で学んだこと
練習問題
練習問題の解答
第11章 <Factory Methodによるコンストラクタの置き換え>-クラス名がnewでハードコードされていたら
この章で学ぶこと
リファクタリング
<Factory Methodによるコンストラクタの置き換え>
サンプルプログラム
リファクタリング前
リファクタリング実行
リファクタリング後
<サブクラスによるタイプコードの置き換え>
リファクタリング後
あなたの考えを広げるためのヒント
プロバイダ
引数の問題
Factory MethodとCrearion Method
第12章 <観察されるデータの複製>-モデルとビューが混在していたら
この章で学ぶこと
リファクタリング
<観察されるデータの複製>
サンプルプログラム
リファクタリング前
リファクタリング実行
リファクタリング後
あなたの考えを広げるためのヒント
イベントに含める情報
何をイベントリスナーにするか
無限ループに注意
別のイベントリスナーを追加する
この章で学んだこと
練習問題
練習問題の解答
第13章 <委譲による継承の置き換え>-IS-A関係じゃないのに継承してたら
この章で学ぶこと
継承と委譲
継承
委譲
継承と委譲の比較
リファクタリング
<委譲による継承の置き換え>
サンプルプログラム
リファクタリング前
生じる疑問
リファクタリング実行
リファクタリング後
<コンストラクタの連鎖>
あなたの考えを広げるためのヒント
継承は最後の武器
リスコフの置換原則
IS-A関係とHAS-A関係
この章で学んだこと
練習問題
練習問題の解答
第14章 <委譲の隠蔽>-委譲先まで見えてたら
この章で学ぶこと
リファクタリング
<委譲の隠蔽>
サンプルプログラム
リファクタリング前
1回目のリファクタリング実行
1回目のリファクタリング後
2回目のリファクタリング実行
2回目のリファクタリング後
あなたの考えを広げるためのヒント
「隠す」ことの重要性
さまざまな隠蔽
<仲介人の除去>
<クラスのインライン化>
この章で学んだこと
練習問題
練習問題の解答
第15章 <継承の分割>-継承がもつれていたら
この章で学ぶこと
リファクタリング
<継承の分割>
サンプルプログラム
リファクタリング前
生じる疑問
リファクタリング実行
リファクタリング後
あなたの考えを広げるためのヒント
直交性
継承と@Override
この章で学んだこと
練習問題
練習問題の解答
付録
A リファクタリング一覧
B JUnit
C 参考文献とWebサイト
索引