Frage

In einer teilweise veränderlichen Klasse, ist es besser, veränderbare Felder mit seinen unveränderlich denjenigen zu mischen oder eine neuen Klasse erstellen (oder Klassen), die sie einkapseln? Hier ist ein Beispiel in C #, was ich spreche:

interface IBedroom
{
    int Volume { get; }

    string Color { get; }

    void Paint(string newColor);
}

Hier ist eine Implementierung mit gemischter Wandelbarkeit in seinen Feldern:

class MixedMutabilityBedroom : IBedroom
{
    readonly int volume;
    string color;

    public MixedMutabilityBedroom(int volume, string color = "")
    {
        this.volume = volume;
        this.color = color;
    }

    public int Volume
    {
        get { return volume; }
    }

    public string Color
    {
        get { return color; }
    }

    public void Paint(string newColor)
    {
        color = newColor;
    }
}

Und eines mit separater Wandelbarkeit:

// first, a fully mutable helper class
class RoomColor
{
    string value;

    public RoomColor(string value)
    {
        this.value = value;
    }

    public string Value
    {
        get { return value; }
    }

    public void Change(string newValue)
    {
        value = newValue;
    }
}

und die abgetrennte-Veränderlichkeit Implementierung:

class SeparatedMutabilityBedroom : IBedroom
{
    readonly int volume;
    readonly RoomColor color;

    public SeparatedMutabilityBedroom(int volume, RoomColor color)
    {
        this.volume = volume;
        this.color = color;
    }

    public int Volume
    {
        get { return volume; }
    }

    public string Color
    {
        get { return color.Value; }
    }

    public void Paint(string newColor)
    {
        color.Change(newColor);
    }
}

ich persönlich mit diesem Stil Seite. Nach meiner Erfahrung, Fehler, die von staatlicher Manipulation in konkurrierenden Szenarien entstehen, sind schwierig zu debuggen. Als Gleichzeitigkeit für Programme zur Norm wird, scheint es, dass Veränderlichkeit lokalisierende zur Verringerung des Debug-Aufwand ein wichtiger Faktor ist. Im zweiten Beispiel müssen wir die gesamte Klasse Implementierung nicht überblicken, um herauszufinden, wo Staat manipuliert wird. Die Gesamtheit der SeparatedMutabilityBedroom der Veränderlichkeit wird lokalisiert RoomColor.

Was denken Sie? Habe ich ein paar Punkte für die Prüfung vergessen?

War es hilfreich?

Lösung

Programmierung mit unveränderlichen Datenstrukturen ist eine sehr nützliche Technik, ist aber hart an einer Gesamt besten Praxis oder einen Vorschlag für ein einfaches Beispiel basierend auf Kritik. Die Entscheidung, was am besten ist, unter Berücksichtigung anderer Faktoren nehmen müssen, wie, wie diese Klasse benutzt wird und in Wechselwirkung mit.

Allerdings vorausgesetzt, Sie in einer Situation sind, die eine große Menge an Gleichzeitigkeit mit mehreren Autoren zu diesem Objekt hat, dann ein Objekt macht teilweise unveränderlich wirklich Sie viel würde nicht kaufen, da Sie noch in Probleme laufen können.

In diesem Fall entweder verwendet irgendeine Art von Synchronisierungsgrund oder ein völlig unveränderliches Objekt verwenden.

Die Antwort Gespräche über einige Techniken völlig unveränderliche Objekte zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top