メソッドの抽出
こちらの本を参考に。 この本は最高すぎる。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