扱いにくいドメイン固有のオブジェクトの名前付けのガイダンス?


12

私は化学システムをモデリングしていますが、列挙内の要素/アイテムの命名に問題があります。

私が使用すべきかどうかはわかりません:

  • 原子式
  • 化学名
  • 省略された化学名。

たとえば、硫酸はH2SO4で、塩酸はHClです。

それら2つでは、合理的に一般的であるため、おそらくアトミック式を使用します。

しかし、Na2SiF6であるヘキサフルオロケイ酸ナトリウムのような他のものがあります。

その例では、原子式は(私には)それほど明白ではありませんが、化学名は恐ろしく長いです: myEnum.SodiumHexaFluoroSilicate。一貫した命名パターンを持つ短縮された化学名を安全に思い付くことができるかどうかはわかりません。

enum要素に名前を付けることで対処しようとしている問題がいくつかあります。
1つ目は読みやすさで、長い名前では問題が発生します。
2つ目は、新しいメンテナー向けのコードを簡単に選択できることです。ここでは、短い名前が問題を示しています。
次の問題は、事業主が通常完全な化学名を参照することですが、常にではありません。「一口」の化学物質は、その式で呼ばれます。
最後の懸念は、それが一貫していることを確認することです。どちらを使用するか覚えておくことができないので、私混合命名規則を望んでいません

メンテナンスの観点から、上記の命名オプションのどれをご覧になりますか?その理由は何ですか?


注:線の下にあるものはすべて補足です。明確化資料。動揺しないでください。主な質問は、厄介なオブジェクトの命名に関するものです。

アトミックオプション

public myEnum.ChemTypes
{  
   H2SO4、
   HCl、
   Na2SiF6
}

化学名オプション

public myEnum.ChemTypes
{
   硫酸、
   塩酸、
   ヘキサフルオロケイ酸ナトリウム  
}

この質問に関するコメントからの追加の詳細を次に示します。

  • コードの対象者は、化学者ではなくプログラマーだけです。
  • 私はC#を使用していますが、実装言語を無視する場合、この質問はより興味深いと思います。
  • 私は10-20の化合物から始めており、最大で100の化合物を持っているので、可能なすべての化合物について心配する必要はありません。幸いなことに、これは固定ドメインです。
  • 列挙型は、一般的/一般的な化学計算を容易にするためのルックアップのキーとして使用されます。つまり、式はすべての化合物で同じですが、化合物のプロパティを挿入して式を完成させます。

    • たとえば、化合物の質量(グラム)からモル数を計算する場合、モル質量(g / mol)が使用されます。FWIW、モル質量==モル重量。
    • 一般的な計算の別の例は、理想気体の法則特定気体定数の使用です。

サンプル関数は次のようになります。

public double GetMolesFromMass(double mass_grams、myEnum.ChemTypes chem)
{
  double moleWeight = MolarWeightLookupFunctionByChem(chem); //グラム/モルを返します
  ダブルモル=質量/モル重量; //モルに変換します

  ほくろを返す;
}

//サンプル呼び出し:
myMoles = GetMolesFromMass(1000、myEnum.ChemTypes.Na2SiF6);
// *または*
myMoles = GetMolesFromMass(1000、myEnum.ChemTypes.SodiumHexafluorosilicate);
public double GetSpecificGravity(myEnum.ChemTypes chem、double conc)
{
  //濃度に基づいて化合物の比重を取得
  double sg = SpecificGravityLookupTableByChem(chem、conc);  
}

そのため、化合物名の列挙はキーとして使用され、関連する関数で化合物を参照する際の一貫性を提供します。


7
なぜ列挙型である必要があるのですか?あなたがそれらすべてを設定できるようにするつもりはありませんので、可能な化合物の無限の量があります
ラチェットフリーク

3
化学者ではなくプログラマとして、Na2SiF6ヘキサフルオロケイ酸ナトリウムは等しく不明瞭であることがわかりました。前者は入力が短く、識別子ごとの40文字を超えない奇妙なコーディングルールを渡す可能性が最も高くなります。
mouviciel

5
プログラマーとして、私はナトリウムがNa2よりも速く指を離すと個人的に考えています-タイピングするときに言葉が流れやすい傾向があります(この理由でハンガリーの表記が嫌いです)。
ドレイククラリス

5
それらは列挙値であってはならずSubstance、必要なプロパティを持つインスタンスのはずです。
AakashM

2
@ GlenH7:「メタ」に関する質問を読んでください。ここの一部の人々にとっての本当の問題は、「なぜ化学名をコードに含めなければならないのか」ということだと思います。これらの名前を何らかの形式のデータとして持つだけで、非常に長い名前でコードが乱雑になることを回避でき、開発者がそれらについて考えるかもしれないものとは別に、システムのユーザーが好むような名前を選択できます。これにより、命名の責任がユーザーに委任され、問題が完全に回避されます。
ドックブラウン

