Was ist ein Nebeneffekt?

87

Ich habe das Konzept der Nebenwirkung nicht klar verstanden.

  • Was ist ein Nebeneffekt bei der Programmierung?
  • Ist es programmiersprachenabhängig?
  • Gibt es äußere und innere Nebenwirkungen?

Bitte geben Sie ein Beispiel für Ursachen, die Nebenwirkungen hervorrufen.

Amir Rezaei
quelle
7
Klingt sehr nach Hausaufgaben.
gnasher729
3
@ gnasher729 wen interessiert das ist unglaublich nützlich :)
Charlie Parker

Antworten:

108

Ein Nebeneffekt bezieht sich einfach auf die Änderung eines Zustands - zum Beispiel:

  • Wert einer Variablen ändern;
  • Einige Daten auf die Festplatte schreiben;
  • Aktivieren oder Deaktivieren einer Schaltfläche in der Benutzeroberfläche.

Im Gegensatz zu dem, was manche Leute zu sagen scheinen:

  • Ein Nebeneffekt muss nicht verborgen oder unerwartet sein (es kann sein, aber das hat nichts mit der Definition zu tun, wie sie für die Informatik gilt);

  • Ein Nebeneffekt hat nichts mit Idempotenz zu tun. Eine idempotente Funktion kann Nebenwirkungen haben, und eine nicht idempotente Funktion kann keine Nebenwirkungen haben (z. B. das Abrufen des aktuellen Systemdatums und der aktuellen Systemzeit).

Es ist wirklich sehr einfach. Nebeneffekt = irgendwo etwas ändern.

PS Wie Kommentator Benjamin betont, können mehrere Personen die Definition einer Nebenwirkung mit der Definition einer reinen Funktion in Konflikt bringen. Diese Funktion ist (a) idempotent und (b) hat keine Nebenwirkungen. Das eine impliziert das andere in der allgemeinen Informatik nicht, aber funktionale Programmiersprachen tendieren typischerweise dazu, beide Einschränkungen durchzusetzen.

Aaronaught
quelle
38
Der Ausdruck "Nebeneffekt" lässt es so klingen, als würde etwas anderes geändert, als beabsichtigt. In der Medizin hat ein Medikament die Hauptwirkung, Schmerzen zu lindern, und manchmal die Nebenwirkung, Nasenbluten, Schwindel usw. zu verursachen. Der Zweck des Medikaments besteht nicht darin, Nasenbluten zu verursachen, sondern manchmal geschieht dies als unbeabsichtigtes zusätzliches Ergebnis.
FrustratedWithFormsDesigner
15
@Frustriert: +1. Wann immer ich diesen Begriff sehe, frage ich mich, ob er nicht von FP-Befürwortern gewählt wurde, um genau diese subtil finstere Konnotation zu erzeugen.
Mason Wheeler
6
@Mason Wheeler. Es existierte lange vor FP. Und es ist keine subtil finstere Konnotation. Es ist absolut böse und war es schon immer. In den drei Jahrzehnten, in denen ich programmiert habe, hat die "Crypto-Assignment" -Anweisung - der Nebeneffekt - die Menschen beunruhigt. Eine einfache alte Zuweisungsanweisung ist viel einfacher zu handhaben.
S.Lott
7
@Mason Wheeler: In C ++a. Sieht nicht nach Aufgabe aus. b = ++a;hat zwei Nebenwirkungen. Das Offensichtliche und die Krypto-Zuordnung von a. So etwas ist ein Nebeneffekt, der (für manche) wünschenswert ist. Wurde aber als Nebeneffekt für meine gesamte Karriere bezeichnet, um es nicht subtil zu machen.
S.Lott
5
@ Zachary, bitte lesen Sie den letzten Aufzählungspunkt in meiner Antwort. Was Sie meinen, ist idempotentes Verhalten (oder das Fehlen davon). Das sagt nichts über Nebenwirkungen aus. Das Überprüfen der Systemuhr ist kein Nebeneffekt. In der Tat ist jede Funktion oder Methode, der das Wort "get" vorangestellt ist, eine, von der Sie vernünftigerweise erwarten sollten, dass sie keine Nebenwirkungen hat.
Aaronaught
36

