Funktionale Programmierung: Side Effects

7

Die meisten Tutorials / Artikel / Bücher sprechen über Nebenwirkungen bei der Präsentation der funktionalen Programmierung. Nimm diesen Python-Code:

%Vor%

Der Text sagt, dass die obige Funktion lokale Nebenwirkungen hat, und ich verstehe das nicht. Ich sehe, dass sich die Variable "k" ändert, ich verstehe nicht, was schlecht daraus wird.

Kann jemand bitte ein klares Beispiel für eine schlechte Nebenwirkung geben und wie es durch funktionale Programmierung vermieden wird?

    
blackened 21.03.2011, 18:23
quelle

2 Antworten

16

Der Text, auf den Sie sich beziehen, ist richtig. Das Ändern einer lokalen Variable wird als Nebeneffekt betrachtet.

Es heißt nicht, dass dies notwendigerweise eine schlechte Sache ist. Es ist einfach keine funktionale Programmierung. In reinen funktionalen Programmiersprachen würde man die Schleife rekursiv schreiben, ohne Variablen ändern zu müssen.

Das Schreiben von Funktionen wie diesen (die keine beobachtbaren Nebenwirkungen haben) ist in jeder Sprache eine gute Übung, es ist einfach keine funktionale Programmierung.

Edit: Jetzt sehe ich Ihre Bemerkung über "schlechte" Nebenwirkungen. Ich würde nicht sagen, dass Nebenwirkungen schlecht sind. In den meisten Mainstream-Sprachen ist es schwierig, ohne sie zu programmieren, und ich denke, dass viele Programmierer in Bezug auf Nebenwirkungen denken. Aber in großen Softwareprojekten kann es zu einem miserablen Leben führen, wenn man sich zu sehr auf Nebenwirkungen verlässt. Hier ist ein schönes Beispiel für Singletons (der ultimative Weg, um Nebenwirkungen zu verursachen)

In einer Sprache, die Nebenwirkungen verbietet, gibt es weniger Überraschungen für Sie als Programmierer, aber auch für den Compiler. Reiner funktionaler Code ist einfacher zu analysieren und zu paralellisieren und ist zumindest theoretisch leichter vom Compiler zu optimieren.

    
user180326 21.03.2011 18:41
quelle
3

Nebenwirkungen (insbesondere keine referenzielle Transparenz) machen das Das Ergebnis Ihres Codes hängt von der Reihenfolge der Ausführung der Anweisungen ab . Daher könnte eine Änderung in der Reihenfolge, in der ein Paar Funktionsaufrufe aufgerufen wird, möglicherweise das Verhalten in einem getrennten Bereich Ihres Programms ändern. Dies liegt daran, dass sie aufgrund der gegenseitigen Aufteilung der Nebenwirkungen nicht wirklich getrennt waren.

Dies macht die Dekomposition Ihres Programms schwierig zu plausibel, frustrierende Versuche, Ihren bestehenden Code mit neuem Code zu verfassen oder die Funktionalität irgendeines Teils Ihres Codes anderweitig zu isolieren und zu trennen. Mit anderen Worten, Nebenwirkungen sind wie Rigor Mortis Kleber, der auf alles verschüttet und es zu einem undurchdringlichen monolithischen Spaghetti macht. Versuchen Sie, eine Nudel herauszuziehen, ohne eine Störung der meisten anderen Nudeln zu verursachen.

    
Shelby Moore III 08.12.2011 01:27
quelle

Tags und Links