বিশ্রী ডোমেন-নির্দিষ্ট অবজেক্টের নামকরণের গাইডেন্স?


12

আমি একটি রাসায়নিক সিস্টেমের মডেলিং করছি, এবং এনামের মধ্যে আমার উপাদানগুলি / আইটেমগুলির নামকরণে আমার সমস্যা হচ্ছে।

আমি ব্যবহার করা উচিত কিনা তা নিশ্চিত নই:

  • পারমাণবিক সূত্র
  • রাসায়নিক নাম
  • একটি সংক্ষিপ্ত রাসায়নিক নাম।

উদাহরণস্বরূপ, সালফিউরিক অ্যাসিড H2SO4 এবং হাইড্রোক্লোরিক অ্যাসিড এইচসিএল।

এই দুটি নিয়ে আমি সম্ভবত পারমাণবিক সূত্রটি ব্যবহার করব কারণ এগুলি যথাযথভাবে সাধারণ।

যাইহোক, আমার কাছে সোডিয়াম হেক্সাফ্লোরোসিলিকেট জাতীয় Na2SiF6 এর মতো অন্যান্য রয়েছে।

যে উদাহরণে, পারমাণবিক সূত্র সুস্পষ্ট যেমন (রা) আমাকে নয়, কিন্তু রাসায়নিক নাম নৃশংসভবে দীর্ঘ: myEnum.SodiumHexaFluoroSilicate। আমি নিশ্চিত নই যে আমি কীভাবে নিরাপদে একটি সংক্ষিপ্ত রাসায়নিক নাম নিয়ে আসতে সক্ষম হব যার একটি ধারাবাহিক নামকরণের ধরণ থাকবে।

আমি এনাম উপাদানগুলির নামকরণের মাধ্যমে কয়েকটি সমস্যা সমাধান করার চেষ্টা করছি।
প্রথমটি হ'ল পাঠযোগ্যতা, দীর্ঘ নামগুলি ইস্যু উপস্থাপন করে।
দ্বিতীয়টি হ'ল নতুন রক্ষণাবেক্ষণকারীদের জন্য কোড বাছাই করা সহজ এবং এখানে সংক্ষিপ্ত নামগুলি একটি সমস্যা উপস্থাপন করে।
পরবর্তী সমস্যাটি হ'ল ব্যবসায়ের মালিকরা সাধারণত পুরো রাসায়নিক নামটি উল্লেখ করেন তবে সর্বদা তা নয়। "মুখের" রাসায়নিকগুলি তাদের সূত্র দ্বারা উল্লেখ করা হয়।
চূড়ান্ত উদ্বেগ এটি নিশ্চিত করে তুলছে যে এটি সামঞ্জস্যপূর্ণ। আমি না একটি মিশ্র নামকরণ সম্মেলন wan't যেমন যা মনে রাখা ব্যবহার করা অসম্ভব হবে।

রক্ষণাবেক্ষণের দৃষ্টিকোণ থেকে উপরের নামকরণের বিকল্পগুলির মধ্যে আপনি কোনটি দেখতে পছন্দ করেন এবং কেন?


দ্রষ্টব্য: এখানে লাইনের নীচে থাকা সমস্ত কিছুই পরিপূরক স্পষ্টকরণ উপাদান। দয়া করে এটিতে জড়িয়ে পড়বেন না। মূল প্রশ্নটি বিশ্রী বস্তুগুলির নামকরণ সম্পর্কিত।

পারমাণবিক বিকল্প

সর্বজনীন myEnum.ChemType
{  
   H2SO4,
   HCl,
   Na2SiF6
}

রাসায়নিক নাম বিকল্প

সর্বজনীন myEnum.ChemType
{
   সালফিউরিক এসিড,
   হাইড্রোক্লোরিক এসিড,
   SodiumHexafluorosilicate  
}

এই প্রশ্নে মন্তব্যগুলি থেকে কিছু অতিরিক্ত বিবরণ এখানে দেওয়া হয়েছে:

  • কোডটির জন্য শ্রোতা কেবল প্রোগ্রামার হবে, রসায়নবিদ নয় not
  • আমি সি # ব্যবহার করছি তবে আমি মনে করি বাস্তবায়ন ভাষা উপেক্ষা করার সময় এই প্রশ্নটি আরও আকর্ষণীয় is
  • আমি 10 - 20 টি যৌগিক দিয়ে শুরু করছি এবং সর্বাধিক 100 টি যৌগিক হবে, সুতরাং আমার প্রতিটি সম্ভাব্য যৌগ সম্পর্কে চিন্তা করার দরকার নেই । ভাগ্যক্রমে, এটি একটি নির্দিষ্ট ডোমেন।
  • এনামটি সাধারণ / জেনেরিক রাসায়নিক গণনার সুবিধার্থে অনুসন্ধানের জন্য কী হিসাবে ব্যবহৃত হয় - যার অর্থ সমীকরণটি সমস্ত যৌগের জন্য সমান তবে সমীকরণটি সম্পূর্ণ করার জন্য আপনি যৌগের কোনও সম্পত্তি সন্নিবেশ করান।

