Ich schreibe Code in einem funktionalen Stil in C#. Viele meiner Klassen sind unveränderbar mit Methoden zum Zurückgeben einer modifizierten Kopie einer Instanz.Universal unveränderliche Klassen in C#
Zum Beispiel:
sealed class A
{
readonly X x;
readonly Y y;
public class A(X x, Y y)
{
this.x = x;
this.y = y;
}
public A SetX(X nextX)
{
return new A(nextX, y);
}
public A SetY(Y nextY)
{
return new A(x, nextY);
}
}
Dies ist ein triviales Beispiel, aber vorstellen, eine viel größere Klasse, mit vielen weiteren Mitgliedern.
Das Problem ist, dass das Erstellen dieser modifizierten Kopien sehr ausführlich ist. Die meisten Methoden ändern nur einen Wert, aber ich muss alle der unveränderten Werte in den Konstruktor übergeben.
Gibt es ein Muster oder eine Technik, um all diese Kesselplatte zu vermeiden, wenn unveränderliche Klassen mit Modifikatormethoden konstruiert werden?
Hinweis: Ich möchte kein struct
für reasons discussed elsewhere on this site verwenden.
Update: Ich habe festgestellt, dass dies in F # ein "Kopieren und Aktualisieren von Datensatzausdruck" genannt wird.
Ich würde die Notwendigkeit fragen, diese "Setter" zu haben, wie Sie sie für alles geschrieben haben. Wirklich sollten Sie komplexe Operationen auf dem Typ durchführen, nicht nur einen Wert willkürlich "setzen". Für ein gewöhnliches Paar braucht es nichts anderes als einen Konstruktor. – Servy
@Servy Dies ist eine Einschränkung des Beispiels. Die meisten Modifikatoren sind komplexer oder aufgabenspezifisch. Bitte stell dir vor, ich hätte ein besseres Beispiel gegeben :) – sdgfsdh
Ja. Verwende F #. Ernsthaft jetzt. C# ist in erster Linie eine Stateful OOP-Sprache. Obwohl es einige funktionale Merkmale hat, ist es weit davon entfernt, eine gute funktionale Sprache zu sein. – Euphoric