2017-01-12 2 views
0

Я пытаюсь выяснить, как создать Rails API, который мог бы выполнять асинхронные ответы. Многие комментарии ниже статьи и учебники говорят что-то вроде:Что так плохо с броском: async

Это throw :async действительно пугает меня

throw :async делает меня грустным

Таким образом, очевидно, используя throw :async считается плохой практикой, но я убежищем Не понял, почему.

Так что я буду признателен, если кто-нибудь объяснит мне, почему это так плохо, какие альтернативные подходы и так далее.

+1

'throw' (наряду с его сопровождающим' catch') просто выдает исключение, позволяющее избежать нескольких уровней без разрешения 'rescue'. Каждый раз, когда вы используете 'throw' в качестве механизма управления потоком, это красный флаг, что-то может быть неправильным, но есть времена, когда это лучший способ сделать это. –

+1

'Ядро # throw' бросает объекты, а не исключения. Конечно, вы можете исключать исключения, поскольку они также являются объектами, но бросок является более общим, чем это. –

ответ

3

Люди делают комментарии вроде:

Это throw :async действительно пугает меня

, потому что использование throw сродни написанию GOTO.

XKCD GOTO

Это big topic для обсуждения/дискуссии, но короткий ответ, что GOTO s, как правило, с неодобрением, как «плохо структурированный» код.

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

Вот пример throw используется в коде Ruby:

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

GOTO - слабый выход, когда у вас слабый дизайн.

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

Это не означает, что вы должны никогда использовать throw заявления - а просто, что они, как правило, не рекомендуется, и вы должны тщательно продумать ваш дизайн, если вы обнаружили, нуждающихся в них.

+0

не приведет ли ваш пример к бесконечному циклу? –

+0

Мой пример полностью надуман и не имеет смысла - единственное, что я хотел сделать, это, по-моему, «* throw» можно использовать для выхода из ** вложенного ** цикла *. Но независимо ... Нет, там нет бесконечной петли. –