私は元素の周期表にアクセスする必要がある科学ソフトウェアを開発しています。は、いくつかの読み取り専用プロパティ(たとえば、質量、存在量、原子番号など)を持つElement
セットで構成されます。Isotopes
100を超える元素があり、それらの同位体を考慮に入れると、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設計を制限しているように見えます。これらすべてのオブジェクトを作成する正しい方法は何ですか?
*注:クライアントが何らかの理由で要素の値を変更したい場合は、ビルドアクションがコンテンツに設定されます。これは必須ではなく、埋め込みリソースに変更できます。