Der Vorteil ist, dass reine Funktionen Ihren Code leichter verständlich machen. Mit anderen Worten, Nebenwirkungen erhöhen die Komplexität Ihres Codes.
Nehmen Sie ein Beispiel für die computeProductPrice
Methode.
Ein reines Verfahren würden Sie für eine Produktmenge bitten, eine Währung, usw. Sie wissen , dass , wenn die Methode mit den gleichen Argumenten aufgerufen wird, es wird immer das gleiche Ergebnis.
- Sie können es sogar zwischenspeichern und die zwischengespeicherte Version verwenden.
- Sie können es faul machen und den Anruf auf einen Zeitpunkt verschieben, an dem Sie es tatsächlich benötigen, da Sie wissen, dass sich der Wert in der Zwischenzeit nicht ändert.
- Sie können die Methode mehrmals aufrufen, da Sie wissen, dass sie keine Nebenwirkungen hat.
- Sie können über die Methode selbst in einer Isolation von der Welt argumentieren, da Sie wissen, dass nur die Argumente benötigt werden.
Eine nicht reine Methode ist komplexer zu verwenden und zu debuggen. Da dies vom Zustand der Variablen abhängt, die keine Argumente sind und möglicherweise geändert werden, kann dies dazu führen, dass beim mehrmaligen Aufrufen unterschiedliche Ergebnisse erzielt werden oder dass nicht dasselbe Verhalten auftritt, wenn die Variablen überhaupt nicht oder zu früh oder zu spät aufgerufen werden.
Beispiel
Stellen Sie sich vor, es gibt eine Methode im Framework, die eine Zahl analysiert:
decimal math.parse(string t)
Es hat keine referenzielle Transparenz, da es von Folgendem abhängt:
Die Umgebungsvariable, die das Nummerierungssystem angibt, also Base 10 oder etwas anderes.
Die Variable in der math
Bibliothek, die die Genauigkeit der zu analysierenden Zahlen angibt. So mit dem Wert 1
, den String Parsen "12.3456"
geben 12.3
.
Die Kultur, die die erwartete Formatierung definiert. Zum Beispiel mit fr-FR
, Parsing "12.345"
geben 12345
, weil der Charakter Trennung sollte sein ,
, nicht.
Stellen Sie sich vor, wie einfach oder schwierig es wäre, mit einer solchen Methode zu arbeiten. Mit der gleichen Eingabe können Sie je nach dem Moment, in dem Sie die Methode aufrufen, radikal unterschiedliche Ergebnisse erzielen, da irgendwo die Umgebungsvariable geändert oder die Kultur gewechselt oder eine andere Genauigkeit festgelegt wurde. Der nicht deterministische Charakter der Methode würde zu mehr Bugs und mehr Debugging-Alptraum führen. Als Antwort anzurufen math.parse("12345")
und zu erhalten 5349
, da einige parallele Codes Oktalzahlen parsen, ist nicht schön.
Wie kann man diese offensichtlich kaputte Methode reparieren? Durch die Einführung referentieller Transparenz. Mit anderen Worten, indem Sie den globalen Zustand loswerden und alles an die Parameter der Methode verschieben:
decimal math.parse(string t, base=10, precision=20, culture=cultures.en_us)
Jetzt, da die Methode rein ist, wissen Sie, dass sie unabhängig vom Aufruf der Methode immer das gleiche Ergebnis für dieselben Argumente liefert.