2

私は元素の周期表にアクセスする必要がある科学ソフトウェアを開発しています。は、いくつかの読み取り専用プロパティ(たとえば、質量、存在量、原子番号など)を持つElementセットで構成されます。Isotopes100を超える元素があり、それらの同位体を考慮に入れると、1000をはるかに超える同位体があります。実行時にこれらすべてのオブジェクトを設定するために、現在、Elementクラスの静的コンストラクター中に解析するすべての要素データを含むXMLファイル(ビルドアクション:コンテンツ)*があります。

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を引き続き使用でき、ユーザーコードのマジックストリングなどに依存しません。
  • 本当に必要な場合は、後でデータを簡単に変更できます(そして、外部ソースからデータを読み取る方法を提供することもできます) 。
  • おそらく、C#ではなくXMLファイルとしてデータ自体を操作しやすくするでしょう。

解析作業について心配する必要はありません。1だけ実行する必要があることを考えると、パフォーマンスの点で重要であるとは信じがたいです。

于 2013-02-04T19:25:51.417 に答える
0

sourceforgeでホストされている青いオベリスクプロジェクトをチェックしてください-おそらくあなたが探しているものでさえ、そこにいくつかの有用なものが見つかると思います。

于 2013-02-05T18:57:35.180 に答える