throw:async是多么糟糕

时间:2017-01-12 13:46:13

标签: ruby-on-rails ruby asynchronous

我正在尝试找出如何创建可以执行异步响应的Rails API。文章和教程下面的许多评论都说:

  

throw :async让我感到害怕

     

throw :async让我难过

显然使用throw :async被认为是不好的做法,但我还没弄清楚原因。

所以如果有人解释我为什么这么糟糕,有什么替代方法等等,我会很感激。

1 个答案:

答案 0 :(得分:3)

人们正在发表评论:

  

throw :async让我感到害怕

因为使用throw类似于编写GOTO。

XKCD GOTO

这是一个big topic讨论/辩论,但简短的回答是GOTO通常不赞成“结构糟糕”的代码。

总是可以在没有GOTO的情况下解决编程问题,并且在代码中看到它们通常表示会导致问题的黑客攻击。

以下是在ruby代码中使用throw的示例:

def my_method
  catch(:escape) do
    outer_list.each do |item1|
      inner_list.each do |item2|
        throw :escape if item2 == "something"
      end
    end
    puts "something was not found"
    return
  end
  puts "something was found!"
end

上述throw需要打破嵌套循环......但是正如您所希望看到的,有一种更简单/更简洁的方式来编写上述代码。 / p>

  

当你的设计薄弱时,GOTO是一种微弱的出路。

反对GOTO的两个最常用的参数可能是代码更难以理解,并且有更多方法可以达到代码中的特定点。

这并不意味着您永远不会使用throw语句 - 但仅仅是因为它们通常是气馁的,如果您发现自己需要它们,您应该仔细考虑您的设计。