引数への代入の除去

ポイント

  • 引数への代入を安易に行うと、引数自体が変更されているのかどうかを気にする必要が出てくる

 →rubyの場合、値渡しなので引数自体は変更されない

プロダクトコード(ruby

before

class Order
  def discount(input_val, quantity, year_to_date)
    input_val -= 2 if input_val > 50
    input_val -= 1 if quantity > 100
    input_val -= 4 if year_to_date > 10000
    input_val
  end
end

after

class Order
  def discount(input_val, quantity, year_to_date)
    result = input_val
    result -= 2 if input_val > 50
    result -= 1 if quantity > 100
    result -= 4 if year_to_date > 10000
    result
  end
end

テストコード(rspec

before

describe Order do
  describe 'discount(input_val, quantity, year_to_date)' do
    let(:order){ Order.new }
    subject{ order.discount(input_val, quantity, year_to_date) }
    let(:input_val){ 51 }
    let(:quantity){ 100 }
    let(:year_to_date){ 10000 }
    it{ input_val.should == 51 } # 引数input_valは変更されない
    it{ should == 49 }
  end
end

after

describe Order do
  describe 'discount(input_val, quantity, year_to_date)' do
    let(:order){ Order.new }
    subject{ order.discount(input_val, quantity, year_to_date) }
    let(:input_val){ 51 }
    let(:quantity){ 100 }
    let(:year_to_date){ 10000 }
    it{ should == 49 }
  end
end

※ 参考資料
 リファクタリング:Rubyエディション6.8 引数への代入の除去(Remove Assignments to Parameters)(p.149〜153)