Это - хорошая практика для экспорта переменных в Perl?

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

package Myconfiguration;

my %config;

sub import {
    my $callpkg = caller(0);
    my $expsym = $_[1];

    configure() unless %config;

    *{"$callpkg\::$expsym"} = \%config;
}

и затем в других модулях:

use MyConfiguration (loc_config_sym);

if ( $loc_config_sym{paramater} ) {
    # ... do stuff ...
}

Однако я не уверен в этом как лучшая практика. Лучше добавить метод, который возвращает хеш касательно с данными? Что-то еще?

5
задан gvkv 7 April 2010 в 15:30
поделиться

4 ответа

Если вы хотите читать только значения % config , то почему бы не иметь подпрограмму, которая сделает это за вас?

 my %config;
 sub config_value
 {
      my ($value) = @_;
      return $config{$value};
 }

Вы можете экспортировать это по умолчанию, если хотите:

package Mypackage;
require Exporter;
@EXPORT = qw/config_value/;

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

Нет причин, по которым у вас тоже не может быть установленной подпрограммы:

 sub set_value
 {
      my ($key, $value) = @_;
      $config{$key} = $value;
 }
5
ответ дан 14 December 2019 в 01:05
поделиться

В общем, лучше позволить пользователю решить, следует ли ему символы импорта. Экспортер упрощает эту задачу. Написание специального метода import , позволяющего пользователю решать, как назвать импортированные символы, может быть полезно в редких случаях, но я не думаю, что это один из них.

package MyConfiguration;
require Exporter;

our @ISA       = qw(Exporter);
our @EXPORT_OK = qw(Config);

our %Config;

А затем в вашем скрипте:

use MyConfiguration;
print $MyConfiguration::Config{key};

или

use MyConfiguration qw(Config);
print $Config{key};
0
ответ дан 14 December 2019 в 01:05
поделиться

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

Я обычно использую для этого простой объект (необязательно Singleton) с одним методом, например get_property () .

2
ответ дан 14 December 2019 в 01:05
поделиться

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

2
ответ дан 14 December 2019 в 01:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: