2016-10-19 7 views
1

私は、ユーザがfileオブジェクトとdirectoryオブジェクトを作成してファイルシステムを操作できるPerlモジュールを作成しています。1つのPerlモジュールで2つの異なるオブジェクトを作成する

例:

use File; 
use Dir; 

my $file = File->new("path"); 
my $dir = Dir ->new("path"); 

これがうまく出て動作しますが、私は本当にuse二つの別々のモジュールにせずに両方filedirectoryオブジェクトを作成できるようにしたいと思いますどのような。私は、次の解決策を考え出した。これを行うために


...

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"); 

ここに問題があります。これを実行すると、ユーザーがまたはdirectoryオブジェクトを作成したときに、newへの明示的な呼び出しが削除されます。私はコンストラクタとしてfiledirサブルーチンを使用しています。

私には、このコードは非常にきれいに見える、および使用が非常に簡単ですが、私はそう、私は、少なくとも疑問を提起する必要があります考え出し、このようにPerlコードを書いて、他の多くの人々を見ていない:

このようなサブルーチンからオブジェクトを単純に返すのは大丈夫ですか、それともこの悲鳴が悪いのですか?

+1

これはあなたが実際に作ったものではなく、実際のものではないと言っている気がしますが、参考までに、[Path :: Tiny](https:// metacpan .org/pod/Path :: Tiny)はすでにファイルシステムとやり取りするためのかなり完全なOO APIを提供しています。 – ThisSuitIsBlackNot

+1

(そしてPath :: Tinyの['path'](https://metacpan.org/pod/Path::Tiny#path)関数は' Path :: Tiny-> new'の文法的な砂糖ですので、あなたが記述したアプローチは悪い習慣ではありません。) – ThisSuitIsBlackNot

+0

恐ろしい!ありがとう@ThisSuitIsBlackNot! – tjwrona1992

答えて

2

これは問題ありません。

たとえば、Path :: Classのfileおよびdir関数はそれぞれPath :: Class :: FileおよびPath :: Class :: Dirオブジェクトを返します。

これがクラスが提供する唯一のコンストラクタであれば、サブクラス化(クリーンアップ)を防ぐことができますが、ここではそうではありません。


しかし、機能を想定

my $fh = file("path"); 
my $dh = dir("path); 

open(my $fh, "path"); 
opendir(my $dh, "path); 

を交換することが有利であるか否かの問題は、(IO ::ファイルとIO ::ディレクトリを返し、ありますオブジェクト)。

+1

池上、あなたは文字通りインターネット上で最も役に立つ人です。あなたは私のPerlに関するすべての質問の90%のような答えを得ました。 – tjwrona1992

関連する問題