Hướng dẫn trong việc đặt tên các đối tượng cụ thể miền khó xử?


12

Tôi đang lập mô hình một hệ thống hóa học và tôi gặp vấn đề với việc đặt tên các thành phần / vật phẩm của mình trong một enum.

Tôi không chắc có nên sử dụng không:

  • công thức nguyên tử
  • tên hóa học
  • một tên hóa học viết tắt.

Ví dụ, axit sunfuric là H2SO4 và axit clohydric là HCl.

Với hai thứ đó, tôi có lẽ sẽ chỉ sử dụng công thức nguyên tử vì chúng khá phổ biến.

Tuy nhiên, tôi có những loại khác như natri hexafluorosilicate là Na2SiF6.

Trong ví dụ đó, công thức nguyên tử không rõ ràng (với tôi) nhưng tên hóa học thì dài vô cùng : myEnum.SodiumHexaFluoroSilicate. Tôi không chắc làm thế nào tôi có thể đến một cách an toàn với một tên hóa học viết tắt sẽ có một mẫu đặt tên nhất quán.

Có một vài vấn đề mà tôi đang cố gắng giải quyết thông qua việc đặt tên cho các yếu tố enum.
Đầu tiên là khả năng đọc, với các tên dài hơn trình bày một vấn đề.
Thứ hai là dễ dàng chọn mã cho các nhà bảo trì mới, và ở đây các tên ngắn hơn trình bày một vấn đề.
Vấn đề tiếp theo là các chủ doanh nghiệp thường đề cập đến tên hóa học đầy đủ, nhưng không phải lúc nào cũng vậy. Các hóa chất "vừa miệng" được gọi theo công thức của họ.
Mối quan tâm cuối cùng là đảm bảo nó phù hợp. Tôi không phải là một quy ước đặt tên hỗn hợp vì sẽ không thể nhớ nên sử dụng cái nào.

Từ quan điểm bảo trì, bạn muốn xem tùy chọn đặt tên nào ở trên và tại sao?


Lưu ý: Tất cả mọi thứ ở đây bên dưới dòng là bổ sung | làm rõ tài liệu. Xin đừng sa lầy vào nó. Câu hỏi chính liên quan đến việc đặt tên cho các đối tượng vụng về.

Tùy chọn nguyên tử

công khai myEnum.ChemTypes
{  
   H2SO4,
   HCl,
   Na2SiF6
}

Tùy chọn tên hóa học

công khai myEnum.ChemTypes
{
   SulfuricAcid,
   Axit hydrochloric,
   NatriHexafluorosilicate  
}

Dưới đây là một số chi tiết bổ sung từ các ý kiến ​​về câu hỏi này:

  • Khán giả cho mã sẽ chỉ là lập trình viên, không phải nhà hóa học.
  • Tôi đang sử dụng C #, nhưng tôi nghĩ câu hỏi này thú vị hơn khi bỏ qua ngôn ngữ thực hiện.
  • Tôi bắt đầu với 10 - 20 hợp chất và sẽ có tối đa 100 hợp chất, vì vậy tôi không cần phải lo lắng về mọi hợp chất có thể. May mắn thay, đó là một miền cố định.
  • Enum được sử dụng làm chìa khóa để tra cứu để tạo điều kiện cho các tính toán hóa học chung / chung - có nghĩa là phương trình giống nhau cho tất cả các hợp chất nhưng bạn chèn một thuộc tính của hợp chất để hoàn thành phương trình.

Một hàm mẫu có thể trông giống như:

công khai gấp đôi GetMolesFromMass (gấp đôi mass_grams, myEnum.ChemTypes chem)
{
  mol mol đôi = MolarightLookupFunctionByChem (chem); // trả về gram / mol
  nốt ruồi kép = khối lượng / mol trọng lượng; // chuyển thành nốt ruồi

  nốt ruồi trở lại;
}

// Gọi mẫu:
myMoles = GetMolesFromMass (1000, myEnum.ChemTypes.Na2SiF6);
//*hoặc là*
myMoles = GetMolesFromMass (1000, myEnum.ChemTypes.SodiumHexafluorosilicate);
công khai gấp đôi GetSpecificGravity (myEnum.ChemTypes chem, double conc)
{
  // lấy trọng lượng riêng của hợp chất hóa học dựa trên nồng độ
  double sg = Cụ thểGravityLookupTableByChem (chem, conc);  
}

