Sven Rautenberg: rekursion... Perl verweigert den Dienst...

Beitrag lesen

Moin!

Die Datenbanktstruktur sieht wie folgt aus:
+-------+--------+-------+--------+
| ID    | name   | layer | parent |
+-------+--------+-------+--------+
|   1   | Home   |     0 |      1 |
|   2   | test1  |     1 |      1 |
    .       .        .        .
    .       .        .        .
    .       .        .        .
| 38086 | test2  |     1 |      1 |
| 38087 | blabla |     2 |      1 |
+-------+--------+-------+--------+

my @vars = sql(qq{
   SELECT * FROM ebay_categories
   WHERE parent = '$_[0]' AND ID != parent});
  my $count = (@vars/4);

SELECT * ist ja grundsätzlich böse - in diesem Fall aber nochmal extraböse!

Denn du verläßt dich drauf, dass dein * im SELECT immer genau 4 Spalten auswirft. Änderst du irgendwann in der Datenbank die Struktur, dann hast du hier in deinem Code ganz böse viele Anpassungsprobleme, weil du nicht mehr durch 4 teilen mußt, sondern durch die neue Anzahl von Spalten, die in der DB stecken.

Generell finde ich das gewählte Datenformat für die Speicherung der Datensätze sehr unglücklich. Ein zweidimensionales Array wäre wesentlich angemessener gewesen, eventuell auch eine Kombination aus Array und Hash (um auf die Spalten der Datenbank zuzugreifen - der Code wird wesentlich verständlicher).

Das Problem ist auch, dass die Zahl 4 nicht als veränderbare Konstante definiert ist, sondern als Zahl an allen möglichen Stellen vorkommt - eventuell auch dort, wo "4" nicht die Zahl der Spalten aus dem SQL-Statement meint. Spätere Änderungen sind also durchaus problematisch.

Ich gebe zu, dass das alles mit deinem Hauptproblem wenig zu tun hat, aber es ist IMO eine Frage des grundsätzlichen Stils, den man durchaus mal diskutieren sollte. Ab einem gewissen Kenntnislevel kann man sich im Programmieren eben nur noch im Stil verbessern. :)

- Sven Rautenberg

--
My sssignature, my preciousssss!