2011-01-31 21 views
0

の数を減らすためにどのように私はこのは、階層的な「if文」

<% @descriptions.each_with_index do |description, i| %> 
    <% description.tale2.each do |tax_ref| %>    
    <% if condition %>    
     <% if condition %> 
     <% if condition %>     
      <%= $text_first_describe%> <%= $paren_author_yr %> 
      <% ref_sp_uniq.each_with_index do |ref, i| %> 
       <% if ref == tax_ref.ref_wo_brace%> 
        <% execution %>      
       <% elsif i == (ref_sp_uniq.size - 1)%> 
        <%# @ref_desc = "#{@ref_desc_numb}. #{tax_ref.ref_wo_brace}" %> 
       <% end %> 
      <% end %> 
      <% if condition %> 
        <% execution %>      
      <% elsif condition %> 
      <% execution %> 
      <% elsif taxon_name.emend_author_year %>      
      <%= print %> 
      <% else %>      
      <%= print %>      
      <% end %> 
     <% end %> 
     <% else %> 
     <% if condition %> 
      <%= print %> 
      <% ref_sp_uniq.each_with_index do |ref, i| %> 
      <% if condition %> 
       <% execution %>      
      <% elsif condition %> 
        <% execution %>      
      <% end %> 
      <% end %> 
      <% if condition %> 
      <% execution %>      
      <% elsif condition %> 
      <% execution %>      
      <% elsif condition %> 
      <% execution %>      
      <% else %> 
      <% execution %>      
      <% end %> 
     <% end %> 
     <% end %> 
    <% end %> 
    <% end %>   
<% end %> 

ようなステートメントは、親切に私に「if文」ジャンクのこの種を低減することが可能な方法を提案した階層があります。

+0

ループではない場合。私はあなたが "if文"を意味すると思います。 –

+0

私は条件が何であるか分かりませんが、おそらくそれらを考え直すことで、 "と"や "や"、括弧などと結合することができます。 – Ian

+0

@martinhoは:その「if文」 –

答えて

0

まず最初に、このコードをヘルパーに入れて、すべてのタグを取り除いてビューを消去してから、caseステートメントを適用することができたら、line_of_code if conditionまたはcondition ? code_a : code_bを含めるようにしてください。

条件なしで何かをするのは難しいです(それぞれ条件が変わったと思います)。質問をhttps://codereview.stackexchange.com/ に解決してみませんか?

4

あなたのネストされたIFSは非常に複雑になっている場合は、ステートマシンで全体の構造を説明し、そのように処理することを検討してください。こうすることで、正式な状態図のドキュメントを手に入れ、コードがはるかに簡単になります。

編集:

ここでは、プロセスを説明するためのより良い方法を示します。良いことは これは、あなたが初期状態の図と のコードを処理したら、新しい状態を加えることは非常に簡単です。 (具体的には ダイアグラムを読んで あなたのテーブルを生成するための小さなツールを構築する場合)。

ほとんどの人が正規表現のコンテキストでこれらを使用し、 はそのままにしておきますが、それはツールボックス にある素晴らしい強力なツールです。一般的な例は完全なftpサーバを実装しています。この 方法は簡単です。

私のより良い例では、これが役立つことを願っています。

このIFの擬似コード考えてみましょう:

if (a < 5) 
    do_b 
    do_c 
    if (a < 3) 
    do_d 
    else 
    do_e 
    end-if 
end-if 

これは次のようになります処理するために、状態遷移表:

State Transition Action Next state 
----- ---------- ------ ----- 
1  a < 5    2   
1       7 
2     do_b  3 
3     do_c  4 
4  a < 3    5 
4       6 
5     do_d  7 
6     do_e  7 
7     exit 

それは次のようになります処理するためのコードを:

currentState = 1 
foreach table entry 
    if table_state == currentState 
    && table_transition is true or blank 
     call table_action 
     currentState = table_next_state 

の詳細については、http://en.wikipedia.org/wiki/State_transition_tableをご覧ください。説明。

+0

申し訳ありませんが、私は理解できません。そのためにルビーを作成する外部プログラムを意味していますか?面白いと聞こえるかもしれません... – ecoologic

+0

いいえ、私はバブルと矢印のステートマシンスタイルで深くネストされたIFを文書化することを意味します。バブルは、IFとELSEの本体に対応する状態です。矢印は、現在の状態と変数の値に応じて発生する遷移です。これを処理するには、最初に開始し、見つかった最初の有効な遷移を取得し、その状態で操作を実行し、終了状態になるまで再度ループします。 –

+0

それはそれよりも難しく聞こえる。テキストよりもホワイトボードとマーカーで説明するほうがずっと簡単です。 –

0

Ruby's case syntaxは、おそらくそれをクリーンアップするための良い出発点になりますが、他の人が言及しているようにあなたは、おそらくそこで起こっていただきまし再考する必要があります。最終的には、できるだけ多くのロジックをモデルに移行したいと考えています。

私の2セントです。

関連する問題