Java言語で学ぶリファクタリング入門


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サイト

索引