Ответ 1
Не существует конкретной причины, чтобы держаться подальше от локальных переменных, основными проблемами являются:
- сложнее их протестировать, так как вам придется не забывать устанавливать локальные переменные потока при тестировании кода, который его использует. Классы
- которые используют локаторы потоков, нуждаются в знаниях о том, что эти объекты не являются доступными для них, но внутри локальной переменной потока, и этот тип косвенности обычно нарушает закон demeter
- не очистка локаторов потоков может быть проблемой, если ваша инфраструктура повторно использует потоки (уже была инициирована локальная переменная потока, а код, который полагается на || =, вызовы для инициализации переменных могут завершиться неудачно
Итак, хотя это не совсем возможно, подход лучший не использует их, но время от времени вы попадаете в стену, где локальный поток будет самым простым возможное решение, не изменяя довольно много кода, и вам придется идти на компромисс, иметь менее совершенную объектно-ориентированную модель с потоком локального или менять довольно много кода, чтобы сделать то же самое.
Итак, это в основном вопрос мышления, который будет лучшим решением для вашего дела, и если вы действительно сходите по нит-локальному пути, я бы посоветовал вам сделать это с блоками, которые помнят очистите их после завершения, например:
around_filter :do_with_current_user
def do_with_current_user
Thread.current[:current_user] = self.current_user
begin
yield
ensure
Thread.current[:current_user] = nil
end
end
Это гарантирует, что локальная переменная потока очищается до использования, если этот поток повторно используется.