Jede Operation, die den Zustand des Computers verändert oder mit der Außenwelt interagiert, soll einen Nebeneffekt haben. Siehe Wikipedia zu Nebenwirkungen .

Diese Funktion hat beispielsweise keine Nebenwirkungen. Das Ergebnis hängt nur von den Eingabeargumenten ab und es ändert sich nichts am Status des Programms oder seiner Umgebung, wenn es aufgerufen wird:

int square(int x) { return x * x; }

Im Gegensatz dazu erhalten Sie beim Aufrufen dieser Funktionen je nach der Reihenfolge, in der Sie sie aufrufen, unterschiedliche Ergebnisse, da sie etwas am Status des Computers ändern:

int n = 0;
int next_n() { return n++; }
void set_n(int newN) { n = newN; }      

Diese Funktion hat den Nebeneffekt, dass Daten in die Ausgabe geschrieben werden. Sie rufen die Funktion nicht auf, weil Sie ihren Rückgabewert wollen. Sie nennen es, weil Sie die Wirkung haben möchten, die es auf die "Außenwelt" hat:

int Write(const char* s) { return printf("Output: %s\n", s); }
Kristopher Johnson
quelle
1
Dies ist eine gute Definition, aber ich bin nicht verrückt nach der Ausarbeitung - genau wie in Thorbjørns Antwort scheint ein Teil davon das Problem der Nebenwirkungen mit dem der idempotenten Funktionen zu verbinden; Wie Ihr WriteBeispiel zeigt, bedeutet das Vorhandensein von Nebenwirkungen nicht, dass die Funktion ihre Ausgabe in Bezug auf ihre Eingaben ändert oder dass ihre Ausgabe überhaupt von der Eingabe abhängt.
Aaronaught
6
Es geht nicht darum, idempotent zu sein. Die Tatsache, dass es Output produziert, bedeutet, dass es eine Nebenwirkung hat.
Kristopher Johnson
In einigen Systemen kann das Aufrufen square(x)dazu führen, dass das Modul, in dem die Funktion definiert ist, von der Festplatte geladen wird. Sollte dies als Nebenwirkung angesehen werden? Immerhin ist dies Männer, dass der (erste) Aufruf unerwartet lange dauert, die RAM-Auslastung steigt usw.
Hagen von Eitzen
1
@HagenvonEitzen Bei jeder Operation wird der Status des Computers geändert (CPU-Register, Speicher, Stromverbrauch, Wärme usw.). "Nebeneffekt" bezieht sich normalerweise auf eine imaginäre idealisierte Ausführungsumgebung, in der sich nichts an dieser Umgebung ändert, es sei denn, das Programm ändert dies ausdrücklich. Wenn Sie jedoch anrufen, square(x) weil Sie möchten, dass sich der Status des externen Computers ändert, können Sie dies als Nebeneffekt betrachten.
Kristopher Johnson
Für mich macht die erste Illustration durchaus Sinn. Das zweite ist jedoch weniger. Ich glaube, Nebenwirkungen sollten in Bezug auf eine bestimmte Umgebung / einen bestimmten Umfang definiert werden. Wenn Sie das gesamte Universum betrachten, gibt es keine Nebenwirkungen. Auch wenn Sie es auf den Computer beschränken, wirkt sich Ihre Funktion auf andere Prozesse aus, da sich die CPU nicht gleich verhält. Wenn Sie den Bereich auf Dinge beschränken, auf die in einem lokalen Funktionsbereich zugegriffen werden kann, haben wir etwas zu besprechen.
Funkt7
20

Ich denke, dass die vorhandenen Antworten ziemlich gut sind. Ich möchte auf einige Aspekte eingehen, auf die die IMO nicht genug Wert gelegt hat.

In der Mathematik ist eine Funktion nur eine Abbildung von einem Tupel von Werten auf einen Wert. Wenn Sie also eine Funktion fund einen Wert angeben x, erhalten Sie f(x)immer das gleiche Ergebnis y. Sie können auch ersetzen f(x)mit yüberall in einem Ausdruck und wird sich nichts ändern.

