어색한 도메인 특정 객체의 이름을 지정하는 데 지침이 있습니까?


12

화학 시스템을 모델링하고 있으며 열거 형 내에서 요소 / 항목의 이름을 지정하는 데 문제가 있습니다.

내가 사용 해야하는지 확실하지 않습니다.

  • 원 자식
  • 화학명
  • 약칭 화학명.

예를 들어, 황산은 H2SO4이고 염산은 ​​HCl입니다.

이 두 가지를 사용하면 원자 공식이 합리적으로 일반적이기 때문에 아마도 아마도 원자 공식을 사용할 것입니다.

그러나 Na2SiF6 인 나트륨 헥사 플루오로 실리케이트와 같은 다른 제품이 있습니다.

이 예에서 원자 공식은 나에게 명백하지 않지만 화학 이름은 엄청나게 길다 myEnum.SodiumHexaFluoroSilicate. 일관된 이름 지정 패턴을 갖는 약칭 화학 이름을 어떻게 안전하게 얻을 수 있는지 잘 모르겠습니다.

열거 형 요소의 이름을 지정하여 해결하려는 몇 가지 문제가 있습니다.
첫 번째는 가독성이며 긴 이름은 문제를 나타냅니다.
두 번째는 새로운 관리자를위한 코드를 쉽게 찾을 수있는 것입니다. 여기서 짧은 이름은 문제를 나타냅니다.
다음 문제는 비즈니스 소유자가 일반적으로 전체 화학명을 언급하지만 항상 그런 것은 아닙니다. "중대한"화학 물질은 그들의 공식에 의해 언급됩니다.
마지막 관심사는 일관성을 유지하는 것입니다. 사용할 이름을 기억하는 것이 불가능하기 때문에 혼합 명명 규칙을 원하지 않습니다 .

유지 관리 관점에서, 위의 명명 옵션 중 어떤 것을 선호하고 왜 그 이유를 알고 싶습니까?


참고 :이 줄 아래에있는 모든 내용은 보충적입니다. 명확한 재료. 그 속에 갇히지 마십시오. 주요 질문은 어색한 객체의 이름을 지정하는 것과 관련이 있습니다.

원자 옵션

공개 myEnum.ChemTypes
{  
   H2SO4,
   HCl,
   Na2SiF6
}

화학 물질 이름 옵션

공개 myEnum.ChemTypes
{
   황산,
   염산,
   나트륨 헥사 플루오로 실리케이트  
}

이 질문에 대한 의견의 추가 세부 정보는 다음과 같습니다.

  • 코드의 대상은 화학자가 아닌 프로그래머 일뿐 입니다.
  • C #을 사용하고 있지만 구현 언어를 무시할 때이 질문이 더 흥미 롭습니다.
  • 저는 10-20 개의 화합물로 시작하고 최대 100 개의 화합물을 가지므로 가능한 모든 화합물 에 대해 걱정할 필요가 없습니다 . 다행히도 고정 도메인입니다.
  • 열거 형은 일반적인 / 일반적인 화학 계산을 용이하게하기 위해 조회의 열쇠로 사용됩니다. 즉, 모든 화합물에 대해 방정식이 동일하지만 방정식을 완성하기 위해 화합물의 속성을 삽입합니다.

샘플 함수는 다음과 같습니다.

공개 double GetMolesFromMass (더블 질량 _ 그램, myEnum.ChemTypes 화학)
{
  이중 분자량 = MolarWeightLookupFyctionByChem (chem); // 그램 / 몰을 반환
  이중 몰 = 질량 / 몰 무게; // 두더지로 변환

  반점;
}

// 샘플 호출 :
myMoles = GetMolesFromMass (1000, myEnum.ChemTypes.Na2SiF6);
//*또는*
myMoles = GetMolesFromMass (1000, myEnum.ChemTypes.SodiumHexafluorosilicate);
공공 이중 GetSpecificGravity (myEnum.ChemTypes 화학, 이중 광)
{
  // 농도에 따라 화합물의 비중을 구합니다
  이중 sg = SpecificGravityLookupTableByChem (chem, conc);  
}

따라서 화합물 이름의 열거 형은 키로 사용되며 관련 기능과 함께 화합물을 참조 할 때 일관성을 제공합니다.


7
왜 열거 형이어야합니까? 가능한 화합물의 양이 무한하므로 절대로 모든 것을 설정할 수는 없습니다.
ratchet freak

3
화학자가 아닌 프로그래머로서 Na2SiF6헥사 플루오로 규산 나트륨 이 똑같이 불분명 하다는 것을 알게되었습니다 . 전자는 입력하기가 더 짧으며, 40 자 이하의 이상한 문자 별 코딩 규칙을 통과 할 가능성이 높습니다.
mouviciel

5
프로그래머로서 저는 개인적으로 Sodium이 Na2보다 손가락을 빨리 off다고 생각합니다. 타이핑 할 때 단어가 더 쉽게 흐르는 경향이 있습니다 (이러한 이유로 헝가리 표기법이 싫습니다).
Drake Clarris

5
열거 형 값이 아니어야하며 Substance필요한 속성 이있는 인스턴스 여야 합니다.
AakashM

