代码之家  ›  专栏  ›  技术社区  ›  Homde

管理对象状态/设置的模式?

  •  1
  • Homde  · 技术社区  · 15 年前

    我有点进退两难,希望你能给我一些建议。

    我有一个类,让我们称之为“Car”,其中每个实例都有一些单独的设置(通过属性),比如“Color”、“hasgearchift”或诸如此类的东西(我只是在编一个简单的示例)。这些应该是用户自定义的,但也应该有默认值。

    因此,自然的解决方案是获取所有“settings”属性,并将它们分解为一个单独的“settings”类,该类可以序列化/反序列化。每个Car类还可以用一个设置默认值的类继承Settings类,并可以序列化为用户自定义的基础。太好了。

    someCar.Settings.HasGearShift 甚至还有这样的: someCar.Settings.GearBox.CurrentGear 但至少没有冗余,所有内容都很好地封装在Settings类中。

    另一个选项是保留Car类的属性,并简单地将它们从Settings类复制到类中。那我就可以写了 someCar.HasGearShift 再一次。使引用属性更加简洁,但这意味着如果添加/删除某些内容,我必须更改两个类中的设置。

    你会选择哪一种,或者有没有第三种更好的方式让我错过了呢?我倾向于第二种选择,否则代码中会有太多的“火车失事”:

    3 回复  |  直到 15 年前
        1
  •  6
  •   driis    15 年前

    我想我应该在两者之间做点什么:使用composition,用所需的设置创建一个CarSettings类,并使其可序列化。可能有一个静态CarSettings.Default属性;定义默认设置的。然后,Car可以获取构造函数中的settings实例,并公开需要在外部可见的settings的委托属性。

    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"};
    }
    
        2
  •  0
  •   Eric Schneider    15 年前

    您可以查看Visual Studio Win forms designer使用的现有设计:

    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
    

    它们还使用了一些属性,比如; 默认值

        3
  •  0
  •   BFree    15 年前

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

    我想说的是,你的设计看起来不错,你担心的长语法不是问题。