Was in vielen Programmiersprachen als Funktion (oder Prozedur) bezeichnet wird, ist ein Konstrukt (Stück Code), das ausgeführt werden kann, weil:

  1. Sie berechnet eine Funktion im mathematischen Sinne, dh sie liefert bei gegebenen Eingabewerten ein Ergebnis, oder
  2. Es erzeugt einen Effekt, zB druckt etwas auf den Bildschirm, ändert einen Wert in einer Datenbank, startet Raketen, wartet 10 Sekunden und sendet eine SMS.

Effekte können sich also auf den Zustand beziehen, aber auch auf andere Aspekte wie das Abfeuern einer Rakete oder das Unterbrechen der Ausführung für einige Sekunden.

Der Begriff Nebenwirkung mag negativ klingen, aber normalerweise ist die Wirkung des Aufrufs einer Funktion der eigentliche Zweck der Funktion. Ich nehme an, da der Begriff Funktion ursprünglich in der Mathematik verwendet wurde, wird das Berechnen eines Werts als der primäre Effekt einer Funktion angesehen, während alle anderen Effekte als Nebenwirkungen betrachtet werden . Einige Programmiersprachen verwenden den Begriff Prozedur , um Verwechslungen mit Funktionen im mathematischen Sinne zu vermeiden.

Beachten Sie, dass

  1. Einige Verfahren sind sowohl für ihren Rückgabewert als auch für ihre Nebenwirkung nützlich.
  2. Einige Prozeduren berechnen nur einen Ergebniswert und haben keine anderen Auswirkungen. Sie werden oft reine Funktionen genannt, weil sie lediglich eine Funktion im mathematischen Sinne berechnen.
  3. Einige Prozeduren, z. B. sleep()in Python, sind nur für ihre (Nebenwirkungen) nützlich. Diese werden häufig als Funktionen modelliert, die einen speziellen Wert zurückgeben None, oder unitoder ()oder ..., der lediglich angibt, dass die Berechnung korrekt beendet wurde.
Giorgio
quelle
2
Meiner bescheidenen Meinung nach sollte dies die akzeptierte Antwort sein. Das Konzept eines Nebeneffekts ist nur in Bezug auf mathematische Funktionen sinnvoll. Mit einer Prozedur können Sie einfach eine Reihe von Anweisungen strukturiert gruppieren und gleichzeitig bequem von überall zu dieser Gruppe und zurück springen. Es gibt keinen primären beabsichtigten Effekt und keine Nebeneffekte. Sie könnten vielleicht sagen, dass das Auslösen einer Ausnahme ein Nebeneffekt einer Prozedur ist, da dies die Absicht der Prozedur bricht, Sie dorthin zurückzubringen, wo Sie aufgehört haben, und die Ausführung dort fortzusetzen.
Didier A.
4

Ein Nebeneffekt ist, wenn eine Operation eine Auswirkung auf eine Variable / ein Objekt hat, die / das außerhalb der beabsichtigten Verwendung liegt.

Dies kann passieren, wenn Sie eine komplexe Funktion aufrufen, die nebenbei eine globale Variable ändert, obwohl Sie sie nicht aus diesem Grund aufgerufen haben (vielleicht haben Sie sie aufgerufen, um etwas aus einer Datenbank zu extrahieren).

Ich gebe zu, dass ich Probleme habe, ein einfaches Beispiel zu finden, das nicht völlig durchdacht aussieht, und Beispiele von Dingen, an denen ich gearbeitet habe, sind viel zu lang, um sie hier zu posten (und da es arbeitsbezogen ist, sollte ich es wahrscheinlich auch nicht tun ).

Ein Beispiel, das ich (vor einiger Zeit) gesehen habe, war eine Funktion, die eine Datenbankverbindung öffnete, wenn die Verbindung geschlossen war. Das Problem bestand darin, dass die Verbindung am Ende der Funktion getrennt werden sollte, der Entwickler jedoch vergaß, diesen Code hinzuzufügen. Hier gab es also einen unbeabsichtigten Nebeneffekt: Der Aufruf einer Prozedur sollte nur eine Abfrage ausführen, und der Nebeneffekt war, dass die Verbindung offen blieb. Wenn die Funktion zweimal hintereinander aufgerufen wurde, wurde ein Fehler ausgegeben, der besagte, dass die Verbindung aktiv war bereits geöffnet.


