2016-10-19 3 views
1

Ich schreibe Perl-Module, mit denen Benutzer file und directory Objekte erstellen können, um das Dateisystem zu bearbeiten.Erstellen von zwei verschiedenen Objekten durch ein Perl-Modul

Beispiel:

use File; 
use Dir; 

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

Dies funktioniert gut, aber was ich wirklich in der Lage sein mag beide file und directory Objekte zu erstellen, ohne zu use zwei separaten Modulen.


Um dies zu tun, ich mit der folgenden Lösung ...

IO.pm kam:

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

Jetzt ist hier das Problem, indem ich den expliziten Aufruf von new, wenn der Benutzer ein Objekt file oder directory erstellt, dadurch eliminiere. Ich verwende die Unterprogramme file und dir als Konstruktoren.

Für mich dieser Code sehr sauber aussieht, und ist extrem einfach zu bedienen, aber ich habe nicht viele andere Leute zu schreiben Perl Code wie diesen so dachte ich, ich sollte zumindest die Frage stellen gesehen:

Ist es in Ordnung, ein Objekt aus einer solchen Subroutine einfach zurückzugeben, oder schreit dies schlecht?

+1

Ich habe das Gefühl, dass Sie sagen werden, dass dies nur ein Beispiel ist, das Sie erfunden haben und nicht das, woran Sie gerade arbeiten, aber ... FYI, [Path :: Tiny] (https: // metacpan .org/pod/Path :: Tiny) gibt bereits eine ziemlich vollständige OO-API für die Interaktion mit dem Dateisystem. – ThisSuitIsBlackNot

+1

(Und Path :: Tiny's ['path'] (https://metacpan.org/pod/Path::Tiny#path) Funktion ist nur syntaktische Zucker für' Path :: Tiny-> new', also nein, die Ansatz, den Sie beschrieben haben, ist keine schlechte Praxis.) – ThisSuitIsBlackNot

+0

Awesome! Danke @ThisSuitIsBlackNot! – tjwrona1992

Antwort

2

Das ist völlig in Ordnung.

Zum Beispiel geben Path :: Class's file und dir Funktionen Path :: Class :: File und Path :: Class :: Dir Objekte zurück.

Wenn dies der einzige Konstruktor der Klasse wäre, würde dies (sauberes) Unterklassenbildung verhindern, aber das ist hier nicht der Fall.


Es ist jedoch die Frage, ob

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

mit

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

ist von Vorteil, oder nicht (vorausgesetzt, die Funktionen zurückgeben IO :: File und IO :: Dir Objekte).

+1

Ikegami, Sie sind buchstäblich die hilfsbereiteste Person im Internet. Du hast wie 90% aller meiner Perl-Fragen geantwortet haha. – tjwrona1992

Verwandte Themen