5

私はプロジェクトに取り組んでいます。現在、いくつかの入力パラメーターに基づいて変数に値を割り当てる、かなり大きな条件ステートメントがあります。だから、私はこのようなものを持っています。

if some condition
  x = some value
elsif another condition
  x = a different value
  ...

これをリファクタリングする最良の方法は何ですか?私は私が次のようなものになるかもしれないことを望んでいます

x = some value if some condition || another value if another condition

このようなことのパターンはありますか?

4

5 に答える 5

12

割り当てをifの外に置くだけです。

x = if some condition
  some value
elsif another condition
  a different value

または、ハッシュを使用することもできます。

x = dict[some condition]
于 2013-03-20T22:27:38.467 に答える
1

これはパターンではなく、演算子です。あなたが参照しているのは三項演算子です:

If Condition is true ? Then value X : Otherwise value Y

次に例を示します。

speed = 90
speed > 55 ? puts("I can't drive 55!") : puts("I'm a careful driver")

三元ステートメントの使用は短く、甘く、仕事をします。

于 2013-03-20T22:23:32.727 に答える
1
x = some condition ? some value : 
    another condition ? a different value : ...
于 2013-03-20T22:27:40.947 に答える
1

条件文も式であるため、変数が各条件で同じである場合に最初に実行できることの1つは、次のとおりです。

x = if cond1
  expr1
elsif cond2
  expr2
....
end

条件がすべて単一の式の状態である場合は、caseステートメントを使用して、これをさらにすっきりさせることができます。

ただし、次に最も明白なリファクタリングの演習は、大きな条件をメソッドに分離することです。これには、すべての条件と式を評価するために必要な最小限のデータを供給する必要があります。

例えば

# Where conditional is currently, and x assigned, assuming the conditionals
# need a couple of variables . . .
x = foo param1, param2

# Elsewhere
private

def foo p1, p2
  if cond1
    expr1
  elsif cond2
    expr2
  ....
  end
end
于 2013-03-20T22:30:37.460 に答える
0

コードの明確さと柔軟性のためにリファクタリングする場合は、条件付きをポリモーフィズムリファクタリングに置き換えることを検討してください。

質問には、推奨事項をさらに進めるのに十分な詳細がありませんが、このリファクタリングにより、コードベースの変更に対する耐性が大幅に高まります。新しい要件を受け取った場合、条件を解除して変更するのは悪い形式です(バグが発生しやすく、実行が困難です)。既存のコードベースにプラグインできる新しいオブジェクトを作成することをお勧めします。この柔軟性は、オープン/クローズド原則(SOLIDの頭字語の「O」)が説明するものです。

于 2016-04-04T15:48:17.510 に答える