在我们的产品中,我们需要一个很大的实用程序文件(使用do
),它位于许多文件的开头。是否有理由 * 不 * 将其转换为模块?例如,不要这样做:
do '../dbi_utilities.pl';
our ($db,$user,$pw,$attr);
my $Data = DBI->connect($db,$user,$pw,$attr) or die "Could not connect to database: $DBI::errstr";
我就不能这么做吗?:
use AppUtil;
my $Data = AppUtil->connect();
5条答案
按热度按时间q3qa4bjr1#
不这样做的唯一原因是时间。
也就是说,清理界面以及所有调用应用程序使用新界面都需要时间。
当你开始使用适当的测试(“make test”或“./Build test”或只是“prove...”),并且能够在签入之前检查你的更改不会破坏任何东西时,你现在所付出的代价将远远超过补偿。所以,无论如何,转换。只是要知道,这不是一个免费的收获。
sigwle7e2#
通过适当的重构将代码转换为模块,可以简化测试,我在
The Perl Journal
上的"Scripts as Modules"文章以及Perlmonks上的"How a Script Becomes a Module"文章中都提到了这一点。祝你好运
wb1gzix03#
使用do(),每次都要加载和编译utilities.pl文件,如果使用do()多次,可能会出现问题。此外,
use
是在编译时完成的,这将使程序更快失败,甚至可以使用perl -wc
进行测试。最后,将其保存在包中可以保护其名称空间,这在项目增长时会很有帮助。
我强烈建议将您的www.example.com转换utilites.pl为一个适当的Perl包,并加载
use
。sqxo8psd4#
用它制作一个模块会使它更加健壮,现在很多东西非正式地相互依赖,但这些依赖性并不是很明显。
此外,它还允许您仅导入部分实用程序。
cedebl8k5#
您可以获得所有很酷的模块内容、封装、模块特定函数等等。
但是请注意,通过使用
use
和语法.为AppUtil命名空间创建一个对象,并为实用程序调用connect子例程.。你也必须有1;在你档案的最后。
坚持使用另一种方法意味着你不必修改任何代码,你不必在末尾加1。
所有的“do”、“use”和“require”都可以导入,但它们内部的作用域代码除外(除了命名的子例程,因为它们不能隐藏)。