একটি নমুনা ফাংশন দেখতে পারে:

পাবলিক ডাবল গেটমোলস ফ্রমমাস (ডাবল ভর_গ্রাম, মাইইনাম.চেমটাইপস কেম)
{
  ডাবল মোলারওয়েট = MolarWeightLookupFunctionByChem (কেম); // গ্রাম / তিল ফেরত দেয়
  ডাবল মোলস = ভর / মোলারওয়েট; // মলে রূপান্তর করে

  রিটার্ন মোলস;
}

// নমুনা কল:
মাইমোলস = গেটমোলস ফ্রমমাস (1000, myEnum.ChemTypees.Na2SiF6);
// * বা *
মাইমোলস = গেটমোলস ক্রোমমাস (1000, মাইইনম.চেমটাইপস.সোডিয়ামহেক্সাফ্লুওরোসিলিকেট);
পাবলিক ডাবল গেটস্পিফিকগ্র্যাভিটি (মাইইনম.চেমটাইপস কেম, ডাবল কনক)
{
  // ঘনত্বের ভিত্তিতে রাসায়নিক যৌগের নির্দিষ্ট মাধ্যাকর্ষণ পুনরুদ্ধার করে
  ডাবল এসএজি = স্পেসিফিকগ্রাভিটিলুকআপ টেবিলবাইচেম (কেম, কনক);  
}

সুতরাং যৌগিক নামের এনাম একটি কী হিসাবে ব্যবহৃত হয় এবং সম্পর্কিত ফাংশনগুলির সাথে যৌগিক রেফারেন্সে ধারাবাহিকতা সরবরাহ করে।


7
তাদের কেন এনাম হতে হবে? সম্ভাব্য যৌগগুলির অসীম পরিমাণ রয়েছে তাই আপনি কখনই সেগুলি সব সেট করতে সক্ষম হবেন না
ratchet freak

3
রসায়নবিদ নয়, প্রোগ্রামার হিসাবে আমি দেখতে পেয়েছি যে Na2SiF6 এবং সোডিয়াম হেক্সাফ্লুওরোসিলিকেট সমানভাবে অস্পষ্ট। প্রাক্তনটি টাইপ করতে সংক্ষিপ্ত এবং সম্ভবত 40-চর-বাই-আইডেন্টিফায়ার কোডিং নিয়মগুলি অদ্ভুত নয়।
mouviciel

5
প্রোগ্রামার হিসাবে আমি ব্যক্তিগতভাবে মনে করি যে সোডিয়াম আমার আঙ্গুলগুলি Na2 এর চেয়ে দ্রুত গতিতে নামতে চলেছে - টাইপ করার সময় শব্দগুলি আমার পক্ষে সহজ প্রবাহিত হয় (আমি এই কারণে হাঙ্গেরিয়ান স্বীকৃতি ঘৃণা করি)।
ড্রার ক্লারিস

5
এগুলি এনাম মান হওয়া উচিত নয়, Substanceতাদের প্রয়োজনীয় সম্পত্তিগুলির উদাহরণ হতে হবে।
আকাশম

2
@ গ্লেনএইচ 7: কেবলমাত্র "মেটা" তে আপনার প্রশ্নটি পড়ুন। আমি মনে করি এখানে কিছু লোকের আসল সমস্যাটি হল "কেন রাসায়নিক নামগুলি কোডটিতে মোটেই থাকতে হবে"? কেবলমাত্র কিছু আকারের ডেটা হিসাবে এই নামগুলি রাখলে আপনার কোডটি খুব দীর্ঘ নাম দিয়ে গোলমাল এড়াতে পারে এবং আপনার সিস্টেমের ব্যবহারকারীর পছন্দ মতো আপনি নামগুলি বেছে নিতে পারেন, কোনও বিকাশকারী তাদের সম্পর্কে কী ভাবতে পারে তা থেকে স্বাধীনভাবে। এটি ব্যবহারকারীর কাছে নামকরণের দায়িত্ব অর্পণ করবে এবং আপনার সমস্যা সম্পূর্ণরূপে এড়াবে।
ডক ব্রাউন