Ok, da jetzt alle Beispiele geben, denke ich, werde ich auch;)

/*code is PL/SQL-styled pseudo-code because that's what's on my mind right now*/

g_some_global int := 0; --define a globally accessible variable somewhere.

function do_task_x(in_a in number) is
begin
    b := calculate_magic(in_a);
    if b mod 2 == 0 then
        g_some_global := g_some_global + b;
    end if;
    return (b * 2.3);
end;

Die Funktion do_task_xhat eine primäre Wirkung das Ergebnis einiger Berechnungen zurückkehrt, und einen Nebeneffekt von möglicherweise eine globale Variable zu verändern.

Natürlich, welches ist das primäre und das ist die Nebenwirkung Interpretation offen sein könnte und der tatsächlichen Nutzung abhängen könnte. Wenn ich diese Funktion aufrufen zu dem Zweck , die globale modifizieren und ich verwerfen den Wert zurück , als ich würde sagen , dass die globale Modifikation der Primäreffekt ist.

FrustratedWithFormsDesigner
quelle
2
Ich denke nicht, dass dies eine gute universelle Definition ist. Viele Programmierer verwenden Konstrukte absichtlich speziell für ihre Nebenwirkungen.
CB Bailey
@ Charles: Fair genug. Wie würden Sie es in diesem Fall definieren?
FrustratedWithFormsDesigner
2
Ich denke, dass @KristopherJohnson die klarste Definition hat. Alles, was diesen Zustand des Programms oder seiner Umgebung verändert oder einen realen Effekt erzeugt, wie z. B. das Erzeugen von Ausgabe.
CB Bailey
@ Charles Bailey: Das ändert nichts an der Definition. Dinge für den Nebeneffekt zu benutzen ist in Ordnung. Solange Sie verstehen, dass es eine Nebenwirkung gibt. Es ändert nichts an dieser Definition.
S.Lott
1
@SLott: Die Definition in dieser Antwort (dh der erste Absatz) enthält die Klausel: "außerhalb der beabsichtigten Verwendung". Ich denke, dass mein Kommentar fair war.
CB Bailey
3

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).

Didier A.
quelle
Ich denke, ein großes Problem bei der Erklärung von Nebenwirkungen ist, dass es sehr schwer sein kann, über nebenwirkungsfreies (fast!) Programmieren nachzudenken, bis Sie eine Sprache wie Ocaml oder Haskell verwendet haben.
Jamie Strauss
2

Bei der Programmierung ist ein Nebeneffekt, wenn eine Prozedur eine Variable von außerhalb ihres Gültigkeitsbereichs ändert. Nebenwirkungen sind nicht sprachabhängig. Es gibt einige Klassen von Sprachen, die darauf abzielen, Nebenwirkungen zu beseitigen (reine Funktionssprachen), aber ich bin mir nicht sicher, ob es Nebenwirkungen gibt, aber ich könnte mich irren.

Soweit ich weiß, gibt es keine internen und externen Nebenwirkungen.

indyK1ng
quelle
Um genauer zu sein, trennen reine funktionale Sprachen nebenwirkungsfreien Code klar von anderem Code, wohingegen andere Sprachen keinen Mechanismus zur Unterscheidung zwischen reinem und unreinem Code haben. Die meisten Programme müssen Nebenwirkungen haben, um von Nutzen zu sein.
Giorgio
Ich denke, dass einige der Pre-Gui-Programmiersprachen wie MS-BASIC und QBasic einer Sprache, die nur Nebenwirkungen bietet, so nahe gekommen sein könnten, wie Sie nur können. Und ja, Sie können sowohl interne als auch externe Nebenwirkungen haben.
James K
0

Hier ist ein einfaches Beispiel:

int _totalWrites;
void Write(string message)
{
    // Invoking this function has the side effect of 
    // incrementing the value of _totalWrites.
    _totalWrites++;
    Debug.Write(message);
}

