Thread Funktionen zusammenfassen? (23 answers)
Opened by der_thomas at 2014-01-19 12:34

der_thomas
 2014-01-19 12:34
#173066 #173066
User since
2013-09-07
158 Artikel
BenutzerIn
[default_avatar]
Ich habe eine Frage (die mir schon länger unter den Nägeln brennt ;) ) bezüglich der 'richtigen' oder besser 'best-practice-mässigen' Zusammenfassung von Funktionen.

Momentan arbeite ich an einem kleinen Modul dass mir zweidimensionale Arrays als eine art Datenbank verwaltet.

Nun ergibt sich immer wieder der Fall dass ich ganz ähnliche Funktionen habe die fast das gleiche machen.

Z.B. soll das Modul in der Lage sein ein bestehendes zweidimensionales Array um ein weiteres zweidimensionales Array
zu ergänzen.
Aus (["Hubert", "Mayer"], ["Laura", "Dern"])
und (["Petra", "Müller"], ["Karl", "Bauer"])
soll also ein (["Hubert", "Mayer"], ["Laura", "Dern"], ["Petra", "Müller"], ["Karl", "Bauer"]) werden.

Das was angefügt werden soll, kann wie oben direkt (als Argument) übermittelt werden, oder aus eine Textdatei stammen oder aus einer binären Datei (Storable).

Dementsprechend habe ich 3 Funktionen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
sub join_raw{
        sort_datasets($#{$testliste[0]}-1);
        cut_column(-1); # Indexspalte löschen
        cut_column(-1); # laufende Nummer löschen
    
        @testliste = (@testliste,@_);
        
        add_column("extensions");
}
        
sub join_sto{
        my $dateiname = shift;
        sort_datasets($#{$testliste[0]}-1);
        cut_column(-1); # Indexspalte löschen
        cut_column(-1); # laufende Nummer löschen
    
        my @temp = @testliste;
        @testliste = ();
    
        load_sto($dateiname);
    
        cut_column(-1); # Indexspalte löschen
        cut_column(-1); # laufende Nummer löschen
        @testliste = (@temp, @testliste);
        add_column("extensions");
}

sub join_txt{
        my $dateiname = shift;
        sort_datasets($#{$testliste[0]}-1);
        cut_column(-1); # Indexspalte löschen
        cut_column(-1); # laufende Nummer löschen
        
        my @temp = @testliste;
        @testliste = ();
    
        load_txt($dateiname);
    
        cut_column(-1); # Indexspalte löschen
        cut_column(-1); # laufende Nummer löschen
        @testliste = (@temp, @testliste);
        add_column("extensions");
}



Wie man sieht ist das nicht gerade DRY ;)
Aber schön übersichtlich und von der Aufteilung auf drei Funktionen her eventuell der übliche Weg, oder so wie man es als Benutzer erwarten würde ?
(Um weniger DRY zu schreiben könnte ich natürlich weitere kleine modulinterne Subroutines schreiben, aber ob das in dem Fall der richtige Weg ist...dadurch würde es dann an anderer Stelle unübersichtlich ? 'Wasserbett')

Kürzer ginge es wenn ich nur eine join Funktion hätte:
join(raw/txt/sto, @array/Dateiname)
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
sub join {
        my $art = shift;
        sort_datasets($#{$testliste[0]}-1);
        cut_column(-1); # Indexspalte löschen
        cut_column(-1); # laufende Nummer löschen
                
        if ($art eq "txt" or $art eq "sto"){
            my $dateiname = shift;
            my @temp = @testliste;
            @testliste = ();
    
            load_sto($dateiname) if $art eq "sto";
            load_txt($dateiname) if $art eq "txt";
    
            cut_column(-1);     # Indexspalte löschen
            cut_column(-1);     # laufende Nummer löschen
            @testliste = (@temp, @testliste);
        }
        
        else { 
            @testliste = (@testliste,@_) 
        }
        
        add_column("extensions");
}


Auch wenn die Codewiederholung im ersten Beispiel extrem- und bei den folgenden Funktionen erheblich geringer ist, stellt sich die oben gestellte Frage auch hier:

Daten laden ....per @liste, txt oder sto....load_txt("dateiname") vs load("txt","dateiname")
Daten speichern ....per sto oder txt
In der Liste bewegen .....get(">") vs get_next() u.s.w.
Zählen der Datensätze per get_counter_all und get_counter_found vs get_counter("all") bzw. get_counter("found")
add_column("leer") und add_column("extensions") vs add_column("leer") und add_extensions()
("extensions" fügt jedem Datensatz eine laufende Nummer und einen Index (1) an)

Weltbewegend ist die Codewiederholung hier an dem Beispiel natürlich nicht, die Wartbarkeit leidet darunter auch nicht weil ja fast nur modulinterne Funktionen aufgerufen werden und das Ganze eh trivial ist.
Es geht mir mehr darum was vom Stil her besser ist oder der üblichere Weg ist:
Weniger 'mächtigere' Funktionen oder viele kleine Funktionen ......oder je nachdem mal so, mal so....wodurch das Ganze nicht mehr so konsistent wäre ?

thomas

View full thread Funktionen zusammenfassen?