Вот (надеюсь!) Простой пример абстракции конфигурации на основе ОО с использованием:
Примечание.Вы можете использовать другие модули или даже свернуть свои собственные.Ниже приведен только общий пример.
RoomConfig.pm
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.Все аккуратно объявлено, так что вы четко знаете, что параметры конфигурации доступны и действительны, т.е.самодокументируемый.
Таким образом, для создания 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
:
BathRoomConfig.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;
И если мы использовали этот конфиг (bathroom.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
.
И, наконец, мы можем найти удобный анализ нашего определенного класса конфигурации.:
use RoomConfig;
say "RoomConfig provides the following options:";
for my $attr (RoomConfig->meta->get_attribute_list) {
next if $attr eq 'configfile';
say '-> ', $attr;
}
Теперь ничто не мешает вам реализоватьПолучите большую часть этого в стандартном конфигурационном пакете, так что в конце дня это просто лошади для курсов!
Однако легкость управления всем этим намного проще с ОО, а функции, которые предоставляют эти уже написанные модули, являются большим преимуществом, особенно в больших проектах.