うまとま君の技術めも

2015年新卒入社した社畜の勉強内容などなど

アジャイル検定Lv.2 勉強メモ - リファクタリング

アジャイル検定Lv.2 出題範囲

リファクタリング

リファクタリング

コードの不吉な臭い

  • 奇妙な名前
    • メソッドやクラスの名前が奇妙な場合
      • 不適切な命名は理解するのが難しい
      • 適切な名前が思いつかない場合は、設計が良くない兆候
  • 重複したコード
    • 同じコードが複数箇所にある場合
      • 重複コードがあると、複数箇所に同じ修正を行う必要がある
      • 重複コードを1箇所にまとめる
  • 長すぎるメソッド
    • メソッド名が長い場合
      • 短いメソッド名の方が理解しやすい
      • 短く役割が明確なメソッドを書く
  • 長すぎるパラメータリスト
    • メソッドの引数が多い場合
      • パラメータが多いと、1つ1つが何を意味しているのか理解しづらくなる
      • 新たなデータが必要になった時にパラメータリストの変更が必要となる
  • グローバルデータ
  • 変更可能なデータ
    • クラス内部のデータを変更している場合
      • データを変更すると予期しないバグを生み出す
      • データを書き換えるのではなく、変更後の新しいデータを持ったオブジェクトを返す
  • 変更の偏り
    • 1つのクラスが異なる理由で何度も変更されるような場合
      • 異なる役割にも変更の影響が出てしまう
      • クラスの役割が多すぎるので、役割を明確にし変更理由が1つになるようにする
  • 変更の分散
    • 1つの理由で複数のクラスが変更されるような場合
      • 変更すべき箇所が分散すると、重要な変更を実装し忘れる場合が出てしまう
  • 機能の横恋慕
    • クラスのメソッドが、別クラスのデータやメソッドとばかり処理を行っている場合
      • 役割の所在が異なっているため、メソッドを別クラスに移動させる
  • データの群れ
    • 同じ様なデータのグループが、複数箇所で使われている場合
      • 同じ役割であるため、1つのクラスにデータをまとめる
  • 基本データ型への執着
    • 基本データ型ばかりを使っている場合
      • 基本データ型をクラスに置き換えることで保守性を上げる
  • 繰り返されるSwitch文
    • 同じ様なSwitch文が何度も出てくる場合
      • 分岐を追加した場合に、すべてのSwitch文を変更する必要がある
      • Switch文の代わりにポリモーフィズムを使う
  • ループ
  • 怠け者
    • 十分な仕事をせず、理解したり保守するコストに見合わない場合
      • 不要なクラスは削除する
  • 疑わしき一般化
    • 将来必要になるという理由で書いたが、実際には使われず無駄になっている場合
      • 無駄に複雑になっているため、よりシンプルな方に変更する
  • 一時的属性
    • 特定の状況でしか使われないインスタンス変数がある場合
      • コードを理解しづらくなる
      • 別のクラスに切り出す
  • メッセージの連鎖
    • 複数のクラスを経由するメソッドチェーンがある場合
      • チェーンの途中で呼び出されるクラスに強く依存してしまう
      • 委譲を利用してチェーンを隠蔽する
  • 仲介人
    • クラス内のメソッドのほとんどが委譲を行っている場合
      • 仲介人を除去して、委譲先のオブジェクトと直接処理を行う
  • インサイダー取引
    • クラス間で過度にデータの交換を行っている場合
      • クラス間の結合が強くなってしまう
      • クラス間で共通して使用するデータを持つクラスを用意する
  • 巨大なクラス
    • 1つのクラスで多くの処理を行っている場合
      • クラスに役割が多すぎる
      • インスタンス変数を整理したり、親クラスに処理をまとめたりする
  • クラスのインターフェース不一致
    • 置き換えたいクラスのインターフェースが異なっている場合
      • 他のクラスへ置き換え可能にするには、インターフェースが同じである必要がある
      • インターフェースが同じになるようにする
  • データクラス
    • 属性・getter・setterしか持たないクラスがある場合
      • 必要な処理が誤った場所に書かれている可能性が高い
      • データクラスを使用しているコードを、データクラス自身に持たせられないか検討する
  • 相続拒否
    • 子クラスが親クラスの一部しか利用していない場合
      • 継承階層が間違っている
      • メソッド・変数の階層を変更したり、継承を移譲に変えたりする
  • コメント
    • 詳細なコメントが書かれている場合
      • コードの分かりづらさを補うためにコメントが記述されている
      • コメントを書かなくても内容が分かるようにする

参考資料