Die Definition von Nebenwirkungen ist nicht programmspezifisch. Stellen Sie sich einfach die Nebenwirkungen Ihrer Medikamente vor oder essen Sie zu viel.

ChaosPandion
quelle
Wenn jedoch eine Nachricht als Referenz eingeht und Sie die Nachricht in Ihrer Methode ändern, ist dies möglicherweise ein Nebeneffekt. Hab ich recht?
Amir Rezaei
Die Tatsache, dass der Ausdruck x++die Variable ändert, xwird häufig als Nebeneffekt angesehen. Dieser Wert des Ausdrucks ist der Vorinkrementierungswert von x; Dies ist der nebenwirkungsfreie Teil des Ausdrucks.
CB Bailey
@ Charles - ich stimme zu, obwohl das ursprüngliche Beispiel nicht so klar war wie das aktuelle.
ChaosPandion
@Amir - Nun, das hängt wirklich von der Sprache ab. Wenn dies C # wäre, würde dies nicht als Nebenwirkung angesehen.
ChaosPandion
@ChaosPandion: Ich persönlich bin anderer Meinung. Das ursprüngliche Beispiel war viel einfacher und klarer.
CB Bailey
-2

Ein Nebeneffekt sind Dinge, die in Code vorkommen, die nicht offensichtlich sind.

Nehmen wir zum Beispiel an, Sie haben diese Klasse

public class ContrivedRandomGenerator {
   public int Seed { get; set; }

   public int GetRandomValue()
   {
      Random(Seed);
      Seed++;
   }
}

Wenn Sie die Klasse zum ersten Mal erstellen, geben Sie ihr einen Startwert.

var randomGenerator = new ContrivedRandomGenerator();
randomGenerator.Seed = 15;
randomGenerator.GetRandomValue();

Sie kennen die Interna nicht, Sie erwarten nur einen zufälligen Wert und Sie würden erwarten, dass der randomGenerator.Seed immer noch 15 ist ... aber es ist nicht.

Der Funktionsaufruf hatte den Nebeneffekt, dass der Seed-Wert geändert wurde.

CaffGeek
quelle
10
Nebenwirkungen müssen nicht verborgen bleiben. Sie denken an umgangssprachliche oder medizinische Verwendung; Bei der Programmierung bezieht sich ein Nebeneffekt lediglich auf das Ändern eines Zustands.
Aaronaught
1
Das Drucken auf der Konsole ist ein Nebeneffekt. Es ist nicht verborgen. Aus Wikipedia : "In der Informatik hat eine Funktion oder ein Ausdruck eine Nebenwirkung, wenn sie nicht nur einen Wert zurückgibt, sondern auch einen bestimmten Zustand ändert oder eine beobachtbare Wechselwirkung mit aufrufenden Funktionen oder der Außenwelt aufweist ."
Nebenwirkungen sind, wie nicht Funktionen (dh Verfahren) jede Arbeit erledigen. X = 1; X = Y (10) sind zwei reine Funktionen. Wenn Sie sich aus dem Bereich "x = was auch immer" entfernen, können Sie die Ausgabe in das Bildschirmlaufwerk schreiben oder die Eingabe außerhalb des Formats "x = y" lesen oder einfach den Wert einer Variablen von einer Sache in eine andere ändern Es ist ein Nebeneffekt.
James K
Ich denke, dass mit "versteckt" nicht offensichtlich gemeint ist. Wie in x = f (y, z) kann angenommen werden, dass x auf y und z basiert. Während proc (x, y, z) nichts darüber aussagt, was los ist. Jede Variable kann geändert werden oder keine. Proc könnte ein Analogon zu f sein oder in keinerlei Beziehung stehen. Eine reine Funktion hat eine einzige Antwort: 'x'. Gehen Sie darüber hinaus, es ist ein Nebeneffekt. Ganz beabsichtigt, aber Nebenwirkungen.
James K
Um 0 zu verstehen, müssen Sie zuerst 1 verstehen: Um Nebenwirkungen zu verstehen, müssen Sie zuerst Funktionen verstehen.
James K