第6章 リファクタリングはじめの一歩

関数の抽出

極めて頻繁に行うリファクタリング
コードの断片をみて、何をしているか理解した上で、独立した関数として抽出し、目的にふさわしい名前をつける

意図と実装の分離
何をしているか調べなければならないコードの断片があるとしたら、それに名前をつけて抽出するべき

手順

関数のインライン化

うまく分割できない関数があるときにする

手順

変数の抽出

式は複雑で読みにくくなることがある
その場合、ローカル関数を活用して式を分解することで扱いやすくできる
式の一部に名前をつけることができるので、わかりやすくもなる

コード内の式に名前をつけたい場合に有効
作業中の関数の中だけで意味のある名前なら、正しい選択

手順

変数のインライン化

変数がリファクタリングの邪魔になることもある
その場合、変数をインライン化するのが有効

手順

関数宣言の変更

もし間違った名前の関数を見つけたら、少しでも良い名前が分かり次第変える必要がある

手順

変数のカプセル化

広範囲で利用されるデータを移動したい場合に行う
副作用的に、データの変更や参照を監視できる

パプリックなフィールドを見つけた場合、カプセル化して可視性を下げる

手順

変数名の変更

良い名前をつけることは重要

手順

パラメータオブジェクトの導入

一纏まりのデータが関数から関数に渡されている場合、データを構造体に置き換える

手順

関数群のクラスへの集約

共通のデータに対してお互いに関わりの深い処理を行う一群の関数があれば、クラスを定義するべきかもしれない
引数が大幅に減ったりするなどのメリットが有る

手順

関数群の変換への集約

データ変換関数を利用して、元データを入力として全ての派生値を計算し、それらを出力のデータとしてフォールドとして設定する
派生値について調べたいときに、変換関数だけ見れば良い

わかりにくいのでサンプルソース

def foo(bar):
  hoge_bar = hoge(bar)
  fuga_bar = fuga(bar)
end

def foo(bar)
  bar.hoge = hoge(bar)
  bar.fuga = fuga(bar)
  return bar
end

手順

フェーズの分離

一つのコードが異なる2つの処理を行っている場合、別々のモジュールに分離するべき
この分離を綺麗にするために、振る舞いを順次的な二段階のフェーズに分ける

手順

変数のカプセル化を読んで、グローバル変数ってそんなに使うか?
普通にどこかのクラスのアクセサとかにまとめたほうが持ち運びしやすくなって良い気がする
でも以前の章で、データのためのクラスってやつになりそうだな…

作者はイギリス人なのに、紅茶党じゃない