2012-03-13 13 views
7

Là một trong những cách tiếp cận tốt nhất hoặc tệ nhất?Tôi nên chuyển đối tượng tới chương trình con như thế nào?

sử dụng phạm vi:

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

đi qua các đối tượng như là đối số:

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

hoặc tạo trong chương trình con một trường hợp mới:

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

Trả lời

9

sự lựa chọn đầu tiên sử dụng một biến toàn cầu , không quá nóng. Lựa chọn thứ ba là rất nhiều chi phí phụ. Không tuyệt vời như vậy, vì vậy tôi đoán sự lựa chọn giữa là thích hợp hơn trong bối cảnh của câu hỏi của bạn. Một vấn đề lớn hơn là tại sao các chương trình con cần biết về cache? Có vẻ như họ chỉ lo lắng về dữ liệu. Tôi sẽ xem xét lấy dữ liệu và chuyển cho các chương trình con, nơi chúng không phải lo lắng nếu nó được lưu trữ hoặc vừa tạo.

6

Trừ khi bạn muốn thay đổi dữ liệu gốc, đó là an toàn hơn để vượt qua các đối số bằng cách tham khảo, sử dụng phương pháp 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')) { 
    # ... 
}