Как уменьшить количество иерархических операторов if - PullRequest
0 голосов
/ 31 января 2011

У меня есть иерархические утверждения, подобные этому

<% @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 %>

Пожалуйста, предложите мне возможный способ уменьшить этот вид мусора "если заявления".

Ответы [ 3 ]

4 голосов
/ 31 января 2011

Если ваши вложенные IF становятся очень сложными, вы можете рассмотреть описание всей структуры с помощью конечного автомата и обработать ее таким образом. Таким образом, вы получите документацию по формальной диаграмме состояний, и ваш код будет намного проще.

Edit:

Вот лучшая попытка описать процесс. Хорошая вещь о это то, что, как только у вас есть исходная диаграмма состояния и код обработать его, добавив новые состояния очень легко. (Особенно если ты создайте небольшой инструмент для чтения вашей диаграммы и создания таблицы для вы).

Большинство людей просто используют их в контексте регулярных выражений и в противном случае оставьте их в покое, но это хороший мощный инструмент для ваш набор инструментов. Типичным примером является реализация полноценного 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 голосов
/ 31 января 2011

Прежде всего, я бы поместил этот код в помощник, чтобы вы избавились от всех тегов и очистили представление, а затем посмотрите, можете ли вы применить оператор case, и последний помнит, что вы можете включить line_of_code if condition или condition ? code_a : code_b.

Трудно сделать что-то без условий (я полагаю, что условия меняются каждый, если), почему бы не обратиться к вопросу https://codereview.stackexchange.com/

0 голосов
/ 31 января 2011

Синтаксис регистра в Ruby , вероятно, будет хорошей отправной точкой для очистки этого, но, как и другие упоминали, вам, вероятно, нужно переосмыслить происходящее.В конечном счете вы, вероятно, захотите перенести как можно больше этой логики в модель.

Мои два цента.

...