2013-03-20 17 views
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 

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

+0

リファクタリング方法を説明する前に、なぜこれをリファクタリングする必要があるのか​​を教えてください。どのような問題を解決しようとしていますか? –

+2

'refactor = nilが存在しなければ?(:unit_tests)' – dbenhur

答えて

9

ifの外側に代入するだけです。

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

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

x = dict[some condition] 
0

パターンではなくオペレータです。ここで

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") 

三元の文を使用して甘い、短く、仕事をしていません。

+0

私の条件はif then elseより長くなります。 –

+0

それから私は 'if/elsif'ステートメントに固執します。それらを使うことに何も問題はありません。 – BlackHatSamurai

+0

'puts(速度> 55)? "私は55を運転することはできません!" : "私は慎重な運転手です" ' – ZiggidyCreative

0
x = some condition ? some value : 
    another condition ? a different value : ... 
+1

ネスティング?は良い習慣ではありません。 –

1

条件文は、変数は各条件で同じであれば、そう、また、あなたが行うことができます最初のものの一つの式では、次のとおりです。

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

条件の場合単一の式のすべての状態です。ケースステートメントを使用して、これをさらに細かくすることができます。

しかし、次の最も明白な再考の練習は、すべての条件と式を評価するのに必要な最小限のデータを入力する方法に大きな条件付きを分離することです。

など。

# 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 
0

あなたは、コードの明快さと柔軟性をリファクタリングしたい場合は、replacing conditional with polymorphismリファクタリングを検討します。

あなたの質問には詳細はあまりお勧めできませんが、このリファクタリングではコードベースの変更に対する抵抗が大きくなります。新しい要件を受け取った場合、条件付きで開いて改ざんするのは悪いフォームです(バグを導入しやすくなります)。既存のコードベースにプラグインできる新しいオブジェクトを作成することをお勧めします。 Open/Closed Principle(SOLID略語の "O")が説明するこの柔軟性。

関連する問題