0

私は基本的に、ほとんどのフィールドを事前に計算するフォームを作成しています。そのため、以前のメソッドに依存するメソッド、または nil を返すメソッドがたくさんあります。現在、一連のチェックを行っており、それらを削除したいと考えています。

(計算は無視してください。これらは単なる例です)

def age
  return unless dob  # Not so bad... 
  Date.today - dob
end

def age_at_start
  return unless dob && start_date  # Getting worse
  start_date - dob
end

def compensation
  return unless age_at_start && time_worked && salary && staff_rating  # Shoot me now
  some_calculation(age_at_start, time_worked, salary, staff_rating)
end
4

3 に答える 3

1

例は別として、実際に何をしているかに部分的に依存します-コンテキストがなければ、状況下で何が最も意味があるかを知ることは困難です.

以下よりもはるかに優れた機能はありません:

def age
  Date.today - dob if dob
end

これと同じです - 私はまだガード句を壊しません:

def age_at_start
  dob && start_date ? start_date - dob : nil
end

ここでは、(a) できること、および (b) IMO テストの方が簡単であるため、ガード句を分割します。

def compensation
  some_calculation if can_be_compensated?
end

def can_be_compensated?
  age_at_start && time_worked && salary && staff_rating
end

が実際に「外部」であり、引数が必要な場合some_calculationは、元の and のようにアクセスできるメソッドにラップする可能性がありますcan_be_compensated?

于 2012-06-05T01:29:09.847 に答える
0

条件文も長くなり始めると、私はいつも問題を抱えています。ただし、それらのいくつかを個別にラップすることは役立ちます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

確かに、どちらのルートもまだ醜いです。

于 2012-06-05T01:11:56.690 に答える
0
def age
  (Date.today - dob) if dob
end

def age_at_start
  (start_date - dob) if dob && start_date
end

def compensation
  some_calculation(time_worked, age_at_finish, salary, staff_rating) if age_at_start && time_worked && salary && staff_rating
end
于 2012-06-05T00:53:47.560 に答える