Thread OOP Parameterübergabe direkt oder indirekt ? (21 answers)
Opened by der_thomas at 2014-04-26 00:16

der_thomas
 2014-04-28 22:22
#175100 #175100
User since
2013-09-07
158 Artikel
BenutzerIn
[default_avatar]
Quote
Lass mal z.B. Berechtigungen beim öffnen fehlen, dann gehts dahin.

Stimmt, im Falle fehlender Leserechte gehts tatsächlich dahin, Danke für den Hinweis.

Die Lösung mit 'die' habe ich aber auch wieder aufgegeben, das funktioniert nur vernünftig wenn man im Hintergrund immer eine Konsole offen hat, ansonsten kommt es wohl zu einem Programmabbruch ohne Rückmeldung.
Daher wird nun, wie von Rosti vorgeschlagen, dieser Teil an das Frontend verlagert...naja nicht ganz - die Prüfung erfolgt im Konstruktor, aber wie es dann weitergeht ist Sache des Frontends - indem einfach der für 'die' bestimmte Fehlertext per Return zurückgegeben, was ich so umgesetzt habe:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
# Frontend
...
my $genre_objekt = Trk_dict->new('genre_dict7');
if ($genre_objekt =~ /Dateilesefehler.*/){say "$genre_objekt";exit}
...
 
# Klasse
...
open( my $FH, '<:unix:encoding(UTF-8)', $file)
            or return "Dateilesefehler: '$file' konnte von Trk_dict nicht geöffnet werden\nGrund: $!\n";
...



Soweit der Stand von gerade eben, wo ich dachte ich wäre fertig und müßt das Ganze nur noch ausgiebig testen ... aber nun lese ich da was neues und verlockendes:
Quote
my $dict = Dict->new( file => $file); # or wir machen was Anderes

Der im Modul verfasste Grund "IO-Error: $!" steht in der main verfügbar somit in $@. Wir können das ignorieren oder auch untrennbar miteinander verbinden:


Mmh, das wäre verlockend, sieht fast ein wenig transparenter und später besser nachvollziehbarer aus als meine Version (Weniger was das Klassenmodul sondern mehr was das Mainscript betrifft):
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sub new {
        my ($classname, $file) = @_;
        
        open( my $FH, '<:unix:encoding(UTF-8)', $file)
            or return "Dateilesefehler: '$file' konnte von Trk_dict nicht geöffnet werden\nGrund: $!\n";
        chomp(my @inhalt = <$FH>);
        close $FH;

        # Prüfen ob Dateiinhalt Hash tauglich ist
        if (($#inhalt+1) % 2 and $inhalt[$#inhalt] eq "\n"){pop @inhalt}
        if (($#inhalt+1) % 2){return "Dateiinhalt inkonsistent\n"}

        push @inhalt, "_file", $file; # wird benötigt zum automatischen Speichern
        my %dict = @inhalt;
        my $self = \%dict;
        bless($self, $classname);
    }

Code (perl): (dl )
1
2
3
4
5
6
7
8
....

# Main
...
my $genre_objekt = Trk_dict->new('genre_dict');
if ($genre_objekt =~ /Dateilesefehler.*/){say $genre_objekt;exit}
if ($genre_objekt =~ /Dateiinhalt.*/){say $genre_objekt;exit}
....


Muss mich morgen mal mit eval beschäftigen...

thomas

View full thread OOP Parameterübergabe direkt oder indirekt ?