2012-03-13 78 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')) { 
    # ... 
} 
相關問題