Frage

Ich mag das Konzept Unveränderlichkeit aber manchmal frage ich mich, wenn eine Anwendung nicht, dass sie parallel zu verstehen ist, sollte man die Dinge unveränderlich vermeiden?

Wenn eine Anwendung nicht multi-threaded ist, werden Sie nicht von gemeinsam genutzten Zustand Problemen geplagt, nicht wahr?

Oder ist Unveränderlichkeit ein Konzept, wie OOP, die Sie entweder den ganzen Weg oder nicht verwenden? Ohne Berücksichtigung der Fälle, wenn etwas nicht unveränderlich auf Gebrauch / Leistung basieren, etc.

Ich bin mit dieser Frage konfrontiert, wenn eine Anwendung für mich zu schreiben, dass mäßig groß ist (vielleicht wie 1-2k Linien).

War es hilfreich?

Lösung

Ich liebe Unveränderlichkeit, weil es bedeutet, dass ich andere Völker Code nicht nicht zu verwirren vertrauen müssen, um mit Objekten Ich erwarte, dass das gleiche bleiben.

Wenn Sie ein Objekt übergeben an eine andere Komponente, wie ein List<T> ab, Sie sind auf Gedeih und Verderb von dem, was diese Komponente tut. Dies ist besonders wichtig, wenn Sie Sammlungen als Eigenschaften zurückzukehren.

public class Foo { 
  private List<Bar> _barList;
  public ICollection<Bar> BarList { get return _barList; } 
}

Es gibt nichts, einen Verbraucher dieser Klasse von Löschen der Sammlung aus unter mir zu stoppen. Auch Umschalten der Rückgabetyp ist IEnumerable<Bar> nicht ganz sicher. Es gibt nichts, irgendein Stück schlecht geschriebenen Code aus Gießen dieses wieder stoppen List<T> und ruft .Clear ().

Allerdings, wenn ich wirklich die Sammlung will konsequent bleiben ich es als followis umschreiben könnte

public class Foo {
  private ImmutableCollection<Bar> _barList;
  public ImmutableCollection<Bar> BarList { get { return _barList; } }
}

Jetzt bin ich sicher vor, die anderen Code zu vertrauen, von der Verwendung falsch meine Klasse. Sie können es nicht vermasseln.

Andere Tipps

Ich mag den Vorteil von Unveränderlichkeit, dass Sie sie brauchen nur einmal zu überprüfen - bei der Erstellung des Objekts. Das ist ein großer Bonus tatsächlich.

Ein großer Vorteil der Unveränderlichkeit ist, dass man braucht nicht das Eigentum an unveränderlichen Objekte zu verfolgen. Sie existieren nur so lange, wie jeder braucht sie, und dann verschwinden ins Nichts, wenn sie nicht mehr benötigt werden. Während eines Garbage-Collector in vielen Fällen unter Verwendung bedeutet es nicht notwendig ist, alle ausdrücklich Code mit dem Eigentum an veränderbaren Objekten (die größte Ausnahme diejenigen, die IDisposable implementieren ist) zu tun zu schreiben, in vielen Fällen ist es sehr schwierig, um ein korrekten Code, in dem Objekt zu schreiben, haben wandelbar Staat keinen haben klar definierte „Besitzer“. Verwirrung darüber, wer den Zustand der veränderbaren Objekte besitzt eine sehr häufige Fehlerquelle sein kann; wenn unveränderliche Objekte mit (abgesehen von ein paar, die IDisposable implementieren) eine im Allgemeinen Eigentumsfragen ignorieren können.

Ein weiterer Punkt ist, dass es viel einfacher ist, einen veränderbaren Verweis auf ein semantisch unveränderliches Objekt oder einen unveränderlichen Bezugs auf ein veränderbares Objekt zur Vernunft zu, als sie einen veränderbaren Verweises auf ein veränderbares Objekt zur Vernunft geht. Wenn man einen veränderbare Übertragung auf ein veränderbaren Objekte hat, kann es oft unklar, ob der richtige Ansatz Zustand der Aktualisierung ist einfach direkt das Objekt mutieren, oder kopieren Sie den Zustand auf ein neues Objekt, mutiert, dass, und die Referenz zu aktualisieren. In einigen Fällen wird es Umstände geben, jede Art von Operation erforderlich ist (wie bei List<T>, die manchmal ein Array mit einem größeren ersetzt, aber in der Regel tut Updates in-place), aber ein solcher Ansatz funktioniert nur, wenn die Art ausschließliche Kontrolle unterhält über die veränderbaren Objekte in Frage. Es ist oft hilfreich, um entweder einen unveränderlichen Bezug auf einen veränderbaren Typen hat (in diesem Fall Code mit dem Referenz aussetzen kann, möglicherweise durch einen Nur-Lese-Wrapper, auf andere Objekte, die eine „Live-Ansicht“ ihren Staates wollen) oder auch eine haben wandelbar Verweis auf ein Objekt, das minimal ist, wird niemals während der Laufzeit der Referenz mutiert werden.

unveränderlich oder,
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top