回答:


9

現在のプロジェクトをスパゲッティから妥当なコードに書き直し始めたとき、同じ問題に直面しました。私の問題領域は医療であり、列挙型に「ETCO2」や「SPO2」などの名前を使用するのではなく、完全な英語名を使用しました。

一方で、私が問題のドメインを初めて知ったときに英語の名前を持つことは非常に役に立ちました。一方、これらの用語を1年間使用しているので、完全な英語名は非常に冗長であり、略語を使用することを好む用語に十分精通しています。

私のアドバイスは、アトミック式を使用し、コードを見る人はa)化学者、またはb)コードで十分な長さで作業することを前提に、フルネームを与える各列挙値によるコメントを含めることです彼らが自然に式に精通すること。


1
+1:それに加えて、「ETCO2」または「Na2SiF6」を常に調べて、それを行うことができます。
スティーブンエバーズ

5

コードの対象者は誰ですか?化学者はEnumを使用しますか、それとも化学の特定のドメイントレーニングのないプログラマのみを使用しますか?

化学者がコードを使用する場合は、彼らに尋ねてください。彼らは容易に認識できるので、省略記号を好むでしょう。一般知識プログラマが化学者に代わってこれらの識別子を使用する場合、英語のようなバージョンを使用する方が良いと思います。


化学者ではなく単なるプログラマー

1
または、各列挙型のドキュメントに翻訳を追加する
ラチェットフリーク

4

「上記のすべて」を組み合わせない理由はありません。

フルネームの問題は、入力するのが面倒であり、シンボル名の問題は意味の欠如です。

そのため、フルネームで値の定数を作成します。次に、定数に関連付けられた定義を作成します。略語の意味に慣れてきたら、簡単に新しい短い定義を作成できます。

const int SodiumHexaFluoroSilicate = 16893859;   
const float Gold = 196.966569;

#define SoduimSilicate SodiumHexaFluoroSilicate 
#define F6Na2Si SodiumHexaFluoroSilicate 
#define au Gold 

いくつかのCコードサンプルを使用しました... C#に簡単に変換できると思います。
ダニエル

特定の実装についてはそれほど心配していないので、質問でC#を指定しなかったのはこのためです。そして、Cの観点からのあなたの提案が気に入りました。ただし、System.ComponentModelのC#Descriptionタグは、記述子を追加するエレガントな方法です。特定の実装に関する質問に対するより広範な回答に興味がありました。

3

アプリケーションを設計するときは、プログラムロジックからデータを分離する必要があります。化学化合物は本当にプログラムロジックの一部であり、プログラムロジックが操作しているデータではありませんか?

それらがデータである場合、それらを列挙として扱うのではなく、構成ファイルから名前とプロパティを読み取り、データ構造に保存する方がはるかに良いでしょう。また、メンテナンスがずっと簡単になります。新しい化合物を追加する必要がある場合、または化合物のプロパティにエラーが見つかった場合、構成ファイルを編集するだけです。


1
+1 @ GlenH7 特定の化学化合物がコードの一部である理由を説明できれば、特に「方程式はすべての化合物で同じである」と言った後に役立ちます。
カレブ

1
@ GlenH7:化学物質が単なるデータではない理由はまだありません。いくつかのポスターは、列挙型を使用しないようにあなたを助けています。私は確かにそうしません。
ケビンクライン

1
@kevincline&caleb(および実際には他のすべての人)、この質問の構造化方法と列挙の側面についての助けを求めるメタ質問を作成しました。フィードバックをお願いします。

3
さて、誰かが頭にナイフを刺した状態であなたのところに来て、彼があなたの手にある破片を見てほしいと頼んだとき、それに集中するのは難しいです。
フィリップ

1
@Caleb-列挙の使用をより明確にするために質問が更新されました。

3

これは、開発者のニーズに基づいて展開および翻訳できるクラスとしてより適切に実装できるようです。以下は、いくつかのよく知られている定義済みの化学物質(プロパティとして)とクエリ可能なストア(via AddおよびGetメソッド)を許可するために思いついたサンプルC#です。分子量や他の化学的性質を利用できるように非常に簡単に拡張することもできます。

public interface IChemical
{
    string AtomicFormula
    {
        get;
    }

    string ChemicalName
    {
        get;
    }

    string AbbreviatedChemicalName
    {
        get;
    }
}

public sealed class Chemical : IChemical
{
    private static readonly IChemical h2so4 = new Chemical("H2SO4", "sulfuric acid", "sulf. acid");

    private static readonly IChemical hcl = new Chemical("HCl", "hydrochloric acid", "hydro. acid");

    private static readonly IDictionary<string, IChemical> chemicalsByAtomicFormula = new Dictionary<string, IChemical>();

    private static readonly IDictionary<string, IChemical> chemicalsByChemicalName = new Dictionary<string, IChemical>();

