Более чистый способ объявления многих классов в Perl - PullRequest
1 голос
/ 02 мая 2019

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

use step_1_class;
use step_2_class;
use step_3_class;
use step_4_class;
use step_5_class;
use step_6_class;
use step_7_class;
...
use step_n_class;


my $o_step_1 = step_1_class->new(@args1);
my $o_step_2 = step_2_class->new(@args2);
my $o_step_3 = step_3_class->new(@args3);
my $o_step_4 = step_4_class->new(@args4,$args_4_1);
my $o_step_5 = step_5_class->new(@args5);
my $o_step_6 = step_6_class->new(@args6,$args_6_1);
my $o_step_7 = step_7_class->new(@args7);
...
my $o_step_n = step_n_class->new(@argsn);

Есть ли более чистый способ объявить этот несколько похожий класс без использования сотен строк?

Ответы [ 2 ]

3 голосов
/ 02 мая 2019

Ваши классы использования, как написано, эквивалентны

BEGIN {
    require step_1_class;
    step_1_class->import() if step_1_class->can('import');
    require step_2_class;
    step_2_class->import() if step_2_class->can('import');
    ...
}

Это можно переписать как

BEGIN {
    foreach my $i ( 1 .. $max_class ) {
        eval "require step_${i}_class";
        "step_${i}_class"->import() if "step_${i}_class"->can('import');
    }
}

Новые операторы немного сложнее, так как у вас есть отдельные переменные и разные параметры, однако это можно обойти, сохранив все объекты в массиве, а также предварительно обработав параметры, например

my @steps;
my @parameters = ( undef, \@args1, \@args2, \@args3, [ @args4, $args_4_1], ...);
for ($i = 1; $i <= $max_class; $i++) {
    push @steps, "step_${i}_class"->new(@{$parameters[$i]});
}
1 голос
/ 02 мая 2019

Вы можете создать предложения use в Makefile.Генерация конструкции объекта будет более сложной, так как аргументы не единообразны, но вы можете, например, сохранить исключения в хеш.Это усложнит развертывание и усложнит поиск кода.

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

...