第8章 特性の移動

これまでのリファクタリングは、プログラム要素の変更・削除・名前の変更に関するもの
リファクタリングのもう一つの重要な役割は、要素をコンテキスト間で移動させること

関数の移動

優れたソフトウェア設計の核心はモジュール性
モジュール性を実現するために、関連するソフトウェア要素をグループにまとめて、それらの結びつきを簡単に特定して把握できるようにする必要がる
決まった方法があるわけではないので、都度要素を移動させる

関数を移動させる理由

手順

フィールドの移動

プログラミングにおいてデータ構造が重要
適切なデータ構造は、振る舞いを記述するコードが単純になる
データ構造が適切でないなら、すぐ移動させるべき

フィールドの移動は通常、より広範囲な変更の一部として行う
移動完了後、そのフィールドの利用プログラムの多くは異動先のオブジェクトの方が移動元より適切なアクセス先になる

手順

ステートメントの関数内への移動

特定の関数を呼び出すたびに、同じコードが実行されていたら、反復コードを関数自体に取り込むことを検討する
そうした結果、反復コード将来変更が生じた場合でも、一箇所だけ修正するだけで済む

手順

ステートメントの呼び出し側への移動

複数箇所で利用してた共通の振る舞いを、一部の呼び出しに対してだけ変更する必要が出てきた場合
まずステートメントのスライドを使って、関数から呼び出し側に移動する必要がある
その後、ステートメントの呼び出し側への移動を行う

手順

関数呼び出しによるインラインコードの置き換え

既存の関数と同じ処理をしているインラインコードがある場合、それを関数呼び出しに置き換える
ただし、たまたま類似している場合は例外(例の動画のUserクラスのイメージ)

手順

ステートメントのスライド

関係する処理が並んでいると、コードが理解しやすくなる
ステートメントのスライドはもっとも素朴な、コードを集める方法
関数の抽出など、別のリファクタリングの準備として行われる

手順

ループの分離

同じループの中で異なる処理をしていると、ループの修正の際には、複数の処理内容を理解をする必要がある
処理ごとにループを分離することで変更すべき処理だけを理解すれば良くなる

手順

パイプラインによるループの置き換え

ループより優れた仕組みとして、コレクションのパイプラインがある

手順

デッドコードの削除

コードが使用されなくなったら削除するべき
必要になったらVCSから掘り起こせば良い

手順

感想

同じコードを関数内に取り込むのって、こんな名前だったんか

パイプラインによるループの置き換えは、ループに比べて副作用が少なくて好き

コードが使用されなくなったら削除するべき
ほんこれ、どれが不要かどうかわからなくなる