Thread EBB 1.2 (12 answers)
Opened by [E|B] at 2005-01-08 23:26

Strat
 2005-01-09 12:52
#16205 #16205
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Rambo,09.01.2005, 10:39]auch auf die gehfahr hin das es laecherlich ist.
habe das jetzt schon öfters gehört, was ist ein "spagetti code" und was ist "code in funktionen auslagern"?[/quote]
@Rambo: code in funktionen auslagern: haeufig wird funktionalitaet eines programmes an mehreren stellen benoetigt; da kann man die entweder an jeder stelle coden, oder man schreibt sie einmal gemeinsam und benuetzt sie dann an diesen x stellen.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
my %hash = (a => 10, b => 20, c => 30);
my $hashRef = \%hash;
foreach (keys %$hashRef) {
print "$_ => $hashRef->{$_}\t";
}
print "\n";

$hashRef->{d} = 40;
foreach (keys %$hashRef) {
print "$_ => $hashRef->{$_}\t";
}
print "\n";

$hashRef->{e} = 50;
foreach (keys %$hashRef) {
print "$_ => $hashRef->{$_}\t";
}
print "\n";

die ausgabe der hashreferenz wird hier 3 mal identisch gecoded, was das programm:
x) schwerer wartbar macht (wenn sich da was beim ausgabeformat aendert, muss an drei stellen geaendert werden)
x) schlechter lesbar macht (der unnoetige fuellcode verdeckt das wesentliche)
x) sowas ist ein beispiel von spaghetti-code

wenn man z.B. die ausgabe der hashreferenz in eine subroutine (~funktion) auslagert, koennte das folgendermaszen aussehen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
my %hash = (a => 10, b => 20, c => 30);
my $hashRef = \%hash;

$hashRef->{d} = 40;
&PrintHashref($hashRef);

$hashRef->{e} = 50;
&PrintHashref($hashRef);
# -------------------------------------
sub PrintHashref {
my ($hashref) = @_;

foreach (keys %$hashRef) {
print "$_ => $hashRef->{$_}\t";
}
print "\n";
}

hier sind folgende Vorteile:
x) wenn sich bei der ausgabe was aendert, muss nur an einer stelle (naemlich in PrintHashref) was geaendert werden
x) Die subroutine PrintHashref kann per Copy&Paste wiederverwendet werden
x) Da der Name PrintHashref schon recht sprechend ist, wird das programm besser lesbar, weil das wesentliche nicht durch kiloweise fuellcode "verdeckt" wird. Aus diesem Grund macht es auch oft sinn, auch Funktionalitaet, die nur einmal benoetigt wird, in einer subroutine zusammenzufassen, weil dadurch die lesbarkeit erhoeht wird:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
#! /usr/bin/perl
use warnings;
use strict;

my $params = &ParseProgramParameters();

for my $i (0..$params->{count}) {
my $data = &ReadAndParseData($params, $i);
&WriteDataToDb($data, $i);
}
.......

laesst den ablauf des programmes schon recht klar erkennen. Jetzt stelle dir mal vor, dass anstelle der einzelnen subroutinenaufrufe jeweils 1000 zeilen code stehen, und versuche dann, die struktur mal auf die schnelle zu verstehen... da bekommst du dann auch wahrscheinlich das problem herauszufinden, welche variable wie von welchem teil in den naechsten teil uebergeben wird, waehrend du bei der obigen loesung klare schnittstellen hast, und zusaetzlich durch den scope der subroutinen klare gueltigkeitsbereiche der darin verwendeten variablen hast, sodass dich nicht kuemmern muss, ob irgendwo anders die variable mit selbem namen schonmal benuetzt wird, und du sie vielleicht ueberschreibst (vorausgesetzt, du verwendest lokale variablen)
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/

View full thread EBB 1.2