2016-10-19 5 views
1

나는 사용자가 filedirectory 객체를 만들어 파일 시스템을 조작 할 수있게 해주는 Perl 모듈을 작성하고 있습니다.하나의 Perl 모듈을 통해 두 개의 다른 객체 만들기

예 :이 좋게 작동하지만 내가 정말하고 싶은 것은 use 두 개의 별도의 모듈없이 모두 filedirectory 객체를 생성 할 수

use File; 
use Dir; 

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

.


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 서브 루틴을 생성자로 사용하고 있습니다.

:

이 코드는 매우 깨끗보고, 사용하기 매우 간단하다 나에게

,하지만이 같은 펄 코드를 작성하는 다른 많은 사람을 보지 못했어요 그래서 나는 적어도 문제를 제기해야한다 생각 이런 식으로 서브 루틴에서 객체를 반환하는 것은 괜찮습니까? 아니면이 비명을 나쁜 것으로 연습합니까?

+1

나는 이것이 당신이 실제로 만든 것이 아니라 당신이 만든 예제라고 말할 것 같은 느낌이 들지 만 ... FYI, [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

굉장! 고마워요. 이거 야. – tjwrona1992

답변

2

괜찮습니다.

예를 들어 Path :: Class의 filedir 함수는 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