Рефактор выписки из кейса, базовый рубин - PullRequest
0 голосов
/ 15 марта 2012

У меня есть метод, который берет условие и элемент из массива условий и массива элементов, где любое количество условий проверяется по любому количеству элементов.Условия и элементы являются хешами. В основном, для условия и элемента, переданных методу, выясните, с каким атрибутом элемента должно проверяться условие.Список на самом деле длиннее, и, глядя на то, как сделать это лучше (кажется, что это может быть более кратким и, возможно, более рубиновым), больше ничего не сработало (пока), поэтому я хотел бы получить некоторую информацию о том, как вы могли бы реорганизовать это:

  def check_condition(condition, item)
    case condition.attribute
    when :author
      i = item.author.name;
    when :title
      i = item.title
    when :body
      i = item.body
    when :domain
      i = URI(item.url).host
    when :account_age
      i = item.author.author_age
    end
    @logger.info "#{i} to be checked if #{condition.query} #{condition.attribute}"
    test_condition(condition, item, i)
  end

РЕДАКТИРОВАТЬ:

Просто, чтобы прояснить, элементы и условия - это хэши (Hashie :: Mash, если быть точным), где условия в основном создаются из файла конфигурации, который может быть чем-то вроде:

[submitted_link, account_age, is_less_than, 30, remove]

, что заканчивается примерно так:

{subject: submitted_link, attribute: account_age, query: is_less_than, what: 30 action:remove}

И вы можете увидеть, что здесь происходит в целом, если вы так склонны: https://github.com/blueblank/reddit_modbot/blob/master/lib/modbot/modbot_check.rb

РЕДАКТИРОВАТЬ 2:

Реальность решения состояла в том, чтобы несколько упорядочить мою переменную терминологию для условия и предмета, чтобы ее можно было уменьшить до 1 строки

 i = item.send(condition.attribute)

без беспорядка, минимальное влияние

1 Ответ

2 голосов
/ 15 марта 2012

Одна альтернатива может включать определение check_condition в качестве метода item.class. Так что вместо ...

x = check_condition(c, item)

... у вас может быть что-то вроде ...

x = item.condition(c)

Тогда , если вам не нравится большой регистр, вы можете создать хеш со значениями, которые являются объектами proc, с ключами :author, :title, и т. Д.

class A
  def initialize
    @h = { :a => proc { @author } }
  end
  def set x
    @author = x
  end
  def f x
    @h[x].call
  end
end

o = A.new
o.set 'Me'
p(o.f(:a))

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

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