リファクタリング

リファクタリングの定義

既存のソフトウェアについて外部から見たときの振る舞い(動き方)を 保ちつつ、理解や修正が簡単になるようにソフトウェアの内部構造を 変化させること

コードのにおい  (ソースコードに深刻な問題が存在することを示す何らかの兆候)

以下のような項目をコードのにおいとして、リファクタリングの候補とします。

  • 重複したコード 同じようなコードが複数箇所に存在する

  • 長すぎるメソッド 1つのメソッド内の処理が長く、処理内容が多すぎる

  • 巨大なクラス 1つのクラスが複数の責務を持っている

  • 多すぎる引数 引数の数が多すぎてひとつひとつの意味が理解しづらい

  • 変更の発散 1つのクラスを変更する理由が複数ある

  • 変更の分散 1つの変更によって複数のクラスを変更しなければならない

  • スイッチ文 同じような分岐処理があちこちにある

  • 疑わしき一般化 役に立たない抽象クラス、委譲、メソッドなどがある

  • 相続拒否 サブクラスが継承した機能を使っていない

  • コメント コードのにおいの消臭剤に使われることがある

コードのにおいに対しての対応方法

  • 重複したコード :メソッドの抽出、クラスの抽出、メソッドの引き上げ、Template Methodの形成

  • 長すぎるメソッド :メソッドの抽出、問い合わせによる一時変数の置き換え、 メソッドオブジェクトによるメソッドの置き換え、条件記述の分解

  • 巨大なクラス ク:ラスの抽出、サブクラスの抽出、インタフェースの抽出

  • 多すぎる引数 メ:ソッドによる引数の置き換え、引数オブジェクトの導入、 オ ジェクトそのものの受け渡し

  • 変更の発散 ク:ラスの抽出

  • 変更の分散 メ:ソッドの移動、フィールドの移動、クラスのインライン化

  • スイッチ文 :ポリモーフィズムによる条件記述の置き換え、 サブクラスによるタイプコードの置き換え

  • 疑わしき一般化 :階層の平坦化、クラスのインライン化、引数の削除、メソッド名の変更

  • 相続拒否 委譲による継承の置き換え

  • コメント メソッドの抽出、表明の導入

リファクタリングの基本

事前にテストを作成しておくこと。テストの作成により、リファクタリングの前後で、機能に変更がないかを核にできます。