类特定的常量应该封装在嵌套类中
本文关键字:封装 嵌套 常量 | 更新日期: 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。
命名:
如果一个类中有许多常量,请使用好的前缀对它们进行分类。所以读者可以更快地找到合适的。