메서드 추출(Extract Method)

3743 단어 리팩토링루비


하나씩 리팩토링 기술 요약
개인적으로 간단하고 도입하기 쉽다고 생각하는 것으로부터

목적



즉시 꺼낼 수 있도록

기본 작업 사이클


  • 시스템을 움직여 사양을 조사
  • 테스트 방법 만들기
  • 테스트 실패 확인
  • 테스트 성공 확인
  • 작은 변경, 수시 테스트 실행 (실패 확인 -> 성공 확인)
  • 마지막 테스트 실행
  • 마지막 동작 확인

  • 메소드 추출(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 Method with Method Object)

    책 정보



    Jay Fields (저자), Shane Harvie (저자), Martin Fowler (저자), Kent Beck (저자),
    나가오 타카히로 (역), 리팩토링 : Ruby 에디션
    htps : // 아 mz 응. 및 / 2VlyWML

    잡감



    가장 많이 사용하는 리팩토링
  • 좋은 웹페이지 즐겨찾기