Подтвердить что ты не робот

Почему Rails создает контроллер для каждого запроса?

Из предыдущего question я понял, что Rails создает экземпляр контроллера для каждого запроса.

Мой вопрос в том, что этот вопрос связан с дизайном проекта, над которым я работаю:

Почему Rails создает новый экземпляр

class SomeController < ApplicationController; end

обрабатывать каждый входящий запрос? Почему бы просто не создать объект singleton и пересылать запросы на этот? Это кажется более эффективным, поскольку мы не будем тратить ресурсы на выделение и очистку объектов для запроса?

4b9b3361

Ответ 1

Накладные расходы на создание экземпляра нового контроллера незначительны, и это означает, что между двумя полностью несвязанными запросами нет случайно разделенного состояния. Любые "сбережения" в процессорном времени будут более чем компенсированы возможностью создания разрушительных ошибок.

Помните, что контроллеры предназначены для хранения состояния, специфичного для запроса. Для повторного использования контроллеров вам потребуется reset каждый @variable, который вы когда-либо устанавливали, в начале каждого действия. В противном случае что-то вроде @is_admin = true может быть установлено и никогда не очищается. Менее надуманные ошибки, которые вы фактически вводили, были бы намного более тонкими и истощались во время разработки.

Вы видите оптимизацию там, где их нет. Что-то должно поддерживать состояние и reset между запросами, или у вас есть этот кошмар случайного состояния. Если вы сохраняете экземпляры контроллера между запросами, вы просто нажимаете на то, чтобы сохранить/сбросить состояние до некоторого более низкого уровня, где, скорее всего, ответ будет заключаться в том, чтобы создать экземпляр нового экземпляра некоторого управляющего состояния класса для каждого запроса. Компьютеры очень хорошо выделяют и освобождают ресурсы, поэтому никогда не волнуйтесь об этом, пока вы на самом деле не узнаете это узким местом. В этом случае создание нового контроллера для каждого запроса легко является правильным выбором.

В случае с Rails возможность использования @variable = value является основным выигрышем от точки четкости и удобства использования кода, и это более или менее требует отбрасывания каждого экземпляра контроллера, когда запрос завершается.