1

Ruby でこれを言うよりエレガントな方法があるかどうか疑問に思っています。

FREE_PLAN_MAXIMUM = 1
BASIC_PLAN_MAXIMUM = 10
PREMIUM_PLAN_MAXIMUM = 100

def maximum_entries_per_month
  case plan
  when "premium"
    PREMIUM_PLAN_MAXIMUM
  when "basic"
    BASIC_PLAN_MAXIMUM
  else
    FREE_PLAN_MAXIMUM
  end 
end

premium関数内でのandの繰り返しは好きではありませんbasic。代替案は何ですか?

4

4 に答える 4

3

Hash#fetchcase ステートメントの代わりに、デフォルト値を許可する を使用します。

PLAN_MAXIMUMS = { free: 1, basic: 10, premium: 100 }

def maximum_entries_per_month
  PLAN_MAXIMUMS.fetch(plan.to_sym, PLAN_MAXIMUMS[:free])
end
于 2013-11-14T16:45:53.300 に答える
3

それは、コードの残りの部分、特にこれらの定数を他の場所で使用しているかどうかによって異なります。ただし、この種のものに適していると私が見つけたパターンの 1 つは、ハッシュです。

PLAN_MAXIMUMS = { free: 1, basic: 10, premium: 100 }

def maximum_entries_per_month
  PLAN_MAXIMUMS[plan.to_sym] || PLAN_MAXIMUMS[:free]
end 
于 2013-11-14T16:38:40.787 に答える
1

メソッドは必要ありません。ハッシュを持っているだけです:

maximum_entries_per_month = Hash.new(1).merge{"premium" => 100, "basic" => 10}

そして呼び出します:

maximum_entries_per_month[plan]
于 2013-11-14T17:10:38.647 に答える
0

どうですか:

FREE_PLAN_MAXIMUM = 1
BASIC_PLAN_MAXIMUM = 10
PREMIUM_PLAN_MAXIMUM = 100
PLANS = {'premium' => PREMIUM_PLAN_MAXIMUM, 'basic' => BASIC_PLAN_MAXIMUM, 'free' => FREE_PLAN_MAXIMUM}

def maximum_entries_per_month
  PLANS[plan] or FREE_PLAN_MAXIMUM
end

その「またはFREE_PLAN_MAXIMUM」は、「プレミアム」、「ベーシック」、または「無料」ではないプランをキャッチします。これらの3つのプランしかないことが確実な場合は、その部分を削除するだけです

編集:このようにして、他の定数を機能させ続けます

EDIT2:これ以上定数を追加したくない場合で、プランがそれらの1つであることが確実な場合は、次のことができます:

def maximum_entries_per_month
  self.class.const_get("#{plan.upcase}_PLAN_MAXIMUM")
end
于 2013-11-14T16:45:31.267 に答える