Смешанный против.разделенная изменчивость классов

StackOverflow https://stackoverflow.com/questions/3835910

  •  26-09-2019
  •  | 
  •  

Вопрос

Что лучше в частично изменяемом классе — смешивать изменяемые поля с неизменяемыми или создать новый класс (или классы), который их инкапсулирует?Вот пример на C# того, о чем я говорю:

interface IBedroom
{
    int Volume { get; }

    string Color { get; }

    void Paint(string newColor);
}

Вот реализация со смешанной изменчивостью в полях:

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

И один с отдельной изменчивостью:

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

и реализация разделенной изменчивости:

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

Лично я сторонник второго стиля.По моему опыту, ошибки, возникающие в результате манипулирования состоянием в параллельных сценариях, трудно отладить.Поскольку параллелизм становится нормой для программ, кажется, что локализация изменчивости является ключевым фактором сокращения усилий по отладке.Во втором примере нам не нужно просматривать всю реализацию класса, чтобы выяснить, где происходит манипулирование состоянием.Полнота SeparatedMutabilityBedroomизменчивость локализована в RoomColor.

Что вы думаете?Я забыл некоторые моменты для рассмотрения?

Это было полезно?

Решение

Программирование с неизменяемыми структурами данных — очень полезный метод, но его трудно критиковать в целом за лучшие практики или предложения, основанные на простом примере.При принятии решения о том, что лучше, необходимо учитывать другие факторы, например, то, как этот класс используется и с ним взаимодействует.

Однако, если вы находитесь в ситуации, когда к этому объекту применяется большое количество параллелистов с несколькими авторами, то создание частично неизменяемого объекта на самом деле не принесет вам много пользы, поскольку вы все равно можете столкнуться с проблемами.

В этом случае либо используйте какой-то примитив синхронизации, либо используйте полностью неизменяемый объект.

Этот отвечать рассказывает о некоторых приемах использования полностью неизменяемых объектов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top