我正在编写Perl模块,允许用户创建file
和directory
个对象来操作文件系统。
示例:
use File;
use Dir;
my $file = File->new("path");
my $dir = Dir ->new("path");
这很好用,但我真的希望能够创建file
和directory
个对象而无需use
两个单独的模块。
为此,我提出了以下解决方案......
IO.pm:
use File;
use Dir;
use Exporter qw(import);
our @EXPORT_OK = qw(file dir);
sub file {
my $path = shift;
return File->new($path);
}
sub dir {
my $path = shift;
return Dir->new($path);
}
1;
test.pl:
use IO qw(file dir);
my $file = file("path");
my $dir = dir ("path");
现在问题出现了,通过这样做,当用户创建new
或file
对象时,我消除了对directory
的显式调用。我有点使用file
和dir
子程序作为构造函数。
对我来说,这段代码看起来很干净,而且使用起来非常简单,但我还没有看到很多其他人写这样的Perl代码所以我认为我至少应该提出这样的问题:
是否可以简单地从这样的子程序中返回一个对象,或者这是不是很糟糕的做法?
答案 0 :(得分:3)
这很好。
例如,Path :: Class的file
和dir
函数分别返回Path :: Class :: File和Path :: Class :: Dir对象。
如果那是该类提供的唯一构造函数,它将阻止(清理)子类化,但这不是这种情况。
然而,是否有替换
的问题open(my $fh, "path");
opendir(my $dh, "path);
与
my $fh = file("path");
my $dh = dir("path);
是否有利(假设函数返回IO :: File和IO :: Dir对象)。