Techioz Blog

これをきれいに書く方法はありますか?

概要

したがって、機能を無効または有効にするフラグがあります。そして、必要な変数に基づいてフラグを切り替えます

flag_a、flag_b は私の 2 つの機能フラグで、変数入力文字列は 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 を追加する場合は、複数の入力を取得する方法が必要になります。これらの入力は有効にする必要があり、REST は無効にする必要があります。

解決策

これには when 条件は必要ありません。次のように、フラグ名を使用して、機能を有効にする必要があるか無効にする必要があるかを確認するだけです。

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

アップデート:

提案によると:

より大きな case ステートメントの場合

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