2010-05-07 19 views
22

Ist die folgende Methode rein? Ich würde es so sagen, da sich die aktuelle Klasse sowieso nicht ändert, also kann alles, was wir jetzt in der Klasse "sehen" können, bevor diese Methode ausgeführt wird, immer noch genauso sein. Hab ich recht?Frage über [Pure] Methoden

class Set { 
    ... 
    public ISet<T> UnionWith(ISet<T> set) { 
     ISet<T> unionSet = ... 

     foreach (Element element in this) { 
      unionSet.Add(element); 
     } 

     foreach (Element element in set) { 
      unionSet.Add(element); 
     } 

     return unionSet; 
    } 
} 
+0

Vielleicht suchen Sie den Begriff * idempotent *? –

+0

Hmmm ... nicht wirklich. –

+0

Beachten Sie, dass (konzeptionell) es wichtig ist, Ihre Abstraktionsebene zu berücksichtigen, wenn Sie denken, dass eine Funktion rein ist. Es ist in der Tat rein objektbezogen, weil es den Zustand eines vorhandenen Objekts (außer dem neuen) nicht ändert, aber es ist nicht rein systemweise - es weist Speicher zu, so dass es den Zustand des Systems ändert. – Kos

Antwort

31

Wenn von [Pure] Sie mit dem Pure Attribute von System.Diagnostics.Contracts markiert bedeuten, die Dokumentation sagt:

Reine Methoden machen keine sichtbaren Zustandsänderungen.

Da Ihre Methode erscheint alle sichtbaren Zustandsänderungen nicht machen (das heißt keine Nebenwirkungen), wäre es für das [Pure] Attribut qualifizieren.

+1

Gibt es irgendeine Definition von "rein", zu der seine Methode überhaupt nicht passt? Soweit ich sehen kann, ist es auch mathematisch rein - es wird immer die gleiche Ausgabe bei der gleichen Eingabe ("das zählt als Eingabe") erzeugen, und es wird den Zustand des Gesamtsystems in keiner Weise verändern. –

+1

Pavel: Einige Definitionen von "rein" erfordern, dass die Eingaben unveränderlich sind. Stellen Sie sich eine Wrapper-Funktion vor, die eine Eingabefunktion memitiert, wenn sie rein ist. Wenn das Set sich ändern kann, ohne dass der Wrapper davon weiß, könnte man sagen, dass UnionWith nicht "rein genug" ist, um mit einem Wrapper zu memotieren. – Gabe

+0

Es gab in dem Moment, in dem ich die Frage gestellt habe, eine Antwort, die besagt, dass dies nicht der Fall war, indem ich eine andere, reinere Definition verwende, die aus C# 's Code Contracts stammt. Aber der Autor hat es später gelöscht. Die Idee war, dass wenn Sie zu verschiedenen Zeiten das gleiche ISet an meine Klasse übergeben, da die Elemente meiner Klasse zu verschiedenen Zeiten unterschiedlich sind, Sie unterschiedliche Ausgaben erhalten, so dass Ihre Funktion nicht rein ist. http://en.wikipedia.org/wiki/Pure_function –