Công ước đặt tên Enum - số nhiều


267

Tôi đang hỏi câu hỏi này mặc dù đã đọc tương tự nhưng không chính xác những gì tôi muốn tại quy ước đặt tên C # cho enum và thuộc tính phù hợp

Tôi thấy rằng tôi có xu hướng đặt tên enums ở số nhiều và sau đó 'sử dụng' chúng dưới dạng số ít, ví dụ:

public enum EntityTypes {
  Type1, Type2
}

public class SomeClass {
  /*
    some codes
  */

  public EntityTypes EntityType {get; set;}

}

Tất nhiên nó hoạt động và đây là phong cách của tôi, nhưng bất cứ ai cũng có thể tìm thấy vấn đề tiềm năng với quy ước như vậy? Tôi có một cách đặt tên "xấu xí" với từ "Status":

public enum OrderStatuses {
  Pending, Fulfilled, Error, Blah, Blah
}

public class SomeClass {
  /*
    some codes
  */

  public OrderStatuses OrderStatus {get; set;}

}

Thông tin bổ sung: Có thể câu hỏi của tôi không đủ rõ ràng. Tôi thường phải suy nghĩ kỹ khi đặt tên các biến của các loại enum được xác định của tôi. Tôi biết cách thực hành tốt nhất, nhưng nó không giúp tôi dễ dàng đặt tên cho các biến đó.

Tôi có thể không thể tiết lộ tất cả các thuộc tính enum của mình (nói "Trạng thái") là "MyStatus".

Câu hỏi của tôi: Bất cứ ai cũng có thể tìm thấy vấn đề tiềm năng với quy ước của tôi được mô tả ở trên? Nó KHÔNG phải là về thực hành tốt nhất.

Câu hỏi viết lại:

Chà, tôi đoán tôi nên đặt câu hỏi theo cách này: Ai đó có thể đưa ra một cách chung chung để đặt tên loại enum sao cho khi sử dụng, việc đặt tên của enum 'dụ' sẽ khá đơn giản?


5
chung enum OrderState ... - OrderState OrderStatus {get; thiết lập;}
Fraser

Câu trả lời:


333

Microsoft khuyên bạn nên sử dụng số ít cho Enums trừ khi các trường Enumđại diện cho bit (cũng sử dụng trường bit FlagsAttribute). Xem Quy ước đặt tên kiểu liệt kê (một tập hợp con của Nguyên tắc đặt tên của Microsoft ).

Để trả lời làm rõ của bạn, tôi thấy không có gì sai với một trong những điều sau đây:

public enum OrderStatus { Pending, Fulfilled, Error };

public class SomeClass { 
    public OrderStatus OrderStatus { get; set; }
}

hoặc là

public enum OrderStatus { Pending, Fulfilled, Error };

public class SomeClass {
    public OrderStatus Status { get; set; }
}

20
Vâng, đây là một câu trả lời đúng. Hướng dẫn này được sử dụng trong .Net Framework, ví dụ enum DayOfWeek và gắn cờ enum RegexOptions.
Alexander Zwitbaum

1
Vâng, đây là thực hành được đề nghị, tôi hoan nghênh nó. Tuy nhiên nó không trả lời câu hỏi của tôi.
okw

1
@okw để giải thích thêm, mặc dù nó trông xấu, nếu bạn cần một giá trị duy nhất từ ​​một cờ enum, hãy sử dụng dạng số ít cho trường / thuộc tính / đối số. Nếu bạn hỗ trợ nó có nhiều cờ được đặt, hãy sử dụng số nhiều. Nếu enum của bạn không phải là cờ enum, hãy sử dụng số ít cho tên loại và trường / thuộc tính / đối số.
Jonathan Dickinson

4
Dưới đây là liên kết đến phiên bản .Net 4.0 của hướng dẫn quy ước đặt tên của Microsoft được liên kết trong câu trả lời.

1
@Thomas Tôi chưa bao giờ gặp vấn đề với nó, tôi không thể hiểu tại sao nó không hoạt động - không thấy một bối cảnh mà nó sẽ mơ hồ cho dù đó là một loại hoặc biến được tham chiếu. tức OrderStatus == OrderStatus.Pendinglà được công nhận là một biến cho bên trái và sau đó là một bảng liệt kê ở bên phải
James Hurley

39

Tôi bắt đầu đặt tên enums ở số nhiều nhưng từ đó đã đổi thành số ít. Dường như có ý nghĩa hơn trong bối cảnh nơi chúng được sử dụng.

enum Status { Unknown = 0, Incomplete, Ready }

Status myStatus = Status.Ready;

So với:

Statuses myStatus = Statuses.Ready;

Tôi tìm thấy hình thức số ít để âm thanh tự nhiên hơn trong bối cảnh. Chúng tôi đồng ý rằng khi tuyên bố enum, xảy ra ở một nơi, chúng tôi nghĩ rằng "đây là một nhóm người hay nói", nhưng khi sử dụng nó, có lẽ ở nhiều nơi, chúng tôi nghĩ rằng "đây là bất cứ điều gì" .


