случае код Руби, когда не так сухо


Ниже код Руби, кажется, не так сухо. Можете вы пожалуйста помочь мне сократить код.

self.value = case self.type
when 'fast'
  Increment.first.max_hours * Incrementor.first.fast_completion_day
when 'super_fast'
  Increment.first.max_hours * Incrementor.first.super_fast_completion_day 
when 'ludicrous'
  Increment.first.max_hours * Incrementor.first.ludicrous_completion_day 
else
  Increment.first.max_hours * Incrementor.first.budget_completion_day 
end

Я думаю, что мы можем использовать здесь Руби metaprogamming для сокращения кода. Но я не очень хорошо с Ruby мета-программирования на данный момент.



292
2
задан 18 августа 2011 в 08:08 Источник Поделиться
Комментарии
1 ответ

Вы можете попробовать:

day = case self.type
when 'fast' then :fast_completion_day
when 'super_fast' then :super_fast_completion_day
when 'ludicrous' then :ludicrous_completion_day
else :budget_completion_day
end

self.value = Increment.first.max_hours * Incrementor.first.send(day)

От друга, который знает больше, чем мне:

prefix = %w[ fast super_fast ludicrous ].include?(self.type) ? self.type : "budget"
self.value = Increment.first.max_hours * Incrementor.first.send(:"#{prefix}_completion_day")

Это, наверное, примерно так же коротко и сухо, как вы можете сделать это. Что сказал, Я не уверен, что это более ясный/легко читать. Я бы, наверное, добавить метод Incrementor как Incrementor#completion_day_for(типа), которые могут заботиться об этой логики для вас.

3
ответ дан 18 августа 2011 в 09:08 Источник Поделиться