在Perl中声明多个类的更简洁方法

时间:2019-05-02 11:15:28

标签: perl class object declaration

我正在编写遵循以下步骤的代码,并且每个步骤都在一个类中完成。现在,我的代码如下:

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 个答案:

答案 0 :(得分:3)

您编写的使用类等效于

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 :(得分:1)

您可以在Makefile中生成use子句。由于参数不统一-生成对象的构造会更加棘手-但您可以例如将异常保存到哈希中。这将使部署更加复杂并使代码查找变得棘手。

明智的做法是,根据目的对每个步骤进行重命名,然后将各个步骤合理地分组在一起,以形成层次结构,而不是简单的步骤顺序。