我们这里有一段代码可以根据一些布尔标志来确定赋值的类别作者把它摆成一张桌子的样子,但最后大家都觉得它很刺耳。然而,我们谁也不知道如何使这段代码更优雅,同时看起来仍然相当有条理。
有什么建议吗?我们想除掉这个怪物。

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"     :  []

最佳答案

您可以在一个常量中定义类别的“表”,并将标志逻辑保持在该表中,例如:

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什么标志不太明显,需要更多的代码,但如果您不喜欢当前的方法,这是一种替代方法。

10-01 07:15
查看更多