Я нахожу очень удобным передать конфигурацию и другие данные, которые считаны или вычислены однажды, но затем используются много раз всюду по программе при помощи 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 ...
}
Однако я не уверен в этом как лучшая практика. Лучше добавить метод, который возвращает хеш касательно с данными? Что-то еще?
Если вы хотите читать только значения % 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;
}
В общем, лучше позволить пользователю решить, следует ли ему символы импорта. Экспортер упрощает эту задачу. Написание специального метода 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};
Я думаю, что лучше работать с копией хэша конфигурации. Таким образом, если вы измените некоторые элементы, это не повлияет на остальную часть вашего кода.
Я обычно использую для этого простой объект (необязательно Singleton) с одним методом, например get_property ()
.
Я предлагаю никогда не экспортировать переменные. Вместо этого создайте класс, который может возвращать ссылку на частную переменную. Затем люди могут сохранить его в переменной с любым именем, которое им нравится, и только тогда, когда они решат, что хотят его использовать.