Vì vậy, enum của tên ghép được sử dụng làm khóa và để cung cấp tính nhất quán trong việc tham chiếu hợp chất với các hàm liên quan.


7
Tại sao họ cần phải là enums? có vô số hợp chất có thể, do đó bạn sẽ không bao giờ có thể thiết lập tất cả
ratchet freak

3
Là một lập trình viên, không phải nhà hóa học, tôi thấy rằng Na2SiF6natri hexafluorosilicate đều tối nghĩa như nhau. Cái trước ngắn hơn để gõ và rất có thể vượt qua các quy tắc mã hóa không-hơn-40-chars-by-nhận dạng kỳ lạ.
mouviciel

5
Là một lập trình viên, cá nhân tôi nghĩ rằng Natri sẽ lăn ra khỏi ngón tay của tôi nhanh hơn Na2 - các từ có xu hướng dễ dàng hơn đối với tôi khi gõ (tôi ghét ký hiệu Hungary vì lý do này).
Drake Clarris

5
Chúng không nên là giá trị enum, chúng phải là ví dụ Substancevới bất kỳ thuộc tính nào chúng cần.
AakashM

2
@ GlenH7: chỉ cần đọc câu hỏi của bạn về "meta". Tôi nghĩ vấn đề thực sự ở đây đối với một số người ở đây là "tại sao tên hóa học phải có trong mã"? Chỉ có những tên đó dưới dạng một số dạng dữ liệu sẽ tránh làm lộn xộn mã của bạn với những tên rất dài và bạn có thể chọn tên giống như người dùng hệ thống của bạn thích, độc lập với những gì nhà phát triển có thể nghĩ về chúng. Điều đó sẽ ủy thác trách nhiệm đặt tên cho người dùng và tránh hoàn toàn vấn đề của bạn.
Doc Brown

Câu trả lời:


9

Khi tôi bắt đầu viết lại dự án hiện tại của mình từ spaghetti thành mã hợp lý, tôi đã gặp phải vấn đề tương tự. Miền vấn đề của tôi là y tế, và thay vì sử dụng các tên như "ETCO2" và "SPO2" cho enum của tôi, tôi đã sử dụng tên đầy đủ bằng tiếng Anh.

Một mặt, rất hữu ích khi có tên tiếng Anh khi tôi chưa quen với miền có vấn đề. Mặt khác, bây giờ tôi đã làm việc với các thuật ngữ này trong một năm, tôi thấy rằng các tên tiếng Anh đầy đủ quá dài dòng và tôi đủ quen thuộc với các thuật ngữ mà tôi thích sử dụng các từ viết tắt.

Lời khuyên của tôi là sử dụng công thức nguyên tử và bao gồm một nhận xét theo từng giá trị enum có tên đầy đủ của nó, với giả định rằng bất kỳ ai nhìn vào mã của bạn sẽ là một) nhà hóa học hoặc b) làm việc với mã đủ lâu rằng họ tự nhiên trở nên quen thuộc với các công thức.


1
+1: Bên cạnh đó, người ta luôn có thể tra cứu "ETCO2" hoặc "Na2SiF6" và được thực hiện với nó.
Steven Evers

5

Khán giả cho mã là ai? Các nhà hóa học sẽ sử dụng Enums, hoặc chỉ lập trình viên mà không đào tạo tên miền cụ thể về hóa học?

Nếu các nhà hóa học sẽ sử dụng mã, hãy hỏi họ. Rất có khả năng họ sẽ thích các ký hiệu viết tắt, vì họ có thể dễ dàng nhận ra chúng. Nếu các lập trình viên có kiến ​​thức chung sẽ sử dụng các định danh này thay mặt cho các nhà hóa học, tôi nghĩ sẽ tốt hơn nếu đi với các phiên bản giống như tiếng Anh.


nó sẽ chỉ là lập trình viên, không phải nhà hóa học

1
hoặc thêm bản dịch vào tài liệu của từng enum
ratchet freak

4

