अजीब डोमेन-विशिष्ट वस्तुओं के नामकरण में मार्गदर्शन?


12

मैं एक रासायनिक प्रणाली का निर्माण कर रहा हूं, और मुझे अपने तत्वों / वस्तुओं का नाम एनम के भीतर रखने में समस्या हो रही है।

मुझे यकीन नहीं है कि मुझे उपयोग करना चाहिए:

  • परमाणु सूत्र
  • रासायनिक नाम
  • एक संक्षिप्त रासायनिक नाम।

उदाहरण के लिए, सल्फ्यूरिक एसिड H2SO4 है और हाइड्रोक्लोरिक एसिड HCl है।

उन दोनों के साथ, मैं शायद परमाणु सूत्र का उपयोग करूंगा क्योंकि वे यथोचित रूप से सामान्य हैं।

हालांकि, मेरे पास सोडियम हेक्साफ्लोरोसिलिकेट जैसे अन्य हैं जो कि Na2SiF6 है।

उस उदाहरण में, परमाणु सूत्र उतना स्पष्ट नहीं है (मेरे लिए) लेकिन रासायनिक नाम छिपकर लंबा है myEnum.SodiumHexaFluoroSilicate:। मुझे यकीन नहीं है कि मैं कैसे एक संक्षिप्त रासायनिक नाम के साथ सुरक्षित रूप से आने में सक्षम होऊंगा जिसमें एक सुसंगत नामकरण पैटर्न होगा।

कुछ समस्याएं हैं जो मैं एनम तत्वों के नामकरण के माध्यम से संबोधित करने की कोशिश कर रहा हूं।
पहला पठनीयता है, जिसमें एक मुद्दे को प्रस्तुत करने वाले लंबे नाम हैं।
दूसरा नए अनुरक्षकों के लिए कोड लेने में आसानी है, और यहां छोटे नाम एक मुद्दा प्रस्तुत करते हैं।
अगला मुद्दा यह है कि व्यवसाय के मालिक आमतौर पर पूर्ण रासायनिक नाम का उल्लेख करते हैं, लेकिन हमेशा नहीं। "माउथफुल" रसायनों को उनके सूत्र द्वारा संदर्भित किया जाता है।
अंतिम चिंता यह सुनिश्चित कर रही है कि यह सुसंगत है। मैं एक मिश्रित नामकरण सम्मेलन नहीं करना चाहता क्योंकि यह याद रखना असंभव है कि किसका उपयोग करना है।

रखरखाव के दृष्टिकोण से, ऊपर दिए गए नामों में से कौन सा विकल्प आप देखना पसंद करेंगे और क्यों?


नोट: यहाँ सब कुछ लाइन के नीचे पूरक है | स्पष्ट करने वाली सामग्री। कृपया इसमें मत उलझिए। मुख्य सवाल अजीब वस्तुओं के नामकरण का संबंध है।

परमाणु विकल्प

सार्वजनिक myEnum.ChemTypes
{  
   H2SO4,
   एचसीएल,
   Na2SiF6
}

रासायनिक नाम विकल्प

सार्वजनिक myEnum.ChemTypes
{
   सल्फ्यूरिक एसिड,
   हाइड्रोक्लोरिक एसिड,
   SodiumHexafluorosilicate  
}

इस प्रश्न पर टिप्पणियों से कुछ अतिरिक्त विवरण इस प्रकार हैं:

  • कोड के लिए श्रोता केवल प्रोग्रामर होंगे, रसायनज्ञ नहीं
  • मैं C # का उपयोग कर रहा हूं, लेकिन मुझे लगता है कि कार्यान्वयन भाषा की अनदेखी करते समय यह प्रश्न अधिक दिलचस्प है।
  • मैं 10 - 20 यौगिकों के साथ शुरू कर रहा हूं और इसमें अधिकतम 100 यौगिक होंगे, इसलिए मुझे हर संभव यौगिक के बारे में चिंता करने की आवश्यकता नहीं है। सौभाग्य से, यह एक निश्चित डोमेन है।
  • Enum का उपयोग आम / जेनेरिक रासायनिक गणनाओं को सुविधाजनक बनाने के लिए लुकअप के लिए एक कुंजी के रूप में किया जाता है - जिसका अर्थ है कि समीकरण सभी यौगिकों के लिए समान है लेकिन आप समीकरण को पूरा करने के लिए यौगिक की एक संपत्ति सम्मिलित करते हैं।

एक नमूना समारोह की तरह लग सकता है:

सार्वजनिक डबल GetMolesFromMass (डबल मास_ग्राम, myEnum.ChemTypes रसायन)
{
  double molarWeight = MolarWeightLookupFunctionByChem (chem); // रिटर्न ग्राम / मोल
  डबल मोल्स = द्रव्यमान / मोलरवेइट; // मोल्स में कनवर्ट करता है

  वापसी मोल्स;
}