6
Một chút phản ứng muộn (và có thể hơi lạc đề) nhưng: tôi sẽ đề nghị sử dụng giá trị 0cho giá trị không xác định, theo cách đó, một biến chưa được khởi tạo theo mặc định Unknown.
SvenL

Đồng ý, @SvenL. Cập nhật ví dụ cho phù hợp.
Bob Kaufman

Bạn thực sự sẽ đặt một [Flags]thuộc tính trên ví dụ của bạn? Không có nghĩa gì khi có một trạng thái của cả "Chưa hoàn thành" và "Sẵn sàng". Nếu bạn đã có enum [Flags]Steps { First, Second, Third }, bạn thực sự sẽ đặt tên cho biến của bạn completedStep?
Pakman

26

Tình huống không bao giờ thực sự áp dụng cho số nhiều.

An enumhiển thị một thuộc tính của cái gì đó hoặc cái khác. Tôi sẽ đưa ra một ví dụ:

enum Humour
{
  Irony,
  Sarcasm,
  Slapstick,
  Nothing
}

Bạn có thể có một loại, nhưng hãy thử nghĩ về nó trong nhiều, thay vì số nhiều:

Humour.Irony | Humour.Sarcasm

Thay vì

Humours { Irony, Sarcasm }

Bạn có khiếu hài hước, bạn không có cảm giác nhục nhã.


5
Haha, tốt, các lập trình viên không phải lúc nào cũng đúng về mặt ngữ pháp / chính trị. Trong trường hợp của bạn, tôi có thể sử dụng "HumourTypes". Thói quen xấu tôi đoán.
okw

Điều gì sẽ xảy ra nếu tôi muốn tìm kiếm tất cả các cá nhân có Ý thức về Sarcasm HOẶC có cảm giác trớ trêu, tôi sẽ không vượt qua thói quen tìm kiếm một ví dụ Humourscó chứa Humours.Irony | Huomours.Sarcasm??
Charles Bretana

14

Nói chung, khuyến nghị thực hành tốt nhất là số ít, ngoại trừ những enum có thuộc tính [Cờ] được gắn vào chúng, (và do đó có thể chứa các trường bit), nên ở dạng số nhiều.

Sau khi đọc câu hỏi đã được chỉnh sửa của bạn, tôi có cảm giác bạn có thể nghĩ rằng tên thuộc tính hoặc tên biến phải khác với tên loại enum ... Không. Sau đây là hoàn toàn tốt ...

  public enum Status { New, Edited, Approved, Cancelled, Closed }

  public class Order
  {
      private Status stat;
      public Status Status
      { 
         get { return stat; }
         set { stat = value; }
      }
  }

Đúng, tôi đoán phương pháp của tôi là một cách 'nhanh chóng và lười biếng' để tránh phải nghĩ tên khi sử dụng enum.
okw

1
Để hỗ trợ cho câu trả lời của bạn: trên MSDN, từ Tên của các Thành viên Loại trong phần "Tên của các thuộc tính": ✓ NGƯỜI TIÊU DÙNG cung cấp cho một thuộc tính cùng tên với loại của nó. Ví dụ: public Color Color { get {...} set {...} }
DavidRR

10

Đây là một trong số ít những nơi mà tôi không đồng ý với quy ước đủ để chống lại nó. TBH, tôi ghét rằng định nghĩa của một enum và thể hiện của nó có thể có cùng tên. Tôi đặt hậu tố tất cả các Enums của tôi bằng "Enum" bởi vì nó cho thấy rõ bối cảnh của nó là gì trong bất kỳ cách sử dụng nào. IMO nó làm cho mã dễ đọc hơn nhiều.

public enum PersonTypesEnum {
    smart,
    sad,
    funny,
    angry
}


public class Person {   
    public PersonTypesEnum PersonType {get; set;}
}

Không ai sẽ nhầm lẫn giữa enum là gì và ví dụ của nó là gì.


2
Tôi đến đây để tìm kiếm một quy ước đặt tên enum, sau khi có một lớp và enum được đặt tên giống nhau - và muốn có "một cái gì đó" để làm cho nó rõ ràng hơn. Tôi đã suy nghĩ tiền tố nó với "E" (đối với Enums rõ ràng) giống như chúng ta giao diện tiền tố với "I" - nhưng tôi thích giải pháp của bạn Heather! Đẹp một !!!
Scott

1
Từ guilelines thiết kế của Microsoft: "KHÔNG sử dụng hậu tố" Enum "trong tên loại enum." docs.microsoft.com/en-us/dotnet/stiteria/design-guferences/ory
Thoryn Hawley

3
Có lẽ bạn đã bỏ lỡ câu RẤT ĐẦU TIÊN của những gì tôi nói? Ở đây, hãy để tôi sao chép và dán nó cho bạn: "Đây là một trong số ít những nơi tôi không đồng ý với quy ước đủ để chống lại nó.". Sau đó tôi tiếp tục giải thích tại sao.
Heather

