ステートメントの関数内への移動
動機
重複の除去は、健全なコードを導くための最もすぐれた経験則の1つ。特定の関数を呼び出すたびに同じコードが実行されていたら、反復コードを関数自体に組み込むことを検討する。
そうすることで、反復コードに将来変更が生じた場合でも、1箇所だけを修正すれば全ての呼び出し側で使えるようになる。将来、反復コードに差異が発生した場合は、「ステートメントの呼び出し側への移動」を行うことで、反復コード(またはその一部)を簡単に元の場所に移動できます。
ステートメントを関数に移動するのは、それを呼び出し先の関数の一部とみなすほうが理解しやすい場合です。呼び出し先の関数の一部としては意味をなさないものの、一緒に呼び出す必要がある場合は、そのステートメントと呼び出し先の関数を対象にして「関数の抽出」を行う。
手順
- 反復コードが移動先の関数呼び出しに隣接していない場合は、「ステートメントのスライド」を行って隣接させる。
- 移動元の関数の呼び出し元が関数だけだった場合は、移動元の関数からコードをカットし、移動先の関数にペーストして、テストを行い、残りの手順を無視する。
- 複数の呼び出し元がある場合は、いずれかの呼び出しに対して「関数の抽出」を行い、移動先の関数呼び出しと移動したいステートメントを抽出する。名前は一時的なものにするが、簡単に grep できる名前にする。
- 他のすべての呼び出しを変更して、新しい関数を使うようにする。変更のたびにテストする。
- 元の呼び出しの全てで新しい関数を使うようになったら、「関数のインライン化」を行って元の関数を新しい関数に完全にインライン化し、元の関数を削除。
- 「関数名の変更」を行って、新しい関数の名前を元の関数と同じ名前に変更する。