In der Informatik hat eine Funktion oder ein Ausdruck eine Nebenwirkung, wenn sie oder er einen Zustand verändert oder eine beobachtbare Wechselwirkung mit aufrufenden Funktionen oder der Außenwelt aufweist.
Aus Wikipedia - Nebeneffekt
Eine Funktion im mathematischen Sinne ist eine Abbildung von Eingabe zu Ausgabe. Durch den Aufruf einer Funktion soll die Eingabe der von ihr zurückgegebenen Ausgabe zugeordnet werden. Wenn die Funktion etwas anderes ausführt, spielt es keine Rolle, aber wenn sie ein Verhalten aufweist, bei dem die Eingabe nicht der Ausgabe zugeordnet wird, ist dieses Verhalten als Nebeneffekt bekannt.
Allgemeiner ausgedrückt ist eine Nebenwirkung jede Wirkung, die nicht die beabsichtigte Wirkung des Konstrukteurs ist.
Ein Effekt ist alles, was einen Schauspieler betrifft. Wenn ich eine Funktion aufrufe, die meiner Freundin eine Trennungstextnachricht sendet, die eine Reihe von Akteuren betrifft, mich, sie, das Netzwerk der Mobiltelefonfirma usw. Der einzige beabsichtigte Effekt beim Aufrufen einer nebenwirkungsfreien Funktion ist die Funktion um mir eine Zuordnung von meiner Eingabe zurückzugeben. So für:
public void SendBreakupTextMessage() {
Messaging.send("I'm breaking up with you!")
}
Wenn dies eine Funktion sein soll, ist das einzige, was es tun sollte, die Rückgabe für ungültig zu erklären. Wenn es nebenwirkungsfrei ist, sollte es die Textnachricht nicht wirklich senden.
In den meisten Programmiersprachen gibt es kein Konstrukt für eine mathematische Funktion. Kein Konstrukt soll als solches verwendet werden. Aus diesem Grund geben die meisten Sprachen an, dass Sie über Methoden oder Verfahren verfügen. Mit diesen sollen wesentlich mehr Effekte erzielt werden können. In der gewöhnlichen Programmiersprache kümmert sich niemand wirklich um die Absicht einer Methode oder Prozedur. Wenn also jemand sagt, dass diese Funktion Nebenwirkungen hat, bedeutet dies, dass sich dieses Konstrukt nicht wie eine mathematische Funktion verhält. Und wenn jemand sagt, dass diese Funktion frei von Nebenwirkungen ist, bedeutet dies, dass sich dieses Konstrukt effektiv wie eine mathematische Funktion verhält.
Eine reine Funktion ist per Definition immer nebenwirkungsfrei. Eine reine Funktion ist eine Art zu sagen, dass diese Funktion, obwohl sie ein Konstrukt verwendet, das mehr Effekte zulässt, nur die gleiche Wirkung hat wie eine mathematische Funktion.
Ich fordere jeden auf, mir zu sagen, wann eine nebenwirkungsfreie Funktion nicht rein wäre. Sofern der primäre beabsichtigte Effekt des Kontextes des Satzes unter Verwendung des Begriffs rein und nebenwirkungsfrei nicht der des mathematisch beabsichtigten Effekts einer Funktion ist, sind diese immer gleich.
Als solche, manchmal, wenn auch seltener, und ich glaube, dies ist die Unterscheidung, die Menschen fehlen und auch irreführen (da dies nicht die häufigste Annahme ist), in der akzeptierten Antwort, aber manchmal wird angenommen, dass die beabsichtigte Wirkung einer Programmierfunktion ist um die Eingabe der Ausgabe zuzuordnen, wobei die Eingabe nicht auf die expliziten Parameter der Funktion beschränkt ist, sondern die Ausgabe auf den expliziten Rückgabewert beschränkt ist. Wenn Sie davon ausgehen, dass dies der beabsichtigte Effekt ist, ist eine Funktion, die eine Datei liest und basierend auf dem Inhalt der Datei ein anderes Ergebnis zurückgibt, immer noch nebenwirkungsfrei, da Sie Eingaben von anderen Stellen in Ihrem beabsichtigten Effekt zugelassen haben.
Warum ist das alles so wichtig?
Es geht darum, alles zu kontrollieren und zu behalten. Wenn Sie eine Funktion aufrufen und sie etwas anderes ausführt, als einen Wert zurückzugeben, ist es schwierig, ein Urteil über ihr Verhalten zu fällen. Sie müssen in der Funktion nach dem tatsächlichen Code suchen, um zu erraten, was er tut, und um seine Richtigkeit zu bestätigen. Die ideale Situation ist, dass es sehr klar und einfach ist, zu wissen, welche Eingabe die Funktion verwendet, und dass sie nichts anderes tut, als eine Ausgabe dafür zurückzugeben. Sie können sich ein wenig entspannen und sagen, dass es nicht so hilfreich ist, genau zu wissen, welche Eingabe verwendet wird, als sicher zu sein, dass sie nichts anderes tut, von dem Sie vielleicht nichts wissen, als einen Wert zurückzugeben. Vielleicht geben Sie sich also nur mit der Durchsetzung zufrieden dass es nichts anderes tut, als Eingaben abzubilden, egal woher es kommt, um sie auszugeben.
In fast allen Fällen besteht der Sinn eines Programms darin, andere Effekte zu erzielen, als Dinge, die hereinkommen, auf Dinge, die herauskommen, abzubilden. Die Idee, den Nebeneffekt zu kontrollieren, besteht darin, dass Sie Code auf eine Weise organisieren können, die verständlicher und verständlicher ist. Wenn Sie alle Nebenwirkungen an einem Ort zusammenfassen, der sehr explizit und zentral ist, ist es leicht zu wissen, wo Sie suchen und darauf vertrauen können, dass dies alles ist, was passiert, und nicht mehr. Wenn die Eingabe auch sehr eindeutig ist, können Sie das Verhalten für verschiedene Eingaben testen und es ist einfacher zu verwenden, da Sie die Eingabe nicht an vielen verschiedenen Stellen ändern müssen, von denen einige möglicherweise nicht offensichtlich sind um zu bekommen was du willst.
Da das Verständnis, die Vernunft und die Kontrolle des Verhaltens eines Programms am hilfreichsten ist, wenn alle Eingaben klar und eindeutig gruppiert sind und alle Nebenwirkungen klar und eindeutig zusammengefasst sind, wird in der Regel darüber gesprochen Nebenwirkung, pur usw.
Da die Gruppierung der Nebenwirkungen und ihre Aussagekraft am hilfreichsten sind, wird dies manchmal nur gemeint sein und dadurch unterschieden, dass es nicht rein ist, aber dennoch frei von "Nebenwirkungen". Die Nebenwirkung ist jedoch relativ zur angenommenen "beabsichtigten primären Wirkung", es handelt sich also um einen Kontextbegriff. Dies wird, wie ich finde, seltener verwendet, obwohl in diesem Thread überraschenderweise viel darüber gesprochen wird.
Schließlich bedeutet idempotent, dass das mehrmalige Aufrufen dieser Funktion mit denselben Eingaben (egal woher sie kommen) immer dieselben Effekte zur Folge hat (Nebeneffekt oder nicht).