// नमूना कॉल:
myMoles = GetMolesFromMass (1000, myEnum.ChemTypes.Na2SiFM);
// * या *
myMoles = GetMolesFromMass (1000, myEnum.ChemTypes.SodiumHexafluorosilicate);
सार्वजनिक डबल गेटसेक्शुअल ग्रेविटी (myEnum.ChemTypes chem, double conc)
{
  // एकाग्रता के आधार पर रासायनिक यौगिक के विशिष्ट गुरुत्व को प्राप्त करता है
  double sg = SpecificGravityLookupTableByChem (chem, conc);  
}

तो यौगिक नाम का एनम एक कुंजी के रूप में और संबंधित कार्यों के साथ यौगिक को संदर्भित करने में स्थिरता प्रदान करने के लिए उपयोग किया जाता है।


7
उन्हें दुश्मनी करने की क्या ज़रूरत है? संभावित यौगिकों की अनंत मात्रा होती है, इसलिए आप कभी भी उन सभी को सेट करने में सक्षम नहीं होंगे
शाफ़्ट फ्रीक

3
एक प्रोग्रामर के रूप में, केमिस्ट नहीं, मुझे लगता है कि Na2SiF6 और सोडियम हेक्साफ्लोरोसिलिकेट समान रूप से अस्पष्ट हैं। पूर्व टाइप करने के लिए छोटा है और सबसे अधिक नहीं-से-40-चार्ट-बाय-आइडेंटिफायर कोडिंग नियमों को पारित करने की संभावना है।
मौविसील

5
एक प्रोग्रामर के रूप में, मुझे व्यक्तिगत रूप से लगता है कि सोडियम मेरी उंगलियों को Na2 की तुलना में तेजी से रोल करने जा रहा है - टाइपिंग करते समय शब्द मेरे लिए आसान हो जाते हैं (मैं इस कारण से हंगेरियन नोटेशन से नफरत करता हूं)।
ड्रेक क्लेरिस

5
उन्हें ईम्यू वैल्यूज़ नहीं होना चाहिए, उन्हें उदाहरणों के Substanceसाथ होना चाहिए कि उन्हें जो भी गुण चाहिए।
आकाशवाणी

2
@ GlenH7: बस "मेटा" पर अपना प्रश्न पढ़ें। मुझे लगता है कि यहां कुछ लोगों के लिए असली समस्या यह है कि "रासायनिक नामों को कोड में क्यों होना चाहिए"? केवल डेटा के किसी रूप में उन नामों को रखने से आपका कोड बहुत लंबे नामों के साथ अव्यवस्था से बच जाएगा, और आप अपने सिस्टम के उपयोगकर्ता की तरह ही नामों का चयन कर सकते हैं, स्वतंत्र रूप से एक डेवलपर उनके बारे में क्या सोच सकता है। यह उपयोगकर्ता को नामकरण की जिम्मेदारी सौंपता है और आपकी समस्या से पूरी तरह से बचता है।
डॉक्टर ब्राउन

जवाबों:


9

जब मैंने अपने वर्तमान प्रोजेक्ट को स्पेगेटी से उचित कोड में लिखना शुरू किया, तो मुझे उसी समस्या का सामना करना पड़ा। मेरा समस्या डोमेन चिकित्सा है, और अपने नाम के लिए "ETCO2" और "SPO2" जैसे नामों का उपयोग करने के बजाय मैंने पूर्ण अंग्रेजी नामों का उपयोग किया है।

एक ओर, जब मैं समस्या डोमेन में नया था, तब अंग्रेजी नाम रखना बहुत उपयोगी था। दूसरी ओर, अब जब मैं इन शर्तों के साथ एक साल से काम कर रहा हूं तो मुझे लगता है कि पूर्ण अंग्रेजी नाम बहुत अधिक क्रियात्मक हैं और मैं उन शब्दों से काफी परिचित हूं जिन्हें मैं संक्षिप्त रूप में उपयोग करना पसंद करता हूं।

मेरी सलाह होगी कि आप परमाणु सूत्र का उपयोग करें और प्रत्येक एनम मान द्वारा एक टिप्पणी शामिल करें जो अपना पूरा नाम देता है, इस धारणा पर कि जो कोई भी आपके कोड को देखता है वह या तो एक) एक रसायनज्ञ, या बी) कोड पर लंबे समय तक काम करेगा कि वे स्वाभाविक रूप से सूत्रों से परिचित हो जाएं।


1
+1: इसके अलावा, कोई भी हमेशा "ETCO2" या "Na2SiF6" देख सकता है और उसके साथ किया जा सकता है।
स्टीवन एवर्स

5

कोड के लिए दर्शक कौन है? क्या रसायनशास्त्री Enums का उपयोग कर रहे हैं, या केवल प्रोग्रामर रसायन विज्ञान में विशिष्ट डोमेन प्रशिक्षण के बिना?

यदि रसायनज्ञ कोड का उपयोग कर रहे हैं, तो उनसे पूछें। बहुत संभव है कि वे संक्षिप्त प्रतीकों को पसंद करेंगे, क्योंकि वे आसानी से उन्हें पहचान सकते हैं। यदि सामान्य-ज्ञान प्रोग्रामर इन पहचानकर्ताओं का उपयोग केमिस्ट की ओर से करेंगे, तो मुझे लगता है कि अंग्रेजी जैसे संस्करणों के साथ जाना बेहतर है।


