条件文も長くなり始めると、私はいつも問題を抱えています。ただし、それらのいくつかを個別にラップすることは役立ちますmethods
。このルートは、少なくとも、テストでスタブ化できるいくつかのパブリック メソッドを提供します。
def age
return unless dob
Date.today - dob
end
def age_at_start
return unless valid_age_at_start(start_date, dob)
start_date - dob
end
def compensation
return unless valid_compensation(age_at_start, time_worked, salary, staff_rating)
some_calculation(time_worked, age_at_finish, salary, staff_rating)
end
def valid_age_at_start(start_date, dob)
start_date && dob
end
def valid_compensation(age_at_start, time_worked, salary, staff_rating)
age_at_start && time_worked && salary && staff_rating
end
または、引数を検証するだけのメソッドを作成できます。
def age
return unless dob
Date.today - dob
end
def age_at_start
return unless valid_arguments?(start_date, dob)
start_date - dob
end
def compensation
return unless valid_arguments?(age_at_start, time_worked, salary, staff_rating)
some_calculation(time_worked, age_at_finish, salary, staff_rating)
end
private
def valid_arguments?(*args)
args.each do |arg|
return false unless arg
end
return true
end
確かに、どちらのルートもまだ醜いです。