Pregunta

En una clase parcialmente mutable, ¿es mejor mezclar campos variables con sus queridos inmutables, o crear una nueva clase (o clases) que les encapsular? He aquí un ejemplo en C # de lo que estoy hablando:

interface IBedroom
{
    int Volume { get; }

    string Color { get; }

    void Paint(string newColor);
}

Esta es una implementación mixta con la mutabilidad en sus campos:

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;
    }
}

Y una con la mutabilidad separada:

// 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;
    }
}

y la ejecución-mutabilidad separados:

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);
    }
}

Yo personalmente del lado de este último estilo. En mi experiencia, los errores que surgen de la manipulación del estado en escenarios simultáneos son difíciles de depurar. A medida que la concurrencia se convierte en la norma para los programas, parece que la localización de la mutabilidad es un factor clave para reducir el esfuerzo de depuración. En el segundo ejemplo que no tenemos que mirar por encima de toda la implementación de la clase para averiguar dónde se manipula estado. La totalidad de mutabilidad de SeparatedMutabilityBedroom se localiza en RoomColor.

¿Qué opinas? Me he olvidado algunos elementos de reflexión?

¿Fue útil?

Solución

Programación con estructuras de datos inmutables es una técnica muy útil, pero es difícil de criticar en un conjunto de mejores prácticas o sugerencia sobre la base de un ejemplo sencillo. Decidir qué es lo mejor hay que tener en cuenta otros factores tales como el uso que se esta clase y interactuado.

Sin embargo, suponiendo que usted está en una situación que tiene una gran cantidad de concurrencia con varios escritores para este objeto, a continuación, hacer un objeto parcialmente inmutable realmente no compra mucho desde que usted todavía puede que tenga problemas.

En ese caso, ya sea utilizar algún tipo de sincronización primitivo o utilizar un objeto completamente inmutable.

respuesta habla de algunas de las técnicas de la utilización de objetos completamente inmutable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top