第22章 モンスターメソッドを変更する必要がありますが、テストを書くことができません
スプラウトメソッドやスプラウトクラスで、長い間リファクタリングを避けることができるが、リファクタリングせざるを得ないのは事実
モンスターメソッドは何百行・何千行となり、インデントもバラバラで、解読するのはほぼ不可能
モンスターメソッドの変種
- 箇条書きメソッド
- ほとんどインデントされていないメソッド
- セクションの切れ目も当てにならない
- 学生の宿題で書いているようなイメージかな?
- 錯乱メソッド
- インデントされた一つの大きなセクションから構成されるメソッド
殆どは、純粋な箇条書きメソッドや錯乱メソッドではなく、その中間に位置している
リファクタリングツールを使って、リファクタリングする場合
テストが無いときは、ツールだけを利用する
その後、テストを整備して手作業でリファクタリングをする
手作業でリファクタリングをする場合
- 検出用変数の導入
- 変数を追加して、リファクタリング対象の状態を検出できる場合がある
- 必要なリファクタリングが終わったあとに変数を取り除くと、きれいな状態戻せる
- 理解している部分の抽出
- まずは小さくわかりやすい箇所から抽出していく
- 依存関係の落ち穂拾い
- まず、変えてはならないロジックを確認するためのテストを書く
- その後、テスト対象になっていない部分を抽出する
- そうして、重要な振る舞いが変わっていないことを確信する
- まず、変えてはならないロジックを確認するためのテストを書く
- メソッドオブジェクトの取り出し
- ????
モンスターメソッドの解体の際に、構造上のトレードオフを判断するための指針
- 条件文をコードの中から、メソッドとして抽出する場合
- 条件部分と処理部分を別々に抽出する
- 骨組みメソッド
- 残るのが制御構造と、他のメソッドの委譲だけになる
- 骨組みメソッド
- 一緒に抽出する
- 処理シーケンスの発見
- 共通の処理シーケンスを特定しやすくなる
- 処理シーケンスの発見
- 筆者は、箇条書きメソッドには処理シーケンスの発見、錯乱メソッドには骨組みメソッドを検討する
- 条件部分と処理部分を別々に抽出する
- クラス内で抽出
- 同じ名前をつけそうになったら、メソッドの抽出をする
- 小さい部分の抽出
- 小さい部分を抽出する
感想
検出用変数の導入は、binding.pry
の操作に該当するのかな?
リファクタリングは、本当に隗より始めよの精神だな