我有像这样的语句的层次结构
<% @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”。
答案 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/ ?