Perl read_config sub, OOP или нет?
Вопрос
У меня есть пакет (действительно только один подпрограмма), я часто использую для анализа файла Config и т. Д. В основном это выглядит так:
sub get_settings {
my %config;
my $config = 'path...';
unless(-r $config) {
die("Couldn't read config");
}
open CONFIG, '<', $config or die $!;
while(<CONFIG>) {
next if (($_ eq "\n") or /^\;/);
chomp;
my($setting, $value) = split(/=/, $_);
$config{$setting} = $value;
}
return %config;
}
Довольно базовый, но мне было интересно, как (и если) это можно / должно быть переписано на Ов? Действительно только для обучения, никогда не совсем не видел, когда и зачем использовать благословить. =)
Спасибо!
Решение
Ответ на вопрос имеет больше, чтобы сделать с программами, которые вы используете пакет, в чем с самой упаковкой.
Если это довольно большие приложения / сценарии / скрипты на основе OOP, то это определенно имеет смысл одать его, потому что это то, что ожидает клиента (приложения и люди, пишущие эти приложения / сценарии). Также имеющие библиотеки императивных стилей, как болит большой палец и создают сложность.
И наоборот, если пакет используется в более коротких императивных скриптах, то интерфейс OOP будет конфликтует с ожиданием клиента (то есть сценарии + люди, развивающие их).
Может быть, вы мигрируете между подходами (например, скрипт становятся большим и громоздким и должны быть лучше организованы, может быть, с OOP) в этом случае настройки / конфигурации вроде класса - это хорошее место для начала, как они, как правило, хорошо разделены и имеют Очистить линии отзывы.
Короче говоря: делать то, что имеет смысл, где используется пакет.
Другие советы
Вот (надеюсь!) Простой пример абстракции конфигурации на основе OO, используя:
Прис. Вы можете использовать другие модули или даже бросить свой собственный. Ниже служит только как общий пример.
Oomsconfig.ppm.
package RoomConfig;
use Moose;
with 'MooseX::SimpleConfig';
has doors => (is => 'rw', isa => 'Int', required => 1);
has windows => (is => 'rw', isa => 'Int', default => sub {0});
1;
Поэтому выше наш класс OO Config. Все аккуратно объявлено, поэтому вы четко знаете, что параметры конфигурации доступны и действительны, т. Е. его самообслуживание.
Так, чтобы создать room
из файла конфигурации будет:
use RoomConfig;
my $box_room = RoomConfig->new_with_config( configfile => 'box_room.yaml' );
Потому что это класс, я также могу создать room
Без файла конфигурации:
my $cupboard = RoomConfig->new( doors => 1 );
my $utility_room = RoomConfig->new( doors => 2 );
my $master_bedroom = RoomConfig->new(
doors => 1,
windows => 2, # dual aspect
);
А также с этими конкретными модулями мы получаем дополнительные функции, такие как это:
# below throws exception because room must have a door!
my $room_with_no_door_or_window = RoomConfig->new;
Таким образом, моя конфигурация может легко поступать из файла конфигурации или настройки атрибутов.
И мы можем идти дальше, расширив наш конфиг для разных типов rooms
:
Ваннаяonfig.pm.
package BathRoomConfig;
use Moose;
extends 'RoomConfig';
has loos => (is => 'rw', isa => 'Int', default => sub {0});
has sinks => (is => 'rw', isa => 'Int', default => sub {0});
has baths => (is => 'rw', isa => 'Int', default => sub {1});
1;
И если мы использовали этот конфиг (ванная комната .yaml):
doors: 1
windows: 1
bath: 1
loos: 1
sinks: 2
Тогда вы могли бы сделать это:
use BathRoomConfig;
my $upstairs_bathroom = BathRoomConfig->new_with_config(
configfile => 'bathroom.yaml'
);
my $closet_room = BathRoomConfig->new_with_config(
configfile => 'bathroom.yaml',
baths => 0,
sinks => 1,
windows => 0,
);
Обратите внимание, что $closet_room
Использует как файл конфигурации, так и настройки атрибутов.
Также обратите внимание, что если мой файл конфигурации не имел doors
(т.е. требуемое свойство), то он бросил бы ошибку на new_with_config
.
И, наконец, мы можем найти внутриспределить наш определенный класс Config Config:
use RoomConfig;
say "RoomConfig provides the following options:";
for my $attr (RoomConfig->meta->get_attribute_list) {
next if $attr eq 'configfile';
say '-> ', $attr;
}
Теперь ничего не останавливает вас в реализации большинства из этого в стандартном пакете конфигурации, так что в конце дня его просто лошадей для курсов!
Однако легкость управления всеми это намного проще с OO и функциями, которые эти уже письменные модули обеспечивают большое преимущество, особенно в более крупных проектах.
Вы можете взглянуть на исходный код из модулей на CPAN. Например Config :: general. следует ответить на ваши вопросы ...