    private static readonly IDictionary<string, IChemical> chemicalsByAbbreviatedChemicalName = new Dictionary<string, IChemical>();

    private readonly string atomicFormula;

    private readonly string chemicalName;

    private readonly string abbreviatedChemicalName;

    static Chemical()
    {
        chemicalsByAtomicFormula.Add(h2so4.AtomicFormula, h2so4);
        chemicalsByChemicalName.Add(h2so4.ChemicalName, h2so4);
        chemicalsByAbbreviatedChemicalName.Add(h2so4.AbbreviatedChemicalName, h2so4);
        chemicalsByAtomicFormula.Add(hcl.AtomicFormula, hcl);
        chemicalsByChemicalName.Add(hcl.ChemicalName, hcl);
        chemicalsByAbbreviatedChemicalName.Add(hcl.AbbreviatedChemicalName, hcl);
    }

    public Chemical(string atomicFormula, string chemicalName, string abbreviatedChemicalName)
    {
        if (string.IsNullOrWhiteSpace(atomicFormula))
        {
            throw new ArgumentException("Atomic formula may not be null or whitespace.", "atomicFormula");
        }

        if (string.IsNullOrWhiteSpace(chemicalName))
        {
            throw new ArgumentException("Chemical name may not be null or whitespace.", "chemicalName");
        }

        if (string.IsNullOrWhiteSpace(abbreviatedChemicalName))
        {
            throw new ArgumentException("Abbreviated chemical name may not be null or whitespace.", "abbreviatedChemicalName");
        }

        this.atomicFormula = atomicFormula;
        this.chemicalName = chemicalName;
        this.abbreviatedChemicalName = abbreviatedChemicalName;
    }

    public static IChemical H2SO4
    {
        get
        {
            return h2so4;
        }
    }

    public static IChemical HCl
    {
        get
        {
            return hcl;
        }
    }

    public string AtomicFormula
    {
        get
        {
            return this.atomicFormula;
        }
    }

    public string ChemicalName
    {
        get
        {
            return this.chemicalName;
        }
    }

    public string AbbreviatedChemicalName
    {
        get
        {
            return this.abbreviatedChemicalName;
        }
    }

    public static void AddChemical(IChemical chemical)
    {
        if (chemical == null)
        {
            throw new ArgumentNullException("chemical", "chemical may not be null");
        }

        if (chemicalsByAtomicFormula.ContainsKey(chemical.AtomicFormula))
        {
            return;
        }

        chemicalsByAtomicFormula.Add(chemical.AtomicFormula, chemical);

        if (chemicalsByChemicalName.ContainsKey(chemical.ChemicalName))
        {
            return;
        }

        chemicalsByChemicalName.Add(chemical.ChemicalName, chemical);

        if (chemicalsByAbbreviatedChemicalName.ContainsKey(chemical.AbbreviatedChemicalName))
        {
            return;
        }

        chemicalsByAbbreviatedChemicalName.Add(chemical.AbbreviatedChemicalName, chemical);
    }

    public static IChemical GetChemicalByAtomicFormula(string atomicFormula)
    {
        if (string.IsNullOrWhiteSpace(atomicFormula))
        {
            throw new ArgumentException("Atomic formula may not be null or whitespace.", "atomicFormula");
        }

        IChemical chemical;

        return chemicalsByAtomicFormula.TryGetValue(atomicFormula, out chemical) ? chemical : null;
    }

    public static IChemical GetChemicalByChemicalName(string chemicalName)
    {
        if (string.IsNullOrWhiteSpace(chemicalName))
        {
            throw new ArgumentException("Chemical name may not be null or whitespace.", "chemicalName");
        }

        IChemical chemical;

        return chemicalsByChemicalName.TryGetValue(chemicalName, out chemical) ? chemical : null;
    }

    public static IChemical GetChemicalByAbbreviatedChemicalName(string abbreviatedChemicalName)
    {
        if (string.IsNullOrWhiteSpace(abbreviatedChemicalName))
        {
            throw new ArgumentException("Abbreviated chemical name may not be null or whitespace.", "abbreviatedChemicalName");
        }

        IChemical chemical;

        return chemicalsByAbbreviatedChemicalName.TryGetValue(abbreviatedChemicalName, out chemical) ? chemical : null;
    }
}

次のような新しい化学物質を追加できます。

        Chemical.AddChemical(new Chemical("Na2SiF6", "sodium hexafluorosilicate", "sod. hex.flu.sil."));

他のビットを取得します:

        Console.WriteLine(Chemical.GetChemicalByChemicalName("sulfuric acid").AtomicFormula);

答えてくれてありがとう。質問の内容を更新して、ターゲットを明確にしました。さまざまなテーブルなどからそのプロパティにアクセスするので、化学物質の名前を取得することをそれほど心配していません。私は開いているメタの質問私は列挙型の議論に追加する必要がありますまたは別Q.にそれを分割するか否かの
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.