Ändere nie ein Variable

http://blog.choas.net/2006/06/08/aendere_nie_ein_variable

Copyright (C) 2003-2006 LarsGregori (Lizenz: Creative Commons)

08.06.2006 - FunktionaleProgrammiersprache, Rekursion, Scheme

Bei del.icio.us/tag/scheme  (Semantik) habe ich einen Link zum Artikel Mastering recursive programming  (Semantik) gefunden, in dem Jonathan Bartlett  (Semantik) beschreibt, wie sich Rekursion in einer imperativen Programmiersprache nutzen lässt.

Während er am Anfang ein Paar Scheme  (Semantik) und C  (Semantik) Rekursionsbeispiele aufzeigt und zum Schluss die Speicheroptimierung durch tail-call  (Semantik) aufzeigt, geht er im Mittelteil darauf ein, wie man überprüfbare und richtige Programme - mit Hilfe der Rekursion - schreibt.

Bugs gehören zum täglichen Leben eines Programmierers und sie treten sogar in kleinen Schleifen oder Funktionen auf. Der Hauptgrund liegt in der Statusänderung von Variablen. Abhängig vom Status entstehen unterschiedliche Ergebnisse, so dass sich die ganze Komplexität gar nicht überblicken lässt.

Es gibt eine Lösung, mit einer einzigen Regel: Weise einer Variable einen Wert zu und ÄNDERE SIE NIE!

Imperative, prozedurale und die OO  (Semantik) Programmierung bauen aber gerade auf die Zuweisung und Änderung von Variablen auf. Jedoch ist gerade die Statusänderung eines der Gründe für Programmierfehler.

In drei Situationen werden Variablen verändert:

  • Wiederverwenden der Variable: Wenn die selbe Variable für andere oder ähnliche Zwecke nochmals verwenden wird, und diese dann geändert wird, könnte es zur Verwirrung führen. Durch die Benutzung einer zweiten Variable kann dieses Problem umgangen werden.
  • Abhängige Änderung der Variable: Die Variable ändert oder behält ihren Wert, bedingt durch einen anderen Wert. Auch hier sollte eine neue Variable verwendet werden.
  • Schleifenvariable: Sie können durch rekursive Funktionen umgangen werden.
  • Im Artikel wird eine Beispielfunktion in eine rekursive Funktion umgewandelt und es wird auch aufgezeigt, wie sich diese rekursive Funktion auf Korrektheit überprüfen lässt.

    Zum Schluss geht Jonathan Bartlett  (Semantik) noch auf tail-recursive Funktionen ein, die den Speicherbedarf des Stacks, unabhängig von der tiefe der Aufrufe, konstant halten. Hierzu hat er ein Assembler Beispiel, jedoch erwähnt er auch, dass GCC  (Semantik) in bestimmten Konstellationen eine tail-call  (Semantik) Optimierung anwendet.

    ... je komplexer die Programme werden, um so eher bietet die rekursive Programmierung dem Programmierer eine Möglichkeit den Code so zu organisieren, dass er wartbar und logisch konsistent ist.