Шаблон для управления состоянием / настройками объекта? - PullRequest
1 голос
/ 26 мая 2010

У меня возникла какая-то дилемма, и я был бы признателен за ввод.

У меня есть этот класс, назовем его «Автомобиль», где каждый экземпляр имеет свои индивидуальные настройки (через свойства), например, «Цвет»., "HasGearShift" или еще много чего (я делаю это для простого примера).Они должны быть настраиваемыми пользователем, но также должны быть значения по умолчанию.

Поэтому естественным решением было взять все свойства «settings» и разделить их на отдельный класс «Settings», который можно сериализовать / десериализовать.Каждый класс Car может также наследовать класс Settings с классом, который устанавливает значения по умолчанию и может быть сериализован как основа пользовательской настройки.Софар так хорош.

Проблема, которую я чувствую, заключается в том, что мне либо приходится жить с таким синтаксисом по всему коду: someCar.Settings.HasGearShift, и даже есть что-то вроде этого: someCar.Settings.GearBox.CurrentGear Но, по крайней мере, нет избыточностивсе красиво инкапсулировано в классе «Настройки».

Другой вариант - сохранить свойства класса Car и просто скопировать их из класса «Настройки» в класс.Тогда я могу просто написать someCar.HasGearShift снова.Делает ссылки на свойства намного более краткими, но означает, что мне нужно изменить настройки в двух классах, если я что-то добавлю / уберу.

Какой из них вы бы выбрали, или есть третий лучший способ, которого мне не хватает?Я склоняюсь ко второму варианту, иначе в коде просто будет слишком много "аварий":)

Ответы [ 3 ]

6 голосов
/ 26 мая 2010

Думаю, я бы выбрал что-то среднее: используйте состав и создайте класс CarSettings с необходимыми настройками и сделайте его сериализуемым. Возможно иметь статическое свойство CarSettings.Default; это определяет настройки по умолчанию. Затем Car может взять экземпляр настроек в конструкторе и выставить делегирующие свойства для настроек, которые должны быть видны извне.

Что-то вроде:

public class Car
{
    private CarSettings settings;

    public Car(CarSettings settings) 
    {
        settings = settings ?? CarSettings.Default;
    }

    public string Color { get {return settings.Color;} }
}

public class CarSettings 
{
     public string Color {get; private set;}
     public static CarSettings Default = new CarSettings {Color = "Red"};
}
0 голосов
/ 26 мая 2010

Я не уверен, что вижу здесь проблему. Кажется, ваша единственная проблема в том, что вам не нравится глубокое вложение свойств. Это не реальная проблема, и вы легко можете сделать это в своем коде, когда вам нужно получить доступ к настройкам:

var settings = someCar.Settings;
settings.Color...

То, что я пытаюсь сказать, это то, что ваш дизайн выглядит хорошо, и длинный синтаксис, о котором вы беспокоитесь, не проблема.

0 голосов
/ 26 мая 2010

Вы можете посмотреть на существующий дизайн, используемый дизайнером Win-форм Visual Studio:

Public Property AlternateItemColors() As Boolean Implements AbstractInterfaces.CoreControls.IVisualList.AlternateItemColors
    Get
        Return m_AlternateItemColors
    End Get
    Set(ByVal value As Boolean)
        m_AlternateItemColors = value
    End Set
End Property

Public Overridable Function ShouldSerializeAlternateItemColors() As Boolean
    If Me.AlternateItemColors = True Then Return False
    Return True
End Function

У них также есть ряд используемых атрибутов, например; DefaultValue

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...