Вопрос

У меня есть пакет (действительно только один подпрограмма), я часто использую для анализа файла 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. следует ответить на ваши вопросы ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top