Pergunta

Em uma classe parcialmente mutável, é melhor misturar campos mutáveis ​​com seus imutáveis ​​ou criar uma nova classe (ou classes) que os encapsule?Aqui está um exemplo em C# do que estou falando:

interface IBedroom
{
    int Volume { get; }

    string Color { get; }

    void Paint(string newColor);
}

Aqui está uma implementação com mutabilidade mista em seus 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;
    }
}

E um com mutabilidade 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;
    }
}

e a implementação de mutabilidade separada:

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

Pessoalmente, estou do lado do último estilo.Na minha experiência, os bugs que surgem da manipulação de estado em cenários simultâneos são difíceis de depurar.À medida que a simultaneidade se torna a norma para programas, parece que a localização da mutabilidade é um fator chave para reduzir o esforço de depuração.No segundo exemplo não precisamos examinar toda a implementação da classe para descobrir onde o estado é manipulado.A totalidade de SeparatedMutabilityBedroomA mutabilidade de está localizada em RoomColor.

O que você acha?Esqueci alguns pontos a serem considerados?

Foi útil?

Solução

A programação com estruturas de dados imutáveis ​​é uma técnica muito útil, mas é difícil criticar uma melhor prática geral ou sugestão baseada em um exemplo simples.Decidir o que é melhor deve levar em consideração outros fatores, como a forma como essa classe está sendo usada e interagida.

No entanto, supondo que você esteja em uma situação que tenha uma grande simultaneidade com vários gravadores para esse objeto, tornar um objeto parcialmente imutável realmente não lhe trará muito lucro, pois você ainda pode ter problemas.

Nesse caso, use algum tipo de sincronização primitiva ou use um objeto completamente imutável.

Esse responder fala sobre algumas técnicas de uso de objetos completamente imutáveis.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top