2012-03-13 4 views
7

Является ли один из них лучшим или худшим подходом?Как передать объекты подпрограмм?

использовать объем:

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

передачи объекта в качестве аргумента:

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

или создания в подпрограмме новый экземпляр:

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

ответ

9

Первый выбор использует глобальную переменную , не так жарко. Третий выбор - это много дополнительных накладных расходов. Не так уж и хорошо, поэтому я предполагаю, что средний выбор предпочтительнее в контексте вашего вопроса. Более широкая проблема заключается в том, почему подпрограммы должны вообще знать о кеше? Похоже, что их беспокоит только информация. Я бы рассмотрел выборку данных и передал их подпрограммам, где им не нужно беспокоиться, если они были кэшированы или просто созданы.

6

Если вы не хотите, чтобы изменить исходные данные, безопаснее передавать аргументы по ссылке, используя метод 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')) { 
    # ... 
} 
Смежные вопросы