Dies wird nicht weiter erläutert. Ich versuche eine Erklärung zu finden.
Es ist etwas, das vielen von uns innewohnt, die massive Codebasen debuggt haben, aber Sie müssen sich lange genug mit einer ausreichend großen Skala auf der Ebene der Aufseher auseinandersetzen, um dies zu würdigen. Es ist, als würde man verstehen, wie wichtig es ist, beim Poker in Position zu sein. Zunächst scheint es kein so nützlicher Vorteil zu sein, am Ende jeder Runde den letzten Platz einzunehmen, bis Sie eine Handhistorie von einer Million Händen aufzeichnen und feststellen, dass Sie in Position so viel mehr Geld gewonnen haben als aus.
Trotzdem stimme ich der Idee nicht zu, dass eine Änderung einer lokalen Variablen ein Nebeneffekt ist. Aus meiner Sicht verursacht eine Funktion keine Nebenwirkungen, wenn sie nichts außerhalb ihres Bereichs ändert, dass alles, was sie berührt und manipuliert, nichts unterhalb des Aufrufstapels oder eines Speichers oder einer Ressource beeinflusst, die die Funktion nicht selbst erworben hat .
Im Allgemeinen ist es am schwierigsten, in einer komplexen, umfangreichen Codebasis zu argumentieren, die nicht über das perfekteste Testverfahren verfügt, das man sich vorstellen kann, ein beständiges Statusmanagement, wie alle Änderungen an granularen Objekten in einer Videospielwelt, während Sie durch Dutzende von Daten waten Tausende von Funktionen, während versucht wurde, eine endlose Liste von Verdächtigen einzugrenzen, bei denen tatsächlich eine systemweite Invariante verletzt wurde ("das sollte niemals passieren, wer hat es getan?"). Wenn außerhalb einer Funktion nie etwas geändert wird, kann dies möglicherweise keine zentrale Fehlfunktion verursachen.
Dies ist natürlich nicht in allen Fällen möglich. Jede Anwendung, die eine auf einem anderen Computer gespeicherte Datenbank aktualisiert, ist von Natur aus so konzipiert, dass sie Nebenwirkungen verursacht, sowie jede Anwendung, die zum Laden und Schreiben von Dateien entwickelt wurde. Aber es gibt noch viel mehr, was wir in vielen Funktionen und Programmen ohne Nebenwirkungen tun können, wenn wir zum Beispiel über eine umfangreiche Bibliothek unveränderlicher Datenstrukturen verfügen und diese Denkweise weiter berücksichtigen.
Lustigerweise ist John Carmack auf den LISP- und Unveränderlichkeits-Zug gesprungen, obwohl er in den Tagen der am besten mikroabgestimmten C-Codierung angefangen hat. Ich habe festgestellt, dass ich etwas Ähnliches mache, obwohl ich immer noch viel C benutze. Ich denke, das ist die Natur von Pragmatikern, die jahrelang debuggt und versucht haben, komplexe, groß angelegte Systeme als Ganzes von einer Aufsebenebene aus zu betrachten. Selbst diejenigen, die überraschend robust und weitgehend fehlerfrei sind, können immer noch das unangenehme Gefühl haben, dass etwas Falsches um die Ecke lauert, wenn viele komplexe persistente Zustände unter den komplexesten miteinander verbundenen Graphen von Funktionsaufrufen geändert werden die Millionen von Codezeilen. Selbst wenn jede einzelne Schnittstelle mit einem Komponententest getestet wird und alle bestehen, gibt es '
In der Praxis finde ich oft, dass funktionale Programmierung es schwieriger macht, eine Funktion zu verstehen. Es dreht mein Gehirn immer noch in Drehungen und Knoten, besonders mit komplexer rekursiver Logik. Der gesamte intellektuelle Aufwand, der mit dem Herausfinden einiger in einer funktionalen Sprache geschriebener Funktionen verbunden ist, wird jedoch durch den eines komplexen Systems in den Schatten gestellt, bei dem persistente Zustände über Zehntausende von Funktionen hinweg geändert werden, wobei sich jede Funktion, die Nebenwirkungen verursacht, zur Gesamtsumme summiert Komplexität der Argumentation über die Richtigkeit des gesamten Systems als Ganzes.
Beachten Sie, dass Sie keine reine Funktionssprache benötigen, damit Funktionen Nebenwirkungen vermeiden. In einer Funktion geänderte lokale Zustände zählen nicht als Nebeneffekt, wie eine for
für eine Funktion lokale Schleifenzählervariable nicht als Nebeneffekt zählt. Ich schreibe heutzutage sogar C-Code mit dem Ziel, Nebenwirkungen nach Möglichkeit zu vermeiden, und habe mir eine Bibliothek unveränderlicher, threadsicherer Datenstrukturen ausgedacht, die teilweise geändert werden können, während der Rest der Daten flach kopiert wird, und es hat mir geholfen, a Sehr viel Grund zur Richtigkeit meines Systems. In diesem Sinne stimme ich dem Autor überhaupt nicht zu. Zumindest in C und C ++ in unternehmenskritischer Software kann eine Funktion dokumentieren, dass sie keine Nebenwirkungen hat, wenn sie nichts berührt, was möglicherweise die Welt außerhalb der Funktion beeinflussen könnte.