RubyGem для перечисления


Сначала немного общей информации. Я работаю на довольно большие Rails-приложение, которое быстро превратилось в питательную почву для "вонючих" код. Одна причина мы использовали много было хранить объекты в таблице подстановки СТИ и имеющие множество разбросанных логика, основываясь на имени объекта.

Вот тупеть пример того, что мы имели:

class Lookup < ActiveRecord::Base
end

class AlarmStatus < Lookup
  has_many :alarm_logs
end

class AlarmLog < ActiveRecord::Base
  belongs_to :alarm_status
end

Тогда во всем нашем приложении мы хотели сделать что-то вроде:

case @alarm_log.alarm_status.name
when "active"
  # Do something
when "verified"
  # Do something
when "inactive"
  # Do something
end

Это, очевидно, плохо по многим причинам, но давайте просто скажем, это было везде. Через несколько месяцев этого, консультант пришел и указал на наши "код запах" и сделал некоторые предложения о том, как рефакторинг, который включал Руби реализация в Java, перечислимый класс.

Мы в конечном итоге использовала это часто в наше приложение, и добыли в рубиновый камень под названием classy_enum. Предпосылкой classy_enum заключается в том, что вы получаете власть ООП смешанное со строгостью перечислимого типа, которая является в значительной степени то, что мы пытались имитировать с нашей ГНИ модели поиска.

Пример определения перечислимого:

class Priority < ClassyEnum::Base
  enum_classes :low, :medium, :high

  def send_email?
    false
  end
end

class PriorityHigh < Priority
  def send_email?
    true
  end
end

Камень в ридми есть некоторые другие примеры, в том числе, как интегрировать его с рельсов проекта.

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

  • Это общая проблема?
  • Наше решение имеет смысл? Есть ли лучший способ сделать это?
  • Документация ясно?
  • Вы бы использовать его в своем приложении? Почему или почему нет?
  • Как мы могли бы улучшить его?
  • Как качество кода?


325
8
задан 1 февраля 2011 в 02:02 Источник Поделиться
Комментарии
1 ответ

Да, это общая проблема.

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

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

Единственное, что я думаю на данный момент, что я, возможно, захотите, чтобы улучшить его было бы иметь опцию, чтобы создать обратную ссылку на объект-владелец в случаях, когда двойной диспетчеризации позволит в дальнейшем снять условную логику. (или, например, где у меня был набор сигналов, которые каждому хотелось бы на какой-то процент от владения объектами громкости)

3
ответ дан 5 февраля 2011 в 11:02 Источник Поделиться