2012-03-13 25 views
7

Czy jedno z nich jest najlepsze czy najgorsze?Jak przekazywać obiekty do podprogramów?

wykorzystać zakres:

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

przechodzącą obiektu jako argument:

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

lub tworząc w podprogramie nową instancję:

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

Odpowiedz

9

Pierwszy wybór wykorzystuje zmienną globalną , Nie tak gorąco. Trzeci wybór to dużo dodatkowych kosztów. Nie za dobrze, więc sądzę, że wybór pośredni jest lepszy w kontekście twojego pytania. Szerszy problem polega na tym, dlaczego podprogramy muszą w ogóle wiedzieć o pamięci podręcznej? Wygląda na to, że martwią się tylko danymi. Zastanowiłabym się nad pobraniem danych i przekazaniem ich do podprogramów, gdzie nie muszą się martwić, czy zostały one zapisane w pamięci podręcznej, czy dopiero utworzone.

6

Jeśli nie chcesz, aby zmienić oryginalne dane, to bezpieczniej przejść argumentów przez referencję, używając Metoda 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')) { 
    # ... 
} 
Powiązane problemy