Rails - IF блок со сложными операторами, как оптимизировать без снижения читабельности? - PullRequest
1 голос
/ 05 марта 2011

в ruby ​​/ rails3, мне нужно выполнить тяжелый анализ текста, чтобы найти определенную строку.Прямо сейчас я делаю что-то вроде следующего:

extract_type1 = body.scan(/(stuff)/m).size
extract_type2 = body.scan(/(stuff)/m).size
extract_type3 = body.scan(/(stuff)/m).size
extract_type4 = body.scan(/(stuff)/m).size
extract_type5 = body.scan(/(stuff)/m).size

if extract_type1 > 0
elsif  extract_type2 > 0
elsif  extract_type3 > 0
elsif  extract_type4 > 0
elsif  extract_type5 > 0

Проблема здесь в том, что мне все еще нужно добавлять типы экстрактов на основе приложения.И это приводит к большой обработке, когда возникает случай, когда extract_type1> 0, а остальные не нужны.

Но в то же время приятно и чисто отделить логику извлечения от блока ifтак как это было бы беспорядочно и трудно читать.

Есть какие-нибудь мысли о том, как оптимизировать это, не ухудшая читаемость?

Спасибо

Ответы [ 2 ]

2 голосов
/ 05 марта 2011

как насчет хранения всех ваших "ключевых слов", которые вы ищете, в массиве и итерации по ним, например:

stuff   = ["stuff1", "stuff2"]

stuff.each do |c_stuff|
  if body.scan(/(#{Regexp.escape(c_stuff)})/m).size > 0
    # do something
    # break the loop
    break
  end
end    

Редактировать: если вам нужен индекс элемента, вы можете использовать each_with_index do |c_stuff, c_index|

0 голосов
/ 05 марта 2011

Ленивая оценка может работать на вас;просто преобразуйте переменные extract_X в лямбды, чтобы значения вычислялись при использовании:

extract_type1 = lambda { body.scan(/(stuff)/m).size }
extract_type2 = lambda { body.scan(/(stuff)/m).size }
extract_type3 = lambda { body.scan(/(stuff)/m).size }
extract_type4 = lambda { body.scan(/(stuff)/m).size }
extract_type5 = lambda { body.scan(/(stuff)/m).size }

if extract_type1.call > 0
elsif  extract_type2.call > 0
elsif  extract_type3.call > 0
elsif  extract_type4.call > 0
elsif  extract_type5.call > 0

Если вы используете значения extract_X более одного раза, вы можете добавить памятку в лямбды, чтобызначения вычисляются при первом доступе, а затем кэшируются, чтобы при последующих обращениях использовалось только то значение, которое уже было вычислено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...