2

我正在开发需要访问元素周期表的科学软件。由一ElementIsotopes具有一些只读属性(例如质量、丰度、原子序数等)的集合组成。有超过 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 设计。创建所有这些对象的正确方法是什么?

*注意:如果客户端出于任何原因想要修改元素的值,则构建操作设置为内容。这不是必需的,可以更改为嵌入式资源。

4

2 回答 2

3

我会考虑将这些值放在一个嵌入式文件中,但可能有一个元素的枚举。(可能不是同位素,但提供了一种从元素中指定同位素的简单方法。)

那样:

  • 您仍然可以拥有强类型的 API,而不是依赖用户代码中的魔术字符串等
  • 如果您真的希望,您仍然可以在以后轻松更改数据(并且可能提供一种从外部源读取数据的方法)
  • 您可能更容易使用数据本身,作为 XML 文件而不是 C#

不要担心解析工作 - 鉴于您只需要执行一次,我发现很难相信它在性能方面会很重要。

于 2013-02-04T19:25:51.417 回答
0

查看托管在 sourceforge 上的蓝色方尖碑项目——我想你会在那里找到一些有用的东西,甚至可能正是你正在寻找的东西。

于 2013-02-05T18:57:35.180 回答