我们在这里有一段代码来确定基于一些布尔标志的赋值类别。作者把它描绘成一张桌子,但结果却让其他人感到不安。但是,我们都不知道如何使这个代码更加优雅,同时仍然看起来相当有条理。
有什么建议吗?我们想摆脱这种怪异。
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" : []
答案 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可选&&取
如果参数数量最多,则首先列出