উত্তর:


9

আমি যখন আমার বর্তমান প্রকল্পটি স্প্যাগেটি থেকে যুক্তিসঙ্গত কোডে আবার লিখতে শুরু করি তখন আমি একই সমস্যার মুখোমুখি হয়েছিলাম। আমার সমস্যা ডোমেনটি মেডিকেল, এবং আমার এনামগুলির জন্য "ETCO2" এবং "SPO2" এর মতো নামগুলি ব্যবহার করার পরিবর্তে আমি পুরো ইংরেজী নাম ব্যবহার করি।

একদিকে, আমি যখন সমস্যা ডোমেনে নতুন ছিলাম তখন ইংরেজী নামগুলি রাখা খুব দরকারী। অন্যদিকে, এখন আমি এই শর্তগুলির সাথে এক বছর ধরে কাজ করে দেখছি যে পুরো ইংরেজী নামগুলি খুব ভার্জোজ এবং আমি সংক্ষিপ্ত বিবরণগুলি ব্যবহার করতে বেশি পছন্দ করি এমন পদগুলির সাথে আমি যথেষ্ট পরিচিত।

আমার পরামর্শটি হ'ল পারমাণবিক সূত্রটি ব্যবহার করা এবং প্রতিটি এনাম মান দ্বারা একটি মন্তব্য অন্তর্ভুক্ত করা উচিত যা এই পুরো ধারণাটি দেয় যে এই ধারণাটি অনুসারে যে আপনার কোডটি দেখেন সে হয় ক) একজন রসায়নবিদ, বা খ) কোডটিতে দীর্ঘ সময় কাজ করছে যে তারা সূত্রের সাথে স্বাভাবিকভাবে পরিচিত হন become


1
+1: তদ্ব্যতীত, কেউ সর্বদা "ETCO2" বা "Na2SiF6" সন্ধান করতে পারে এবং এটি দিয়ে সম্পন্ন হতে পারে।
স্টিভেন এভার্স

5

কোডটির জন্য শ্রোতা কে? রসায়নবিদরা কি রসায়নের নির্দিষ্ট ডোমেন প্রশিক্ষণ ছাড়াই এনামগুলি, বা কেবল প্রোগ্রামার ব্যবহার করবেন?

যদি রসায়নবিদরা কোডটি ব্যবহার করছেন, তাদের জিজ্ঞাসা করুন। খুব সম্ভবত তারা সংক্ষিপ্ত চিহ্নগুলি পছন্দ করবে, কারণ তারা সহজেই এগুলি সনাক্ত করতে পারে। যদি সাধারণ-জ্ঞান প্রোগ্রামাররা রসায়নবিদদের পক্ষে এই শনাক্তকারীদের ব্যবহার করে থাকেন তবে আমি মনে করি যে ইংরেজী মত সংস্করণগুলি সহ আরও ভাল।


এটি কেবল প্রোগ্রামার হবে, রসায়নবিদ নয়

1
বা প্রতিটি এনুমের ডকুমেন্টেশনে অনুবাদ যুক্ত করুন
রাচেট ফ্রিক

4

"উপরের সমস্তগুলি" একত্রিত করার কোনও কারণ নেই।

পূর্ণ নামগুলির সাথে সমস্যাটি এটি টাইপ করা ক্লান্তিকর হবে, প্রতীক নামগুলির সাথে সমস্যাটির অর্থের অভাব।

সুতরাং, পূর্ণ নাম সহ মানগুলির ধ্রুবক তৈরি করুন। তারপরে ধ্রুবকের সাথে যুক্ত সংজ্ঞা তৈরি করুন। আপনি সংক্ষিপ্তসার অর্থের সাথে আরও পরিচিত হওয়ার সাথে সাথে আপনি সহজেই আরও নতুন তৈরি করতে পারবেন, সংক্ষিপ্ততর সংজ্ঞায়িত করুন।

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

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

আমি কিছু বোর্কা সি কোড নমুনা ব্যবহার করেছি ... আমি মনে করি এটি সি # তে সহজেই অনুবাদ করা উচিত।
ড্যানিয়েল