2
Tôi sẽ không đi ngược lại hướng dẫn "bằng mọi cách có thể". Đó là cường điệu. Tôi đang đi ngược lại các hướng dẫn theo một cách cụ thể, duy nhất, được hỗ trợ bởi lý do tôi nêu. Nếu bạn muốn không đồng ý, tốt, hãy liệt kê lý do của bạn để không đồng ý; cường điệu của bạn là không cần thiết và không nâng cao vị trí của bạn.
Heather

1
Nếu có một xung đột không gian tên có thể, tôi thấy không có vấn đề gì với việc thêm Enum? Nó không phải như thể tác giả đang đề xuất tiền tố tất cả các vars với loại của họ. Tác giả cũng có một trường hợp mạnh mẽ hơn nhiều cho rằng một lý do được cung cấp, trong khi M $ cung cấp bằng chứng không.
Jai Govindani

7

Nếu bạn đang cố viết mã đơn giản nhưng bị cấm như thế này:

    public class Person
    {
        public enum Gender
        {
            Male,
            Female
        }
        //Won't compile: auto-property has same name as enum
        public Gender Gender { get; set; }  
    }

Lựa chọn của bạn là:

  1. Bỏ qua khuyến nghị MS và sử dụng tiền tố hoặc hậu tố trên tên enum:

    public class Person
    {
        public enum GenderEnum
        {
            Male,
            Female
        }
        public GenderEnum Gender { get; set; }
    }
  2. Di chuyển định nghĩa enum bên ngoài lớp, tốt nhất là vào một lớp khác. Đây là một giải pháp dễ dàng cho những điều trên:

    public class Characteristics
    {
        public enum Gender
        {
            Male,
            Female
        }
    }
    public class Person
    {
        public Characteristics.Gender Gender { get; set; }  
    }

2
Tình huống giả định và không phải là một giải pháp tốt. Tại sao sử dụng một lồng enumở vị trí đầu tiên và sau đó lồng nó vào một lớp khác nếu điều này gây ra rắc rối?
Gert Arnold

1
Trong trường hợp Giới tính, việc đặt tên thuộc tính Gendervà tên enum sẽ có ý nghĩa hơn nhiều Sex. Vậy isac.Gender = Sex.Male..
nawfal

3
Tôi không chắc tại sao anh chàng này lại bị hạ bệ. Tình huống này là hợp pháp và khác xa với giả thuyết. Một kiểu enum trong C # vì những lý do tương tự mà người ta có thể sử dụng một lớp bên trong trong Java ... bởi vì kiểu bên trong chỉ được sử dụng ở bên ngoài và không ở đâu khác, và chỉ có ý nghĩa trong bối cảnh bên ngoài chứ không phải ở nơi khác. Và do hạn chế của trình biên dịch, bạn phải chọn một trong những giải pháp được đề cập.
Nathan Pitman

Bạn sẽ phải đặt nó từ một nơi nào đó, thường là bên ngoài lớp hoặc có thể khi xây dựng lớp, trong trường hợp đó bạn cần xác định enum bên ngoài, trừ khi bạn muốn gửi Person.Gender.Male, Giới tính có thể áp dụng cho nhiều hơn Hơn cả mọi người, tôi nghĩ rằng không có nó lồng nhau là giải pháp tốt nhất.
Jim Wolff

2
Một lựa chọn khác, có thể tốt hơn là câu trả lời từ "Serge - appTranslator".
Curtis Yallop

6

Thực hành tốt nhất - sử dụng số ít. Bạn có một danh sách các vật phẩm tạo nên một Enum. Sử dụng một mục trong danh sách nghe có vẻ lạ khi bạn nói Versions.1_0. Nó có ý nghĩa hơn để nóiVersion.1_0 vì chỉ có một Phiên bản 1_0.


5

Đến muộn một chút ...

Có một sự khác biệt quan trọng giữa câu hỏi của bạn và câu hỏi bạn đề cập (mà tôi đã hỏi ;-):

Bạn đặt định nghĩa enum ra khỏi lớp, cho phép bạn có cùng tên cho enum và thuộc tính:

public enum EntityType { 
  Type1, Type2 
} 

public class SomeClass { 
  public EntityType EntityType {get; set;} // This is legal

}

Trong trường hợp này, tôi sẽ theo MS guidelin và sử dụng tên số ít cho enum (số nhiều cho cờ). Đó là giải pháp đơn giản nhất.

Vấn đề của tôi (trong câu hỏi khác ) là khi enum được định nghĩa trong phạm vi của lớp, ngăn chặn việc sử dụng một thuộc tính được đặt tên chính xác theo enum.


0

Trên luồng khác, quy ước đặt tên C # cho enum và thuộc tính khớp ai đó đã chỉ ra điều tôi nghĩ là một ý tưởng rất hay:

"Tôi biết đề xuất của tôi đi ngược lại các quy ước Đặt tên .NET, nhưng cá nhân tôi có tiền tố enum với 'E' và cờ enum với 'F' (tương tự như cách chúng tôi đặt tiền tố Giao diện với 'I')."

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.