未経験からエンジニア 奮闘記

未経験からエンジニアに自由に生きる途中

MENU

リファクタリング メソッドの抽出

メソッドの抽出

www.amazon.co.jp

こちらの本を参考に。 この本は最高すぎる。webエンジニア でやって行く上で、基本的な書き方の概念を理解できる

メソッドの抽出

# before

def print_owing(amount)
  print_banner
  puts "name: #{@name}" # この二行を抽出する
  puts "amount: #{amount}"
end


# after
def print_owing(amount)
  print_banner
  print_detail(amount)
end

def print_detail(amount)
  puts "name: #{@name}"  # ローカル変数と引数にはきおつける
  puts "amount: #{amount}"
end

## メモ

処理の塊に少しでも差分があるのなら分けるのかな?
  • ローカル変数がない場合
# before
def print_owing(amount)
  outstainding = 0.0

  # バナーを表示( print banner )
  puts "**************************"
  puts "***  Customer Owes   *****"
  puts "**************************"

  # 勘定を計算
  @orders.each do |order|
    outstainding += order.amount
  end

  # 詳細を表示 ( print details )
  puts "name: #{@name}"
  puts "amount: #{outstainding}"
end


# after
def print_owing(amount)
  outstainding = 0.0

  print_banner
  # 勘定を計算
  @orders.each do |order|
    outstainding += order.amount
  end

  # 詳細を表示 ( print details )
  puts "name: #{@name}"
  puts "amount: #{outstainding}"
end

def print_banner
  # バナーを表示( print banner )  # ローカル変数がないので、バグなどは発生しない
  puts "**************************"
  puts "***  Customer Owes   *****"
  puts "**************************"
end  
  • ローカル変数を使用する

詳細を表示するもきりだせるが、ローカル変数(@name)と 引数から渡ってきた一時変数(outstanding)が存在する

# before
def print_owing(amount)
  outstainding = 0.0

  print_banner
  # 勘定を計算
  @orders.each do |order|
    outstainding += order.amount
  end

  # 詳細を表示 ( print details )
  puts "name: #{@name}"
  puts "amount: #{outstainding}"
end

def print_banner
  # バナーを表示( print banner )
  puts "**************************"
  puts "***  Customer Owes   *****"
  puts "**************************"
end  

# after


def print_owing(amount)
  outstainding = 0.0

  print_banner
  # 勘定を計算
  @orders.each do |order|
    outstainding += order.amount
  end

  # 詳細を表示 ( print details )
  print_detail(outstainding)  # 引数で一時変数を渡す
end

def print_banner
  # バナーを表示( print banner )
  puts "**************************"
  puts "***  Customer Owes   *****"
  puts "**************************"
end

def print_detail(outstainding)
  puts "name: #{@name}"
  puts "amount: #{outstainding}"
end
  • ローカル変数の再代入
# before
def print_owing(amount)
  outstainding = 0.0

  print_banner
  # 勘定を計算
  @orders.each do |order|
    outstainding += order.amount
  end

  # 詳細を表示 ( print details )
  print_detail(outstainding)
end

...省略

# after パターン1 初期値が固定されている場合

def print_owing(amount)
  outstainding = 0.0

  print_banner
  # 勘定を計算

  outstainding = calc_outstanding # ローカル変数の再代入

  # 詳細を表示 ( print details )
  print_detail(outstainding)
end

...省略
def calc_outstanding)
  @orders.inject(0.0) {|result, order| result + order.amount} # ループはコレクションにする
end

# after 

def print_owing(amount)
  outstainding = 0.0

  print_banner
  # 勘定を計算

  outstainding = calc_outstanding # ローカル変数の再代入

  # 詳細を表示 ( print details )
  print_detail(outstainding)
end

...省略

def calc_outstanding)
  @orders.inject(0.0) {|result, order| result + order.amount} # ループはコレクションにする
end


## outstaindingが動的に変わる場合

def print_owing(amount)
  outstainding = amount * 1.2

  print_banner
  # 勘定を計算

  calc_outstanding = calc_outstanding(outstainding)

  # 詳細を表示 ( print details )
  print_detail(outstainding)
end
...省略
def calc_outstanding(initial_value)
  @orders.inject(initial_value) {|result, order| result + order.amount}
end