Nicht sicher, ob ich hier antworten sollte, oder wir darüber besser per PM weiterquatschen. Du entscheidest.
Dein Verständnis von funktionaler Programmierung ist zwar ein wichtiger Teilaspekt, aber wenn das alles wäre, würde man hier kaum von einem Paradigma sprechen, das der imperativen Programmierung gegenübersteht.
Programme in C++ sind eine Abfolge von Befehlen. Tu dies. Dann das. Ein Programm in einer Funktionalen Sprache ist eine Sammlung von Ausdrücken, die die Form von Funktionen Annehmen. Zum Beispiel:
Das Hello World der Funktionalen Programmierung ist die Fakultätsfunktion:
Code:
(define (factorial n)
(define (iter product counter)
(if (> counter n)
product
(iter (* counter product)
(+ counter 1))))
(iter 1 1))
Man könnte sie auch in einem imperativen Stil (mit den von dir genannten lokalen Variablen) schreiben:
Code:
(define (factorial n)
(let ((product 1)
(counter 1))
(define (iter)
(if (> counter n)
product
(begin (set! product (* counter product))
(set! counter (+ counter 1))
(iter))))
(iter)))
Diese Funktion ist korrekt und gibt das selbe Ergebnis, aber es gibt einen entscheidenden Unterschied. Der Wert der Variablen
counter ändert sich während der Abarbeitung der Funktion. Wenn man die Ausdrücke vertauschen würde
Code:
(set! counter (+ counter 1))
(set! product (* counter product))
wäre die Funktion nicht mehr korrekt. Das klingt trivial, ist aber entscheidend. Jede Zuweisung hat nebenwirkungen und die subtilen Probleme, die dadurch erst möglich werden, gibt es in der funktionalen Programmierung nicht. Wenn in einem Funktionalen Programm erst Funktion A und dann Funktion B aufgerufen wird, macht es aufgrund der Freiheit von Nebenwirkungen keinen Unterschied für das Ergebnis. Bei imperativer Programmierung ist der Zeitliche Ablauf der Ausführung essentiell und muss immer bedacht werden. Das ist kein Nachteil, sondern einfach eine andere Herangehensweise an die Frage, was ein Programm überhaupt ist. Daher ist es meiner Meinung nach auch richtig, bei der Unterscheidung von imperativer und funktioneller Programmierung von unterschiedlichen Paradigmen zu sprechen.
Wie gesagt, man kann das in C++ machen, aber würde der Gewinn, den man durch Verzicht auf Zuweisungen und sonstige Grundsätze der imperativen Programmierung erhält, den Aufwand aufwiegen, den man dazu treiben muss? In begrenztem Umfang, wie du es vorgeschlagen hast, ist das sicher vernünftig, aber irgendwann kommt man dahin, sich zu verbiegen, wie ich es genannt habe. Und das ist dann nicht mehr nützlich.
Ich habe bisher noch nicht einen einzigen Einsatz von globalen Variablen gesehen, den man nicht besser ohne die Globale hätte lösen können
getopt(). Könnte man ohne globale Variablen machen. Könnte man auch völlig anders implementieren. Aber ob das am Ende besser oder schlechter ist, ist Geschmackssache. Dann fällt mir noch
errno ein.