我正在开发需要访问元素周期表的科学软件。由一Element
组Isotopes
具有一些只读属性(例如质量、丰度、原子序数等)的集合组成。有超过 100 种元素,当考虑到它们的同位素时,有超过 1000 种同位素。为了在运行时填充所有这些对象,我目前有一个 XML 文件(构建操作:内容)*,其中包含我在Element
类的静态构造函数期间解析的所有元素数据:
public class Element {
private static readonly Dictionary<string, Element> _elements;
static Element()
{
_elements = new Dictionary<string, Element>();
LoadElements("Resources/Elements.xml"); // 461 KB file
}
static LoadElements(string resource) {
// code for construction of elements objects and population of the
// _elements dictionary.
}
private Element(blah) { \\ instance constructor }
}
这行得通,但是在文件中解析会产生开销,并且我在设计Element
类时失去了一些灵活性。Isotope
另一种方法是将每个都硬编码Element
到静态构造函数中。后者的优点是我可以为每个添加静态只读属性Element
(一个有用的功能):
public class Element {
private static readonly Dictionary<string, Element> _elements;
public static readonly Element Carbon = {get; private set;}
public static readonly Element Hydrogen = {get; private set;}
static Element()
{
_elements = new Dictionary<string, Element>();
Carbon = AddElement("Carbon", 6);
Carbon.AddIsotope(12, 12.0000000, 0.9893);
Carbon.AddIsotope(13, 13.0033548378, 0.0107);
Hydrogen = AddElement("Hydrogen", 1);
//Repeat this pattern for all the elements...
}
static Element AddElement(string name, double atomicNumber)
{
Element element = new Element(name, atomicNumber);
_elements.Add(name, element);
return element;
}
private Element(string name, double atomicNumber) {
// Not Important, just setting readonly properties
}
private void AddIsotope(int massNumber, double mass, double abundance) {
// Not Important;
}
}
但是,这似乎是要包含在 class.cs 文件中的大量硬编码数据。所以我很伤心,一方面在数据管理级别上将元素数据存储在读入的外部文件中是有意义的。但另一方面,因为所有数据实际上都是一堆常量/静态只读对象,这个额外的解析工作似乎是及时的,没有成果的,并且限制了 API 设计。创建所有这些对象的正确方法是什么?
*注意:如果客户端出于任何原因想要修改元素的值,则构建操作设置为内容。这不是必需的,可以更改为嵌入式资源。