2012-06-05 12 views
16

Digamos que tenemos una conexión a Memcache o redis ... ¿Qué estilo es preferido y por qué?¿Usar variable global o constante en Ruby/Rails?

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

O

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

creo que este sería una mejor opción para [CodeReview.SE]. –

Respuesta

3

OMI una "constante", ya que se comunica que se supone que es constante ....

Globales no implican que no deban mutarse.

+2

Sí. Otra solución a considerar podría ser ampliar las clases para incluir algo como 'Memcache.connection' y' Redis.connection', (un poco como 'ActiveRecord :: Base.connection') aunque podría ser un poco detallado codificar con aquellos si se usan mucho, pero de esta manera las "constantes" están unidas a sus orígenes. – Casper

+0

@Casper Probablemente una idea aún mejor, sí. –

9

No son construcciones equivalentes. Dependiendo de su aplicación, pueden ser intercambiables o no, pero son semánticamente diferentes.

# 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 para la información adicional - buen punto. –

36

Es posible que desee utilizar Redis.current Más información here

Por ejemplo, en un inicializador:

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

Y luego, en sus otras clases:

def stars 
    redis.smembers("stars") 
end 

private 

def redis 
    Redis.current 
end 
+0

Buena solución para 'No introducir variables globales'. errores por gema rubocop. – leo