imaz
2015/12/07 11:24:32 投稿
3

"【Refactor Me】if else" をリファクタリング

テストは確認のためにつけました。

ポイント

  • 定数に年齢と時期の対応をまとめた
  • メソッド化してコンパクトにした
  • 後置ifで例外の発生条件を書いた
    • or raise を使うときは or の前に処理されるべきものが来てほしい
  • 例外のクラスを指定した
    • 挙動がかわっているが、例外をあげるという観点で同じと見てリファクタリングに含めた!

Before

0 <= age or raise

if 0 <= age && age <= 2
  'baby'
elsif 3 <= age && age <= 6
  'little child'
elsif 7 <= age && age <= 12
  'child'
elsif 13 <= age && age <= 18
  'youth'
else
  'adult'
end

After

require 'rspec'

class Age
  AGE_SPAN = {
    'baby'         => 0..2,
    'little child' => 3..6,
    'child'        => 7..12,
    'youth'        => 13..18,
    'adult'        => 19..Float::INFINITY
  }

  def self.span(age)
    raise ArgumentError if age < 0

    AGE_SPAN.find{|k, v| v.include? age }.first
  end
end

describe 'Age.span' do
  it 'age がマイナス値の場合、例外を発生させること' do
    expect{Age.span(-1)}.to raise_error ArgumentError
  end

  it do
    (0..2).each do |age|
      expect(Age.span(age)).to eq 'baby'
    end
  end

  it do
    (3..6).each do |age|
      expect(Age.span(age)).to eq 'little child'
    end
  end

  it do
    (7..12).each do |age|
      expect(Age.span(age)).to eq 'child'
    end
  end

  it do
    (13..18).each do |age|
      expect(Age.span(age)).to eq 'youth'
    end
  end

  it '19歳以上の場合、adult を返すこと' do
    expect(Age.span(19)).to eq 'adult'
    expect(Age.span(100)).to eq 'adult'
  end
end

みんなのコメント