Как передать объекты в подпрограммы? - PullRequest
7 голосов
/ 13 марта 2012

Является ли один из них лучшим или худшим подходом?

использует область действия:

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

Ответы [ 2 ]

9 голосов
/ 13 марта 2012

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

6 голосов
/ 13 марта 2012

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