2012-03-13 10 views
7

¿Es uno de estos el mejor o el peor enfoque?¿Cómo debo pasar objetos a las subrutinas?

utilizan el alcance:

my $cache = CHI->new(driver => 'File', expires_in => 3600); 

sub one { 
    if (my $data = $cache->get('key_one')) { 
    # ... 
} 

sub two { 
    if (my $data = $cache->get('key_two')) { 
    # ... 
} 

pasando el objeto como argumento:

my $cache = CHI->new(driver => 'File', expires_in => 3600); 

sub one { 
    my ($cache) = @_; 
    if (my $data = $cache->get('key_one')) { 
    # ... 
} 

sub two { 
    my ($argument1, $cache) = @_; 
    if (my $data = $cache->get('key_two')) { 
    # ... 
} 

o la creación en la subrutina una nueva instancia:

sub one { 
    my $cache = CHI->new(driver => 'File', expires_in => 3600); 
    if (my $data = $cache->get('key_one')) { 
    # ... 
} 

sub two { 
    my $cache = CHI->new(driver => 'File', expires_in => 3600); 
    if (my $data = $cache->get('key_two')) { 
    # ... 
} 

Respuesta

9

La primera opción utiliza una variable global , no tan caliente. La tercera opción es una gran cantidad adicional de gastos generales. Tampoco es tan bueno, así que supongo que la opción del medio es preferible en el contexto de su pregunta. Un problema más amplio es por qué las subrutinas necesitan saber sobre la caché en absoluto? Parece que solo están preocupados por los datos. Consideraría buscar los datos y pasarlos a las subrutinas, donde no tienen que preocuparse si se almacenaron en caché o simplemente se crearon.

6

A menos que desee cambiar los datos originales, es más seguro para pasar los argumentos por referencia, usando el método 2:

my $cache = CHI->new(driver => 'File', expires_in => 3600); 

one (\$cache); 

sub one { 
    my ($cache) = @_; 
    if (any {!defined @_} $cache { //can expand on this 
     croak "missing parameters"; 
    if (my $data = $cache->get('key_one')) { 
    # ... 
} 
Cuestiones relacionadas