类特定的常量应该封装在嵌套类中

本文关键字:封装 嵌套 常量 | 更新日期: 2023-09-27 18:26:08

如果我在一个类中有彼此相关的常量,比如说用于写入/读取MyClass的Xml文件的字符串,我应该将它们封装在MyClass中的嵌套类Xml中吗?或者只定义它们而不在MyClass中包装?如果包装它们是一个好主意,而不是如果只有这些常量的一部分应该对外部世界可访问,例如只有Xml.Name和其他是MyClass将用于重新创建对象的Xml属性,那么我应该将嵌套类的保护级别设置为什么?

类特定的常量应该封装在嵌套类中

我认为nested-class是一个只有在另一个对象的上下文中才有意义的对象;并且其逻辑需要该另一对象的属性。考虑到这一点,我从未设计过一个nested-class,后来我没有对其进行重构。我认为public nested-class的需求是一个麻烦设计的危险信号。

不管怎样,你的问题让我考虑它们是否有潜在的用处。所以,即使我不会使用这种设计,它可能对你有用。

我确实想提到const应该只用于那些永远不会改变的事情。就像一天中的时间或光速。我不能完全从你的问题中判断出来,但像Xml.Name这样的东西似乎是可变的。我建议对这些属性使用readonly。可能是static readonly,如果它们在所有实例中都是一致的。这将引导您避开const的许多陷阱。

以下是我模拟的class,以演示我对您的设计的建议:

public class MyClass
{   
    public string Title { get; set; }
    Xml _xml;
    public Xml MyXml
    {
        get { return _xml; }
        set { _xml = value; }
    }    
    public MyClass(string xmlName, object xmlAttributes)
    {
        _xml = new Xml(xmlName, xmlAttributes);        
    }
        public class Xml
        {
            private readonly string _name;
            public string Name
            {
                get { return _name; }
            }
            private readonly object _attributes;
            internal object Attributes
            {
                get { return _attributes; }
            }
            public Xml(string name, object attributes)
            {
                _name = name;
                _attributes = attributes;
            }
        }
}

我认为没有必要将常量移动到嵌套类中。

可访问性:
使常量仅为MyClass*private*所需
使常量仅为与MyClass*internal*在同一程序集中的类所需
使常量仅为MyClass的子类和MySlass本身protected所需
使常量仅为与MyClass在同一程序集中的类所需,或为MySlass的子类所需以及为MyClass本身内部保护所需
使其他程序集中的类也需要常量,而不是MyClass的一个public

命名:
如果一个类中有许多常量,请使用好的前缀对它们进行分类。所以读者可以更快地找到合适的。