1つずつリファクタリング技法まとめ
個人的に簡単かつ取り入れ易いと思うものから
目的
すぐ引き出せるようにする
基本作業サイクル
- システムを動かして仕様を精査
- テストメソッドを作成
- テストの失敗を確認
- テストの成功を確認
- 小さい変更、随時テスト実行(失敗確認->成功確認)
- 最後テスト実行
- 最後動作確認
メソッドの抽出(Extract Method)とは
コードの断片をメソッドにして、目的を説明するメソッド名にすること
ポイント
- メソッド名とメソッドの中身の意味的な距離が近い、小さなメソッドを心がける
- コメントは抽出できるメソッドを見分けるために使えることが多い
- コメント自体がメソッドの名前の候補になる
- 抽出したメソッドの中に抽出元のローカル変数や引数が入っていないか確認する
- 抽出したメソッドの中に一時変数が入っていないか、抽出元の変数の値を書き換えていないか確認する
- 一時変数が複数ある場合は「一時変数の分解」(Split Temporary Variable)を先に適用する
- 一時変数は「一時変数から問い合わせメソッドへ」(Replace Temp with Query)で削除もできる
例
- メソッド名とメソッドの中身の意味的な距離が近い、小さなメソッドを心がける
- コメントは抽出できるメソッドを見分けるために使えることが多い
- コメント自体がメソッドの名前の候補になる
def scraiping
# ログインする
driver.navigate.to('https://サイト')
driver.find_element(:id, 'id').send_keys('neko')
driver.find_element(:id, 'password').send_keys('inu')
driver.find_element(:css, 'li.loginBt > a').click
# ダウンロードする
driver.find_element(:css, 'input[value="ダウンロード(CSV)"]').click
# ログアウトする
driver.find_elements(:css, 'a').find { |element| element.text == 'ログアウト' }.click
end
↓
def scraiping
login
download
logout
end
def login
driver.navigate.to('https://サイト')
driver.find_element(:id, 'id').send_keys('neko')
driver.find_element(:id, 'password').send_keys('inu')
driver.find_element(:css, 'li.loginBt > a').click
end
def download
driver.find_element(:css, 'input[value="ダウンロード(CSV)"]').click
end
def logout
driver.find_elements(:css, 'a').find { |element| element.text == 'ログアウト' }.click
end
- 抽出したメソッドの中に抽出元のローカル変数や引数が入っていないか確認する
- 抽出したメソッドの中に一時変数が入っていないか、抽出元の変数の値を書き換えていないか確認する
def scraiping
# ログインする
url = 'https://サイト'
driver.navigate.to(url)
driver.find_element(:id, 'id').send_keys('neko')
driver.find_element(:id, 'password').send_keys('inu')
driver.find_element(:css, 'li.loginBt > a').click
download
logout
end
↓
def scraiping
url = 'https://ふつうのサイト'
# 単に抽出しない
login(url)
download
logout
end
def login(url)
# 仮に抽出元で後続で変数を使用していなければ引数なしで一時変数としておけば良い
# url = 'https://サイト'
driver.navigate.to(url)
driver.find_element(:id, 'id').send_keys('neko')
driver.find_element(:id, 'password').send_keys('inu')
driver.find_element(:css, 'li.loginBt > a').click
# 仮に抽出元で変数を書き換えたものを後続で使用する場合は引数を返す必要がある
# url = 'https://サイト/1' if (driver.find_element(:id, 'next'))
end
関連パターン
- 一時変数の分解(Split Temporary Variable)
- 一時変数から問い合わせメソッドへ(Replace Temp with Query)
- メソッドからメソッドオブジェクトへ(Replace Method with Method Object)
書籍情報
Jay Fields (著), Shane Harvie (著), Martin Fowler (著), Kent Beck (著),
長尾 高弘(訳), リファクタリング:Rubyエディション
https://amzn.to/2VlyWML
雑感
最もよく使うリファクタリング