यह सिर्फ प्रोग्रामर होगा, केमिस्ट नहीं

1
या प्रत्येक enum के प्रलेखन में अनुवाद जोड़ें
शाफ़्ट freak

4

कोई कारण नहीं गठबंधन करने के लिए "उपरोक्त सभी।"

पूर्ण नामों के साथ समस्या यह है कि यह टाइप करने के लिए थकाऊ होगा, प्रतीक नामों के साथ समस्या अर्थ की कमी है।

इसलिए, पूर्ण नाम के साथ मानों की स्थिरांक बनाएं। फिर स्थिरांक के साथ जुड़े परिभाषित करें। आप आसानी से नए, छोटे परिभाषित बना सकते हैं क्योंकि आप संक्षिप्त नाम के अर्थ से अधिक परिचित हो जाते हैं।

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

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

मैंने कुछ बोरेड सी कोड नमूने का इस्तेमाल किया ... मुझे लगता है कि इसे सी # में आसानी से अनुवाद करना चाहिए।
डैनियल

मैं एक विशेष कार्यान्वयन के बारे में चिंतित नहीं हूं, यही वजह है कि मैंने अपने प्रश्न में C # निर्दिष्ट नहीं किया। और मुझे C के दृष्टिकोण से आपका सुझाव पसंद आया। System.ComponentModel का C # विवरण टैग हालांकि वर्णनकर्ता को जोड़ने का एक सुंदर तरीका है। मैं एक विशेष कार्यान्वयन पर सवाल के व्यापक जवाब में अधिक रुचि रखता था।

3

जब आप कोई एप्लिकेशन डिज़ाइन करते हैं, तो आपको प्रोग्राम लॉजिक से डेटा को अलग करना चाहिए। क्या रासायनिक यौगिक वास्तव में प्रोग्राम लॉजिक का हिस्सा हैं और डेटा लॉजिक चालू नहीं है?

जब वे डेटा होते हैं, तो उन्हें एनम के रूप में नहीं मानना ​​बेहतर होगा, बल्कि कॉन्फ़िगरेशन फ़ाइल से उनके नाम और गुणों को पढ़ें और उन्हें डेटा संरचना में संग्रहीत करें। इससे रखरखाव भी काफी आसान हो जाएगा। जब किसी को नए यौगिकों को जोड़ने की आवश्यकता होती है, या किसी के गुणों में कोई त्रुटि मिलती है, तो वे विन्यास फाइल को संपादित कर सकते हैं।


1
+1 @ GlenH7 से यह पता चलता है कि आप यह बता सकते हैं कि विशिष्ट रासायनिक यौगिक कोड का हिस्सा क्यों हैं, खासकर जब आपने कहा है कि "समीकरण सभी यौगिकों के लिए समान है।"
कालेब

1
@ GlenH7: अभी भी कोई कारण नहीं है कि रसायन सिर्फ डेटा नहीं हैं। कई पोस्टर मदद कर रहे हैं कि आप एक एनम का उपयोग न करें। मैं निश्चित रूप से नहीं होगा।
केविन क्लाइन

1
@kevincline & caleb (और बाकी सब वास्तव में), मैंने एक मेटा प्रश्न बनाया है, जो इस प्रश्न और इसके बारे में जानकारी को कैसे ढाँचे में मदद करता है। मैं आपकी प्रतिक्रिया की सराहना करूंगा।

3
ठीक है, जब कोई आपके पास आता है, तो उसके सिर में एक चाकू फंस जाता है, और वह आपको अपने हाथ में किरच को देखने के लिए कहता है, उस पर ध्यान केंद्रित करना मुश्किल है।
फिलीपिंस

1
@ कालेब - एनम के उपयोग को बेहतर बनाने के लिए अपडेट किया गया प्रश्न।

3

ऐसा लगता है कि इसे एक वर्ग के रूप में बेहतर ढंग से लागू किया जा सकता है जो डेवलपर्स की जरूरतों के आधार पर विस्तार और अनुवाद कर सकता है। नीचे कुछ सैंपल C # दिए गए हैं जिन्हें मैं कुछ जाने-माने परिभाषित रसायनों (गुणों के रूप में) और फिर क्वेरी करने योग्य स्टोर (थ्रू Addऔर Getमेथड) के लिए अनुमति देता हूं । आप अपने दाढ़ द्रव्यमान और अन्य रासायनिक गुणों को उपलब्ध करने के लिए बहुत आसानी से विस्तार कर सकते हैं।

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);

उत्तर के लिए धन्यवाद, और मैंने अपना प्रश्न अपडेट किया है कि मैं जो लक्ष्य कर रहा हूं उसमें थोड़ा और स्पष्ट हो। मैं रासायनिक यौगिक का नाम प्राप्त करने के बारे में चिंतित नहीं हूं क्योंकि मैं विभिन्न तालिकाओं और इस तरह से इसके गुणों तक पहुंचने के साथ हूं। मुझे इस बारे में एक खुला मेटा सवाल है कि मुझे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.