基于布尔标志的分类气味?如何清理?

时间:2017-04-22 11:42:24

标签: ruby-on-rails ruby categorization

我们在这里有一段代码来确定基于一些布尔标志的赋值类别。作者把它描绘成一张桌子,但结果却让其他人感到不安。但是,我们都不知道如何使这个代码更加优雅,同时仍然看起来相当有条理。

有什么建议吗?我们想摆脱这种怪异。

category =

!optional && !taken && !active                          ? "obligatory overdue"  :
!optional && !taken &&  active                          ? "obligatory fresh"   :
!optional &&  taken &&  active && !cooldown && !locked  ? "obligatory taken"  :
 optional && !taken                                     ? "optional fresh"   :
 optional &&  taken            && !cooldown             ? "optional taken"  :
!optional &&  taken && !active && !cooldown             ? "optional taken" :
!optional &&  taken &&  active &&  cooldown && !locked  ? "cooldown"      :
 optional &&  taken            &&  cooldown             ? "cooldown"     :
!optional &&  taken && !active &&  cooldown             ? "cooldown"    :
!optional &&  taken &&  active              &&  locked  ? "locked"     :  []

2 个答案:

答案 0 :(得分:0)

您可以在常量中定义类别的“表”,并在其中保留标志逻辑,例如:

CATEGORIES = {
  "obligatory overdue" => [
    { optional: false, taken: false, active: false, cooldown: nil, locked: nil }
  ],
  "obligatory fresh" => [
    { optional: false, taken: false, active: true, cooldown: nil, locked: nil }
  ],
  "obligatory taken" => [
    { optional: false, taken: true, active: true, cooldown: false, locked: false }
  ],
  "optional fresh" => [
    { optional: true, taken: false, active: nil, cooldown: nil, locked: nil }
  ],
  "optional taken" => [
    { optional: true, taken: true, active: nil, cooldown: false, locked: nil },
    { optional: false, taken: true, active: false, cooldown: false, locked: nil }
  ],
  "cooldown" => [
    { optional: false, taken: true, active: true, cooldown: true, locked: false },
    { optional: true, taken: true, active: nil, cooldown: true, locked: nil },
    { optional: false, taken: true, active: false, cooldown: true, locked: nil }
  ],
  "locked" => [
    { optional: false, taken: true, active: true, cooldown: nil, locked: true }
  ],
}

然后创建一种方法,在CATEGORIES中搜索正确的类别:

def set_category(flags)
  CATEGORIES.find { |k, v| v.include?(flags) }&.[](0)
end

最后,不要将标志设置为多个变量,而是将它们设置为Hash,如下所示:

flags = {
  optional: false,
  taken: false,
  active: true,
  cooldown: nil,
  locked: nil
}

现在,您可以通过set_category作为参数调用flags来设置正确的类别:

category = set_category(flags)
#=> "obligatory fresh"

我认为对于要设置的特定类别,标记需要true / false不太明显,需要更多代码,但如果您不喜欢目前的方法。

答案 1 :(得分:-2)

Category = category_helper(可选,已拍摄,有效,冷却,锁定) Category_helper 如果!可选&&采取&&活跃的&& !冷却&& !锁定   'Obligatoeytaken' Elsif ...... Elsif可选&&取

如果参数数量最多,则首先列出