Изменчивость смешанного класса против отдельного класса - PullRequest
0 голосов
/ 01 октября 2010

В частично изменяемом классе, лучше ли смешивать изменяемые поля с его неизменяемыми или создавать новый класс (или классы), который их инкапсулирует? Вот пример того, о чем я говорю в 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.

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

1 Ответ

0 голосов
/ 01 октября 2010

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

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

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

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

...