2012-06-05 2 views
16

Скажите, что у нас есть связь с memcache или redis ... какой стиль является предпочтительным и почему?Использовать глобальную или постоянную переменную в Ruby/Rails?

MEMCACHE = Memcache.new(...) 
REDIS = Redis.new(...) 

ИЛИ

$memcache = Memcache.new(...) 
$redis = Redis.new(...) 
+0

Я думаю, что это лучше подходит для [CodeReview.SE]. –

ответ

3

ИМО "постоянный", так как он сообщает, что он должен быть ... постоянным.

Глобалы не подразумевают, что они не должны быть мутированы.

+2

Да. Другим решением для рассмотрения может быть расширение классов, чтобы включить что-то вроде «Memcache.connection» и «Redis.connection» (немного похожее на «ActiveRecord :: Base.connection»), хотя может быть немного подробным для кода с этими если они используются много, но таким образом «константы» привязаны к их происхождению. – Casper

+0

@ Каспер Вероятно, даже лучшая идея, да. –

9

Это не эквивалентные конструкции. В зависимости от вашего приложения они могут быть или не быть взаимозаменяемыми, но они семантически разные.

# MEMCACHE is a constant, subject to scoping constraints. 
MEMCACHE = Memcache.new(...) 

# $memcache is a global variable: declare it anywhere; use it anywhere. 
$memcache = Memcache.new(...) 
+1

+1 для дополнительной информации - хорошая точка. –

36

Вы можете использовать Redis.current Подробнее here

Например, в инициализаторе:

Redis.current = Redis.new(host: 'localhost', port: 6379) 

И тогда в ваших других классов:

def stars 
    redis.smembers("stars") 
end 

private 

def redis 
    Redis.current 
end 
+0

Хорошее решение для «Не вводить глобальные переменные». ошибки в rubocop gem. – leo

Смежные вопросы