Perl 包装是否应为';使用';d全局还是从需要它们的函数?
如果此问题不适合StackOverflow,请道歉。我怀疑答案在很大程度上取决于观点(除非其中一个风格指南有建议) 我有这样的代码Perl 包装是否应为';使用';d全局还是从需要它们的函数?,perl,Perl,如果此问题不适合StackOverflow,请道歉。我怀疑答案在很大程度上取决于观点(除非其中一个风格指南有建议) 我有这样的代码 use File::Temp; sub foo { ... } sub bar { ... } sub baz { my $fh = tempfile(); ... } baz是唯一使用File::Temp的子例程,我没有使用AutoLoader。将use声明放在baz中是合理的,还是应该将其放在脚本的顶部?use本质上与将req
use File::Temp;
sub foo {
...
}
sub bar {
...
}
sub baz {
my $fh = tempfile();
...
}
baz
是唯一使用File::Temp
的子例程,我没有使用AutoLoader。将use
声明放在baz
中是合理的,还是应该将其放在脚本的顶部?use
本质上与将require
语句放在BEGIN
块中是一样的,因此放在哪里并不重要;它们在代码的其他部分之前被评估。因为(正如切普纳所说),技术上没有区别,这实际上是风格的问题
将“然后全部放在上面”的优点:
- 乍一看清楚所有直接模块依赖项是什么
- 更易于维护-如果需要使用库移动代码,则无需记住移动库 请注意,同样的确切逻辑也适用于变量声明,但在这种情况下,作用域关注点严重超过了“记住移动声明”关注点,因此您应该在尽可能靠近使用位置的最内层范围内声明变量
- 对于您自己的代码在依赖于正在加载的所有库的
块中包含复杂逻辑的深奥情况(例如,从所有加载的库中调用一个特定命名的方法-我已经这样做了)-如果某个库的BEGIN{}
调用在use
块之后,您将有一个bugBEGIN{}
- 有人可能会说,这会降低代码的可读性,因为您需要查找文件的开头,以查看从模块导入的内容。坦率地说,我不相信这一点,但我已经听说过了,它至少有一些优点
使用foo;foo::bar()
是必需的(并且始终是合法的,即使foo
自动导出bar
)。@chepner-我要的是那些您已经导出了OK并且您手动导入标识符的函数,大多数情况下,为了对抗这些缺点,您可以使用函数的完全限定名(文件::Temp::tempfile()
)而不是本地导入的别名。这使得外部引用显式,而导入保持在顶部。感谢您的第二个意见,@DVK。这与我的第一个观点没有实质性的不同。