LoginSignup
0
0

More than 3 years have passed since last update.

メソッドの抽出(Extract Method)

Last updated at Posted at 2019-05-09

image.png

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

雑感

最もよく使うリファクタリング

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0