Không có lý do để không kết hợp "tất cả các bên trên."

Vấn đề với tên đầy đủ là sẽ rất tẻ nhạt khi gõ, vấn đề với tên biểu tượng là thiếu ý nghĩa.

Vì vậy, tạo hằng số của các giá trị với tên đầy đủ. Sau đó tạo định nghĩa liên kết với hằng số. Sau đó, bạn có thể dễ dàng tạo các định nghĩa mới hơn, ngắn hơn khi bạn trở nên quen thuộc hơn với ý nghĩa của từ viết tắt.

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

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

Tôi đã sử dụng một số mẫu mã C borked ... Tôi nghĩ rằng nó nên dịch sang C # đủ dễ dàng.
Daniel

Tôi không lo lắng về việc triển khai cụ thể, đó là lý do tại sao tôi không chỉ định C # trong câu hỏi của mình. Và tôi thích đề xuất của bạn từ quan điểm C. Thẻ Mô tả C # từ System.ComponentModel là một cách thanh lịch để thêm bộ mô tả. Tôi đã quan tâm nhiều hơn đến câu trả lời rộng hơn cho câu hỏi về một triển khai cụ thể.

3

Khi bạn thiết kế bất kỳ ứng dụng nào, bạn nên tách dữ liệu khỏi logic chương trình. Các hợp chất hóa học có thực sự là một phần của logic chương trình chứ không phải là dữ liệu mà logic chương trình đang hoạt động?

Khi chúng là dữ liệu, sẽ tốt hơn nhiều nếu không coi chúng là enum mà là đọc tên và thuộc tính của chúng từ tệp cấu hình và lưu trữ chúng trong cấu trúc dữ liệu. Điều đó cũng sẽ làm cho việc bảo trì dễ dàng hơn rất nhiều. Khi cần thêm các hợp chất mới hoặc tìm thấy lỗi trong các thuộc tính của một, chúng chỉ có thể chỉnh sửa tệp cấu hình.


1
+1 @ GlenH7 sẽ hữu ích nếu bạn có thể giải thích tại sao các hợp chất hóa học cụ thể là một phần của mã, đặc biệt là sau khi bạn nói rằng "phương trình là giống nhau cho tất cả các hợp chất."
Caleb

1
@ GlenH7: Vẫn không có lý do tại sao các hóa chất không chỉ là dữ liệu. Một số áp phích rất hữu ích cho bạn biết không sử dụng enum. Tôi chắc chắn sẽ không.
kevin cline

1
@kevincline & caleb (và tất cả những người khác thực sự), tôi đã tạo một câu hỏi meta yêu cầu trợ giúp về cách cấu trúc câu hỏi này và khía cạnh enum của nó. Tôi muốn đánh giá phản hồi của bạn.

3
Chà, khi ai đó đến với bạn với một cái nút bị mắc kẹt trong đầu anh ta, và anh ta yêu cầu bạn nhìn vào mảnh vỡ trong tay anh ta, thật khó để tập trung vào điều đó.
Phi

1
@Caleb - Câu hỏi được cập nhật để làm rõ hơn việc sử dụng enum.

3

Điều này có vẻ như có thể được triển khai tốt hơn như là một lớp có thể mở rộng và dịch dựa trên nhu cầu của các nhà phát triển. Dưới đây là một số mẫu C # tôi đã đưa ra để cho phép một vài hóa chất được xác định nổi tiếng (như thuộc tính) và sau đó lưu trữ truy vấn (thông qua AddGetphương thức). Bạn cũng có thể mở rộng khá dễ dàng để có khối lượng mol và các tính chất hóa học khá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;
    }
}

bạn có thể thêm các hóa chất mới như vậy:

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

và nhận các bit khác như vậy:

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

Cảm ơn câu trả lời và tôi đã cập nhật câu hỏi của mình để rõ ràng hơn một chút về những gì tôi đang nhắm mục tiêu. Tôi không quá lo lắng về việc lấy tên của hợp chất hóa học như tôi đang truy cập các thuộc tính của nó từ nhiều bảng khác nhau. Tôi có một câu hỏi meta mở về việc tôi có nên thêm vào cuộc thảo luận về enum hay để chia nó thành một Q. riêng biệt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.