适当的大型Enum设计
本文关键字:Enum 设计 大型 | 更新日期: 2023-09-27 18:17:42
我最近完成了计算机图形学课程的分子/蛋白质查看器的工作。原子显然是这样一个程序的一个非常重要的部分。目前,我有一个包含每个元素(氢、氦等)的大枚举。每个元素都有相关的信息,如颜色、半径等。我正在使用一个扩展类,所以我可以这样写:
float r = Element.Neon.Radius();
我还需要能够从它的符号中获得相应的枚举。我把这个方法放在扩展类中,这有点乱:
Element carbon = ElementExtensions.FromAbbreviation("C");
我想将更多的数据与特定的元素项关联起来,但我不确定这是否是一个好的设计。目前,每组关联数据都需要一个Dictionary来获取关联数据。也许我可以用字典?
如果我使用Element类,我需要确保只有一个氢实例,一个氦实例,等等。我喜欢System.Drawing.Color的设计方式,但我不认为这正是我需要的(例如,您永远不必查找ForestGreen的相关数据)。
支持大量但定义良好且数量有限的特定实例的最佳方式是什么?
枚举似乎不是解决这个问题的合适方法;相反,您应该创建一个Element
类,其中包含与每个元素相关的所有信息,以及每个已知元素的静态只读属性:
public class Element
{
private readonly string _symbol;
private readonly int _atomicNumber;
private readonly Color _color
// Private constructor, since you don't want people to be able to "invent" random elements...
private Element(string symbol, int atomicNumber, Color color)
{
_symbol = symbol;
_atomicNumber = atomicNumber;
_color = color;
}
public string Symbol { get { return _symbol; } }
public int AtomicNumber { get { return _atomicNumber; } }
public Color color { get { return _color; } }
// Known elements
private static readonly Element _hydrogen = new Element("H", 1, Color.White);
private static readonly Element _carbon = new Element("C", 6, Color.Black);
private static readonly Element _oxygen = new Element("O", 8, Color.Red);
public static Element Hydrogen { get { return _hydrogen; } }
public static Element Carbon { get { return _carbon; } }
public static Element Oxygen { get { return _oxygen; } }
...
}
这样,关于一个元素的所有信息都可以集中在一个地方,而不是分散在许多不同的地方
如果你有很多枚举,你应该重新考虑是否应该使用继承。
代替Element。为什么不让Neon继承Element呢?
class Element
int Radius();
Color Color();
string Symbol();
class Neon : Element
int Radius (return x);
int Color (return Color.Red);
int Symbol (return "NE");
如果你只需要一个元素,可以考虑使用Singleton
将元素定义为类,但使用Flyweight模式。