perl - 构建 perl 模块

标签 perl design-patterns

我有一个 .pm 模块,它有五个函数,每个函数返回 0 或 1,我想添加另一个函数,将来返回 0 或 1(这些函数是测试函数 1 表示正常 0 表示失败)。

我想从脚本调用那些建立在 .pm 模块上的函数。

我希望我的脚本调用 .pm 模块上的每个函数,如果它返回 0 然后继续执行下一个函数。如果它返回 1 那么它应该打印一些东西到 LOG 并停止处理记录。

假设我将更新 .pm 模块并为其添加新功能,是否可以保留脚本代码而不做任何更改?我不想每次向 .pm 模块添加测试时都添加 if 条件?

最佳答案

.pm 模块应该提供一种方法来检索您要测试的函数列表。

我认为最好的方法是子程序调用,但您也可以使用包中定义的变量(例如列表变量)。

例子:

package MyModule;

sub testable_functions { qw(fun1 fun2 fun3) }
sub fun1 { ... }
sub fun2 { ... }
sub fun3 { ... }
sub not_going_to_be_tested { ... }

或者:
package MyModule;
our @testable_functions = qw(fun1 fun2 fun3);

在您的测试代码中:
my @funs_to_be_tested = MyModule->testable_functions;
# or = @MyModule::testable_functions if you're using a list

for my $fun (@funs_to_be_tested) {
  my $full_name = "MyModule::" . $fun;
  $full_name->() or die "function $full_name failed\n";
}

现在您可以在不更改测试代码的情况下添加要测试的函数。

如果你想变得花哨,你可以翻遍包的符号表:
package MyModule;

sub testable_functions {
  my @funs;
  for my $name ( keys %MyModule:: ) {
    next if $name eq "testable_functions"; # can add more conditions here
    my $full_name = "MyModule::".$name;
    next unless *{$full_name}{CODE};       # avoid non-subs
    push(@funs, $name);
  }
  return @funs;
}

尽管如此,契约(Contract)还是一样的:MyModule为测试代码提供了一种获取应该测试的函数列表的方法。

关于perl - 构建 perl 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7071522/

相关文章:

匹配 postgresql bytea 的正则表达式

python - 如何构建 oauth api 调用?

perl - 为什么即使我正在使用 Archive::Tar:Streamed,%MEM 也会逐渐增加?

java - log4j中使用的模式是什么

java - 定义具有隐式权限/角色的安全模型

regex - 尝试在Mac上的bash中将连字符后的单词的第一个字母大写

Perl SSH连接执行telnet

c++ - 单例模式的问题

java - 设计模式来读取记录并确定它是什么类型的记录?

c++ - boost 序列化保存到多种存档类型并防止在使用指针加载时构建新对象