Итак, у меня есть флаг для отключения и включения функции. и будет основан на переменной, которая должна переключать флаги
flag_a
, flag_b
— это два моих флага функций, а переменная входная строка может быть none
, all
,flag_a
, flag_b
. В качестве входной строки мы могли бы дополнительно добавить больше флагов, таких как flag_c или flag_d и т. д.
def input
variable = stdin "value"
update_flag(value.upcase)
end
def update_flag(value)
case value
when "ALL"
toggle_flag(flag_a, true)
toogle_flag(flag_b, true)
when "FLAG_A"
toggle_flag(flag_a, true)
toogle_flag(flag_b, false)
when "FLAG_B"
toggle_flag(flag_a, false)
toogle_flag(flag_b, true)
when "NONE"
toggle_flag(flag_a, flase)
toogle_flag(flag_b, false)
end
def toggle_flag(name, flag)
if flag
Featureflag.user(@id).enable(name.to_sym)
else
Featureflag.user(@id).disable(name.to_sym)
end
end
мне нужен способ отправлять значения переменным, этот ввод отправляется только через консоль в качестве ввода.
попытка сделать его сухим, а также придать ему оптимизм, и это должно быть легко для гибких методов обратите внимание: «Ввод отправляется только через консоль в качестве ввода» также, если мы добавим flag_C, нам понадобится способ принимать несколько входных данных, которые должны быть включены, а остальные должны быть отключены.
Ниже приведена модифицированная версия приведенного выше кода.
def input
value = prompt_input("Enter value:").upcase
update_flags(value)
end
def update_flags(value)
case value
when "BOTH"
toggle_flags(:enable)
when "FLAG_A"
toggle_flags(:enable, :flag_a)
when "FLAG_B"
toggle_flags(:enable, :flag_b)
when "NONE"
toggle_flags(:disable)
else
puts "Invalid value: #{value}"
end
end
def toggle_flags(action, *flags)
flags = [:flag_a, :flag_b] if flags.empty? # Default flags to both if none specified
flags.each { |flag| toggle_flag(action, flag) }
end
def toggle_flag(action, flag)
Featureflag.user(@id).send(action, flag)
end
def prompt_input(message)
print message + ' '
gets.chomp
end
В случае более крупных операторов случая
FLAGS_MAPPING = {
"BOTH" => [:enable, [:flag_a, :flag_b]],
"FLAG_A" => [:enable, [:flag_a]],
"FLAG_B" => [:enable, [:flag_b]],
"NONE" => [:disable, [:flag_a, :flag_b]]
}
def input
value = prompt_input("Enter value:").upcase
update_flags(value)
end
def update_flags(value)
action, flags = FLAGS_MAPPING[value] || [:invalid, nil]
if action == :invalid
puts "Invalid value: #{value}"
else
toggle_flags(action, *flags)
end
end
def toggle_flags(action, *flags)
flags.each { |flag| toggle_flag(action, flag) }
end
def toggle_flag(action, flag)
Featureflag.user(@id).send(action, flag)
end
def prompt_input(message)
print message + ' '
gets.chomp
end
@techspam Вы можете проверить измененную версию прямо сейчас. Имеет возможность легко добавлять новый флаг.
Если у вас большее количество кейсов, то ниже возможна модификация FLAGS_MAPPING = { "BOTH" => [:enable, [:flag_a, :flag_b]], "FLAG_A" => [:enable, [:flag_a]], "FLAG_B" => [:enable, [:flag_b]], "NONE" => [:disable, [:flag_a, :flag_b]] } def update_flags(value) action, flags = FLAGS_MAPPING[value] || [:invalid, nil] if action == :invalid puts "Invalid value: #{value}" else toggle_flags(action, *flags) end end
Для этого вам не нужно условие if, вы можете просто использовать имя флага, чтобы проверить, нужно ли включить или отключить функцию, например
def input
variable = stdin "value"
update_flag(value.upcase)
end
def update_flag(value)
toggle_flag("flag_a", value)
toggle_flag("flag_b", value)
end
def enable_feature?(name, flag)
return true if flag == "BOTH"
return false if flag == "NONE"
flag.downcase == name
end
def toggle_flag(name, flag)
if enable_feature?(name, flag)
Featureflag.user(@id).enable(name.to_sym)
else
Featureflag.user(@id).disable(name.to_sym)
end
end
ОБНОВЛЯТЬ:
Согласно предложениям:
В случае более крупных операторов случая
FLAGS = [
"flag_a",
"flag_b",
"flag_c",
]
def input
value = prompt_input("Enter value:").upcase
update_flags(value)
end
def update_flag(value)
FLAGS.each do { |flag_name| toggle_flag(flag_name, value) }
end
def enable_feature?(name, flag)
return true if flag == "BOTH" || flag == "ALL"
return false if flag == "NONE"
flag.downcase == name
end
def toggle_flag(name, flag)
if enable_feature?(name, flag)
Featureflag.user(@id).enable(name.to_sym)
else
Featureflag.user(@id).disable(name.to_sym)
end
end
но если у меня есть flag_c, и если мне нужно включить flag_a и flag_b из ввода, я не смогу найти способ его оптимизировать
@techspam FLAGS.each { |f| toggle_flag(f, value) }
с FLAGS = %w[flag_a flag_b flag_c]
теперь ты понимаешь смысл
также, если у меня есть еще один flag_c, я мог бы получить входные данные для получения flag_A и flag_c, а затем отключить flag_b