Есть ли способ написать это чисто?

Итак, у меня есть флаг для отключения и включения функции. и будет основан на переменной, которая должна переключать флаги

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, нам понадобится способ принимать несколько входных данных, которые должны быть включены, а остальные должны быть отключены.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
95
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ниже приведена модифицированная версия приведенного выше кода.

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

также, если у меня есть еще один flag_c, я мог бы получить входные данные для получения flag_A и flag_c, а затем отключить flag_b

tech spam 27.02.2024 08:21

@techspam Вы можете проверить измененную версию прямо сейчас. Имеет возможность легко добавлять новый флаг.

Vishal Zambre 27.02.2024 12:10

Если у вас большее количество кейсов, то ниже возможна модификация 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

Vishal Zambre 27.02.2024 12:12
Ответ принят как подходящий

Для этого вам не нужно условие 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 из ввода, я не смогу найти способ его оптимизировать

tech spam 27.02.2024 08:20

@techspam FLAGS.each { |f| toggle_flag(f, value) } с FLAGS = %w[flag_a flag_b flag_c]

Stefan 27.02.2024 08:37

теперь ты понимаешь смысл

tech spam 27.02.2024 09:07

Другие вопросы по теме