4

単純な条件と、場合によっては複雑な本体がある場合、条件の構成は簡単に記述できます。

if simple_condition_expressed_in_one_liner
  complicated_body_that_may_be_long
  complicated_body_that_may_be_long
  complicated_body_that_may_be_long
end

しかし、時々、あなたは複雑な状態で、次のような単純な体を持っています:

if condition1 and
condition2 and
condition3 and
some_more_complicated_condition_that_cannot_be_written_on_a_single_line and
still_some_more_complicated_condition_that_cannot_be_written_on_a_single_line
  simple_body
end

このような場合、何か良い書き方はありますか?

4

4 に答える 4

5

私は常に、より小さな記述的なメソッドにリファクタリングしようとしています。

次の代わりに、あなたの例を使用してください。

until (print "Username : "; gets.chomp == "user") and
      (print "Password : "; gets.chomp == "pa$$word")
  puts "Error, incorrect details"
end

私は使うだろう:

def correct_user
  print "Username : "
  gets.chomp == "user"
end

def correct_password
  print "Password : "
  gets.chomp == "pa$$word"
end

until correct_user and correct_password
  puts "Error, incorrect details"
end
于 2013-04-08T16:14:21.927 に答える
2

私は個人的に条件ステートメント全体を別のメソッドに入れました。これはすでに提案されていることとよく似ているように聞こえるかもしれませんが、私はそれを分割するのではなく、全体をメソッドに入れています。

simple_body if complicated_condition

def complicated_condition
  condition1 and
  condition2 and
  condition3 and
  some_more_complicated_condition_that_cannot_be_written_on_a_single_line and
  still_some_more_complicated_condition_that_cannot_be_written_on_a_single_line
end

条件が何であるか、およびそれらのメソッドを後で使用することになるかどうかに応じて、条件をより多くのメソッドに分割する場合と分割しない場合があります (1 つの目的だけに使用されるメソッドが多すぎると、コードの匂いがし始めます)。

これにより、コードが読みやすくなり (コードにざっと目を通し、コードが何を行っているかを確認できます)、保守が容易になります (必要に応じて条件を変更でき、それがどこにあるかを正確に把握できます)。

これをクラスに入れる場合private、「外部」がそれを使用する必要がある理由がないため、メソッドを下に置きます。

編集: 条件が条件で使用されるときに変数の値を必要とする場合は、おそらくbindingメソッドに渡すことを検討してください。

opt = :mysql
simple_body if complicated_condition(binding)

opt = :oracle
simple_body if complicated_condition(binding)

def complicated_condition(b)
  condition1 and
  condition2 and
  condition3 and
  some_more_complicated_condition_that_cannot_be_written_on_a_single_line and
  still_some_more_complicated_condition_that_cannot_be_written_on_a_single_line and
  eval('opt', b) == :mysql
end
于 2013-04-08T16:36:44.497 に答える
1

別々のメソッドに分割することを検討する必要があります。コードを読んでいるときに条件を頭の中でマッピングするのは困難です。

if(condition1 and condition2 and ...)

対:

if(isValidCondition())..
于 2013-04-08T15:52:19.970 に答える
0

complex_conditionメソッド呼び出しを行う場合、早期復帰が候補になる可能性があり

simple_body if complex_condition

def complex_condition
  condition1 or return # or return unless condition1 
  condition2 or return
  condition3 or return
  condition4 or return
  condition5
end

def condition4
  some_more_complicated_condition_that_cannot_be_written_on_a_single_line
end

def condition5
  still_some_more_complicated_condition_that_cannot_be_written_on_a_single_line
end

私はあなたの考えに本当に感謝しています、お気軽にコメントしてください!

于 2013-04-13T19:25:37.400 に答える