2012-03-13 14 views
7

Uno di questi è l'approccio migliore o peggiore?Come devo passare oggetti alle subroutine?

utilizzano la portata:

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')) { 
    # ... 
} 

passando l'oggetto come argomento:

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 creare nella subroutine una nuova istanza:

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')) { 
    # ... 
} 

risposta

9

Prima scelta utilizza una variabile globale , non così caldo. La terza scelta è un sacco di spese generali extra. Non è neanche così bello, quindi immagino che la scelta intermedia sia preferibile nel contesto della tua domanda. Un problema più ampio è perché le subroutine devono conoscere la cache? Sembra che siano solo preoccupati per i dati. Prenderò in considerazione il recupero dei dati e il passaggio alle subroutine, dove non devono preoccuparsi se è stato memorizzato nella cache o appena creato.

6

A meno che non si desidera modificare i dati originali, è più sicuro di passare gli argomenti per riferimento, utilizzando il metodo 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')) { 
    # ... 
} 
Problemi correlati