2
@ GlenH7 : "meta"에 대한 질문을 읽으십시오. 여기 사람들의 실제 문제는 "화학명은 왜 코드에 있어야합니까?"라고 생각합니다. 특정 형식의 데이터로만 이러한 이름을 사용하면 매우 긴 이름으로 코드를 복잡하게 만들 수 없으며 개발자가 생각하는 것과는 별도로 시스템 사용자가 선호하는 것처럼 이름을 선택할 수 있습니다. 이름 지정 책임을 사용자에게 위임하고 문제를 완전히 피할 수 있습니다.
Doc Brown

답변:


9

스파게티에서 현재 프로젝트를 합리적인 코드로 다시 작성하기 시작했을 때도 같은 문제에 직면했습니다. 내 문제 도메인은 의학이며, 열거 형에 "ETCO2"및 "SPO2"와 같은 이름을 사용하는 대신 전체 영어 이름을 사용했습니다.

한편으로, 문제 영역을 처음 접했을 때 영어 이름을 갖는 것이 매우 유용했습니다. 다른 한편으로, 나는 1 년 동안이 용어들을 다루어 왔기 때문에 전체 영어 이름이 너무 장황하다는 것을 알았고 나는 약어를 사용하기를 선호하는 용어에 익숙하다.

내 조언은 원자 수식을 사용하고 코드를 보는 사람이 a) 화학자 또는 b) 코드를 오랫동안 연구 할 것이라는 가정하에 전체 이름을 나타내는 각 열거 형 값으로 주석을 포함시키는 것입니다. 그들은 자연스럽게 공식에 익숙해집니다.


1
+1 : 게다가, 항상 "ETCO2"또는 "Na2SiF6"을 찾아서 수행 할 수 있습니다.
Steven Evers

5

코드의 독자는 누구입니까? 화학자는 화학 분야에서 특정 도메인 교육없이 Enum을 사용합니까, 아니면 프로그래머 만 사용합니까?

화학자가 코드를 사용한다면 물어보십시오. 그들은 쉽게 그것을 인식 할 수 있기 때문에 약식 기호를 선호 할 것입니다. 일반 지식 프로그래머가 화학자를 대신하여 이러한 식별자를 사용하는 경우 영어와 비슷한 버전을 사용하는 것이 좋습니다.


그것은 화학자가 아닌 단지 프로그래머 일 것입니다

1
또는 각 열거 형의 문서에 번역을 추가하십시오
ratchet freak

4

"위의 모든 것"을 결합하지 않을 이유가 없습니다.

전체 이름의 문제는 입력하기가 지루하고 기호 이름의 문제는 의미가 없다는 것입니다.

따라서 전체 이름으로 상수 값을 작성하십시오. 그런 다음 상수와 연관된 정의를 작성하십시오. 약어의 의미에 익숙해지면서 새롭고 더 짧은 정의를 쉽게 작성할 수 있습니다.

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

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

나는 borked C 코드 샘플을 사용했다 ... 나는 C #으로 쉽게 번역해야한다고 생각한다.
Daniel

나는 특정 구현에 대해 걱정하지 않아서 내 질문에 C #을 지정하지 않은 이유입니다. 그리고 저는 C 관점에서 당신의 제안을 좋아했습니다. System.ComponentModel의 C # Description 태그는 설명자를 추가하는 우아한 방법입니다. 특정 구현에 대한 질문에 대한 광범위한 답변에 더 관심이있었습니다.

3

응용 프로그램을 설계 할 때는 데이터를 프로그램 논리와 분리해야합니다. 화합물은 실제로 프로그램 로직의 일부이며 프로그램 로직이 작동하는 데이터가 아닌가?

이들이 데이터 일 때 열거 형으로 취급하지 않고 구성 파일에서 이름과 속성을 읽고 데이터 구조에 저장하는 것이 훨씬 좋습니다. 또한 유지 관리가 훨씬 쉬워집니다. 새 화합물을 추가해야하거나 속성에 오류가있는 경우 구성 파일을 편집하면됩니다.


1
+1 @ GlenH7 특정 화학 화합물이 코드의 일부 인지 설명 할 수 있다면 , 특히 "모든 화합물에 대해 방정식이 동일하다"고 말하면 도움이 될 것 입니다.
Caleb

1
@ GlenH7 : 화학 물질이 단순한 데이터가 아닌 이유는 없습니다. 몇몇 포스터는 열거 형을 사용하지 말라고 도움을줍니다. 나는 확실히하지 않을 것입니다.
케빈 클라인

1
@ kevincline & caleb (및 다른 모든 사람들), 나는 이 질문과 그 열거 형을 구성하는 방법에 대한 도움을 요청 하는 메타 질문 을 만들었 습니다. 귀하의 의견에 감사드립니다.

3
글쎄, 누군가가 그의 머리에 칼날이 붙어서 당신에게 올 때, 그는 당신에게 그의 파편을 보라고 요구하면, 그것에 집중하기가 어렵습니다.
Philipp

1
@Caleb-열거 형 사용을보다 명확하게하기 위해 질문이 업데이트되었습니다.

3

이것은 개발자의 요구에 따라 확장하고 번역 할 수있는 클래스로 더 잘 구현 될 수있는 것처럼 보입니다. 다음은 몇 가지 잘 알려진 화학 물질 (속성)과 쿼리 가능한 매장 ( AddGet방법) 을 허용하기 위해 작성한 샘플 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.