如何减少层次'if语句'的数量

时间:2011-01-31 16:31:29

标签: ruby-on-rails if-statement erb

我有像这样的语句的层次结构

<% @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 statements”。

3 个答案:

答案 0 :(得分:4)

如果嵌套的IF变得非常复杂,您可以考虑使用状态机描述整个结构并对其进行处理。这样,您就可以获得正式状态图的文档,并且您的代码将更加简单。

编辑:

这是描述该过程的更好尝试。好的事情 这是一旦你有你的初始状态图和代码 处理它,添加新状态很容易做到。 (特别是如果你 构建一个小工具来读取你的图表并生成你的表格 你)。

大多数人只是在正则表达式的上下文中使用它们 别管他们,但这是一个很好的强大工具 你的工具箱。一个常见的例子就是实现一个完整的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 更正式的描述。

答案 1 :(得分:0)

Ruby's case syntax可能是清理它的一个很好的起点,但就像其他人提到的那样,你可能需要重新思考那里发生的事情。最终,您可能希望尽可能多地将这些逻辑移动到模型中。

我的两分钱。

答案 2 :(得分:0)

首先,我会将此代码放在帮助器中,因此您将清除所有标记并清理视图,然后查看是否可以应用case语句,后者记住可能包含{ {1}}或line_of_code if condition

很难在没有条件的情况下做一些事情(我想条件会改变一下),为什么不将问题提到https://codereview.stackexchange.com/