mel*_*aos 6 oop perl module-management
最近我开始玩OO Perl并且我正在为我正在开发的新项目创建相当多的新对象.因为我对OO Perl的任何最佳实践都不陌生,我们正急于完成它:P
我在我的每个函数中都加入了很多这样的代码:
sub funcx{
use ObjectX; # i don't declare this on top of the pm file
# but inside the function itself
my $obj = new ObjectX;
}
Run Code Online (Sandbox Code Playgroud)
我想知道这是否会导致任何负面影响,而不是在use Object
任何功能范围之外的Perl模块之上.
我这样做是为了让我觉得它更干净,以防我需要改变功能.
我注意到的另一件事是,当我尝试在测试我的对象的unix服务器本身上运行一个test.pl脚本时,它很慢.但是当相同的代码通过连接到apache服务器的CGI运行时,网页的加载速度不会很慢.
dao*_*oad 10
use
在编译时发生,所以你把它放在哪里都没关系.至少从一个纯粹务实的,"它会起作用"的角度来看.因为它在编译时发生use
将始终执行,即使你把它放在条件中.永远不要这样做:if( $foo eq 'foo' ) { use SomeModule }
根据我的经验,最好将所有使用语句放在文件的顶部.它使您可以轻松查看正在加载的内容以及您的依赖项.
更新:
正如brian d foy指出的那样,在use
声明之前汇编的内容不会受到影响.所以,位置可能很重要.对于典型的模块,位置并不重要,但是,如果它执行影响编译的事情(例如,它导入具有原型的函数),则位置可能很重要.
此外,Chas Owens指出它可能会影响编译.旨在改变编译的模块称为编译指示.按照惯例,语用库在所有小写字母中都有名称.这些效果仅适用于使用模块的范围.Chas integer
在他的回答中以pragma为例.您还可以使用关键字在有限范围内禁用pragma或模块no
.
use strict;
use warnings;
my $foo;
print $foo; # Generates a warning
{ no warnings 'unitialized`; # turn off warnings for working with uninitialized values.
print $foo; # No warning here
}
print $foo; # Generates a warning
Run Code Online (Sandbox Code Playgroud)
在您的示例代码中my $obj = new ObjectX;
.这称为间接对象语法,最好避免使用它,因为它可能导致模糊的错误.最好使用此表单:
my $obj = ObjectX->new;
Run Code Online (Sandbox Code Playgroud)
没有办法告诉您提供的信息.
但找到答案的简单方法是分析您的代码并查看消耗时间的位置. NYTProf是您可能想要查看的另一种流行的分析工具.
查看Perl最佳实践和快速参考卡.这个页面有很好的关于Damian Conway的PBP OOP建议.
此外,您可能希望考虑使用Moose.如果您的使用中可以接受长脚本启动时间,那么Moose是一个巨大的胜利.
这取决于模块的功能.如果它有词法效果,那么它只会影响它所用的范围:
my $x;
{
use integer;
$x = 5/2; #$x is now 2
}
my $y = 5/2; #$y is now 2.5
Run Code Online (Sandbox Code Playgroud)
如果它是一个普通模块,那么在使用它的地方没有任何区别,但通常在程序顶部使用所有这些模块.
可能影响机器之间程序速度的事情
归档时间: |
|
查看次数: |
1469 次 |
最近记录: |