আমি কোনও নির্দিষ্ট বাস্তবায়ন সম্পর্কে তেমন উদ্বিগ্ন নই যে কারণে আমি আমার প্রশ্নে সি # নির্দিষ্ট করে নি। এবং আমি আপনার পরামর্শটি সি দৃষ্টিকোণ থেকে পছন্দ করেছি। সিস্টেম.কম্পোনেন্টমোডেল থেকে সি # বিবরণ ট্যাগ যদিও বর্ণনাকারী যুক্ত করার জন্য একটি দুর্দান্ত উপায়। আমি একটি নির্দিষ্ট বাস্তবায়ন নিয়ে প্রশ্নের বিস্তৃত উত্তর সম্পর্কে আরও আগ্রহী ছিলাম।

3

আপনি যখন কোনও অ্যাপ্লিকেশন ডিজাইন করেন, আপনার প্রোগ্রামের যুক্তি থেকে ডেটা আলাদা করা উচিত। রাসায়নিক যৌগগুলি কি আসলে প্রোগ্রাম লজিকের অংশ এবং প্রোগ্রাম লজিক যে ডেটাটিতে কাজ করে তা নয়?

যখন তারা ডেটা হয়, তাদের এনাম হিসাবে বিবেচনা না করে বরং একটি কনফিগারেশন ফাইল থেকে তাদের নাম এবং বৈশিষ্ট্যগুলি পড়তে এবং সেগুলি ডেটা কাঠামোর মধ্যে সঞ্চয় করা আরও ভাল। এটি রক্ষণাবেক্ষণকে অনেক সহজ করে তুলবে। যখন কাউকে নতুন যৌগ যুক্ত করার প্রয়োজন হয় বা এর বৈশিষ্ট্যগুলির মধ্যে একটি ত্রুটি খুঁজে পাওয়া যায়, তারা কেবল কনফিগারেশন ফাইলটি সম্পাদনা করতে পারে।


1
+1 @ গ্লেনএইচ 7 এটি সাহায্য করবে যদি আপনি নির্দিষ্ট রাসায়নিক যৌগগুলি কেন কোডের অংশ হয় তা ব্যাখ্যা করতে পারতেন , বিশেষত আপনি যখন বলেছিলেন যে "সমীকরণ সমস্ত যৌগের জন্য সমান।"
কালেব

1
@ গ্লেনএইচ 7: এখনও রাসায়নিক কারণগুলি কেবল ডেটা নয় no বেশ কয়েকটি পোস্টার আপনাকে এনাম ব্যবহার না করার জন্য সহায়কভাবে বলছে। আমি অবশ্যই না।
কেভিন ক্লাইন করুন

1
@ কেভিঙ্কলাইন এবং কালেব (এবং অন্য সবাই প্রকৃতপক্ষে), আমি কীভাবে এই প্রশ্নটির কাঠামো তৈরি করতে এবং এর এনাম দিকটি সম্পর্কে সহায়তা চেয়ে একটি মেটা প্রশ্ন তৈরি করেছি। আমি আপনার মতামত কৃতজ্ঞ হবে।

3
ঠিক আছে, যখন কেউ আপনার কাছে একটি ছুরি আটকে যায় তার মাথায়, এবং তিনি আপনাকে তাঁর হাতের স্প্লিন্টারের দিকে নজর দিতে বলেন, তাতে মনোনিবেশ করা শক্ত।
ফিলিপ

1
@ কালেব - এনামের ব্যবহার আরও ভালভাবে পরিষ্কার করতে প্রশ্ন আপডেট হয়েছে।

3

এটি দেখে মনে হচ্ছে এটি বিকাশকারীদের প্রয়োজনের ভিত্তিতে প্রসারিত এবং অনুবাদ করতে পারে এমন শ্রেণি হিসাবে আরও ভালভাবে প্রয়োগ করা যেতে পারে। নীচে কিছু নমুনা সি # আমি কয়েকটি সুপরিচিত সংজ্ঞায়িত কেমিক্যাল (সম্পত্তি হিসাবে) এবং তারপরে অনুসন্ধানযোগ্য স্টোরগুলি (মাধ্যমে 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);

উত্তরের জন্য ধন্যবাদ, এবং আমি যা লক্ষ্য করছি তার মধ্যে আমি আরও কিছুটা পরিষ্কার হওয়ার জন্য আমার প্রশ্নটি আপডেট করেছি। আমি রাসায়নিকের যৌগের নাম পাওয়ার জন্য এতটা চিন্তিত নই কারণ আমি বিভিন্ন সারণী এবং এ জাতীয় থেকে এর বৈশিষ্ট্য অ্যাক্সেস করে চলেছি। এনাম আলোচনায় আমার যুক্ত হওয়া উচিত কি না, সে সম্পর্কে আমার একটি উন্মুক্ত মেটা প্রশ্ন রয়েছে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.