Avatar von wawiwo
  • wawiwo

208 Beiträge seit 30.09.2018

Was ich in dem Aufsatz vermisse ...

... ist ein Eingehen auf eine vernünftige Codestruktur. Insbesondere bei Verzweigungen wird hier viel geschludert, was dann später zu Leichtsinns- oder gar provozierten Fehlern führt. Ich habe mir z.B. einige relativ einfache Grundsätze angewöhnt:

1) Bei Verzweigungen werden grundsätzlich alle Wege implementiert; und wenn es nur ein auskommentiertes "// else nothing" (C++-Beispiel) ist. Das erinnert aber beim späteren Lesen und v. a. Ändern immer daran, dass es da noch einen Weg gibt, der mit überprüft werden muss. Viel zu oft habe ich schon fest stellen müssen, dass frühere Kollegen irgend wann Änderungen am Code implementierten, bei denen dieser - ehemals nicht benutzte - Weg plötzlich doch von Bedeutung war, sprich dort auf die Änderungen eingegangen hätt werden müssen, dies aber aus Unachtsamkeit übersehen wurde.

2) Die Abfragen von Verzweigungen werden nach Möglichkeit so gewählt, dass der kürzere Code vorne steht. Auch wenn man dazu die Bedingung eventuell umdrehen muss (also aus z. B. "if (i1 > 0)" ein "if (i1 <= 0)" o. ä. wird). Ist nicht immer schön, aber das hilft, einen evtl. wenig benutzen Weg nicht zu vergessen, da man immer erst an diesem kurzen Codefragment "vorbei" lesen muss, und so daran erinnert wird. Nix ist schlimmer, als wenn nach 3 Seiten Code dann noch ein (womöglich gar selten benutztes) "else" steht. Soweit liest man dann u. U. gar nicht, weil die Änderung in dem vorherigen Zweig ganz früh schon abschließend (für diesen Zweig) behandelt wurde. Unachtsamkeitsfehler sind vorprogrammiert.

3) Wenn die Codesequenz eines Weges zu lang und unübersichtlich wird, womöglich selbst noch viele Verzweigungen usw. enthält, usw., sollte man auch über das Auslagern dieser Codesequenz in eine Unterfunktion nachdenken, selbst wenn diese Funktion nur an dieser einen Stelle aufgerufen wird. Aber es erleichtert einfach die Les- und damit Wartbarkeit der übergeordneten Struktur ungemein. Allerdings sollte man dabei die Laufzeit im Auge behalten. Auch auf modernen Rechnern kann so etwas, v.a. im Innern einer Schleife mit hohen Durchlaufzahlen, immer noch leicht zu deutlich spürbaren Laufzeitverlängerungen führen.

4) Gerade wenn es viele verschachtelte Verzweigungen gibt, die auch noch viel Code beinhalten, hilft es enorm, bei jedem "else" und "endif" o. ä. (zuminedest wenn das weiter entfernt ist von der einleitenden Struktur) einen Kommentar zu hinterlassen, zu welcher Bedingung es gehört. Also z.B. (C++-Beispiel)

if (time < 10) { : } else { // (time >= 10) : if (delay < 20) { : } else if (delay > 40) { : } else { // (delay >= 20) || (delay <= 40) : } // if (delay) : } // if (time)
Bewerten
- +