อนุสัญญาการตั้งชื่อ Enum - พหูพจน์


267

ฉันถามคำถามนี้แม้ว่าจะอ่านคล้ายกัน แต่ไม่ตรงกับสิ่งที่ฉันต้องการในหลักการตั้งชื่อ C # สำหรับคุณสมบัติ enum และการจับคู่

ฉันพบว่าฉันมีแนวโน้มที่จะตั้งชื่อ enums เป็นพหูพจน์แล้ว 'ใช้' พวกเขาเป็นเอกพจน์ตัวอย่าง:

public enum EntityTypes {
  Type1, Type2
}

public class SomeClass {
  /*
    some codes
  */

  public EntityTypes EntityType {get; set;}

}

แน่นอนว่ามันใช้งานได้และนี่คือสไตล์ของฉัน แต่ทุกคนสามารถพบปัญหาที่อาจเกิดขึ้นกับการประชุมดังกล่าวได้หรือไม่? ฉันมีการตั้งชื่อ "น่าเกลียด" กับคำว่า "สถานะ" แม้ว่า:

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

public class SomeClass {
  /*
    some codes
  */

  public OrderStatuses OrderStatus {get; set;}

}

ข้อมูลเพิ่มเติม: บางทีคำถามของฉันอาจไม่ชัดเจนเพียงพอ ฉันมักจะต้องคิดอย่างหนักเมื่อตั้งชื่อตัวแปรของประเภท enum ที่ฉันกำหนด ฉันรู้วิธีปฏิบัติที่ดีที่สุด แต่ก็ไม่ได้ช่วยให้งานของฉันง่ายขึ้นในการตั้งชื่อตัวแปรเหล่านั้น

ฉันไม่สามารถเปิดเผยคุณสมบัติ enum ทั้งหมดของฉัน (พูดว่า "สถานะ") เป็น "MyStatus"

คำถามของฉัน: ใครสามารถพบปัญหาที่อาจเกิดขึ้นกับการประชุมของฉันอธิบายไว้ข้างต้น? มันไม่เกี่ยวกับแนวปฏิบัติที่ดีที่สุด

การใช้ถ้อยคำใหม่ในคำถาม:

ฉันคิดว่าฉันควรถามคำถามด้วยวิธีนี้: ใครบางคนสามารถใช้วิธีการตั้งชื่อประเภท enum ได้ดีเมื่อใช้งานการตั้งชื่อของตัวอย่างของ enum จะค่อนข้างตรงไปตรงมา


5
public enum OrderState ... - ระเบียบสาธารณะของรัฐ OrderStatus {รับ; set;}
Fraser

คำตอบ:


333

Microsoft ขอแนะนำให้ใช้เอกพจน์สำหรับEnums เว้นแต่ว่าจะEnumเป็นฟิลด์บิต (ใช้FlagsAttributeเช่นกัน) ดูอนุสัญญาการตั้งชื่อประเภทการแจงนับ (ส่วนย่อยของหลักเกณฑ์การตั้งชื่อของ Microsoft )

เพื่อตอบสนองต่อการชี้แจงของคุณฉันไม่เห็นผิดกับสิ่งใดสิ่งหนึ่งต่อไปนี้:

public enum OrderStatus { Pending, Fulfilled, Error };

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

หรือ

public enum OrderStatus { Pending, Fulfilled, Error };

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

20
ใช่นี่เป็นคำตอบที่ถูกต้อง แนวทางนี้ใช้ใน. Net Framework เช่น enum DayOfWeek และตั้งค่าสถานะ enum RegexOptions
Alexander Zwitbaum

1
ใช่นี่เป็นแนวทางปฏิบัติที่แนะนำฉันยินดีต้อนรับ อย่างไรก็ตามมันไม่ตอบคำถามของฉัน
okw

1
@okw เพื่ออธิบายรายละเอียดเพิ่มเติมแม้ว่าจะดูน่าเกลียดถ้าคุณต้องการค่าเดียวจาก enum ธงใช้แบบฟอร์มเอกพจน์สำหรับเขตข้อมูล / ทรัพย์สิน / อาร์กิวเมนต์ หากคุณสนับสนุนให้มีการตั้งค่าหลายธงใช้พหูพจน์ หาก enum ของคุณไม่ได้เป็นค่าสถานะ enum ใช้เอกพจน์สำหรับชื่อประเภทและเขตข้อมูล / ทรัพย์สิน / ข้อโต้แย้ง
Jonathan Dickinson

4
นี่คือลิงค์ไปยังรุ่น. Net 4.0ของแนวทางการตั้งชื่อ Microsoft ที่เชื่อมโยงกับคำตอบ

1
@ โทมัสฉันไม่เคยมีปัญหากับมันฉันไม่เห็นว่าทำไมมันไม่ทำงาน - ไม่เห็นบริบทที่มันจะคลุมเครือไม่ว่าจะเป็นประเภทหรือตัวแปรที่อ้างอิง เช่นOrderStatus == OrderStatus.Pendingได้รับการยอมรับว่าเป็นตัวแปรสำหรับด้านซ้ายแล้วการแจงนับทางด้านขวา
James Hurley

39

ฉันเริ่มตั้งชื่อ enums ในพหูพจน์ แต่หลังจากเปลี่ยนเป็นเอกพจน์ ดูเหมือนว่าจะสมเหตุสมผลมากขึ้นในบริบทของการใช้งาน

enum Status { Unknown = 0, Incomplete, Ready }

Status myStatus = Status.Ready;

เปรียบเทียบกับ:

Statuses myStatus = Statuses.Ready;

ฉันพบว่ารูปแบบเอกพจน์ให้เสียงที่เป็นธรรมชาติมากขึ้นในบริบท เราเห็นพ้องกันว่าเมื่อประกาศ enum ซึ่งเกิดขึ้นในที่เดียวเราคิดว่า "นี่คือกลุ่มของผู้รู้เห็น" แต่เมื่อใช้มันน่าจะเป็นในหลาย ๆ ที่เรากำลังคิดว่า "นี่คือสิ่งที่" .


6
ปฏิกิริยาปลายเล็ก ๆ น้อย ๆ (และอาจจะน้อยนอกเรื่อง) แต่ผมขอแนะนำให้ใช้ค่าสำหรับค่าที่ไม่รู้จักวิธีการที่ตัวแปรเตรียมเป็นค่าเริ่มต้น0 Unknown
SvenL

เห็นด้วย @SvenL อัปเดตตัวอย่างตาม
Bob Kaufman

คุณจะใส่[Flags]คุณสมบัติลงไปในตัวอย่างของคุณหรือไม่? ไม่เหมาะสมที่จะมีสถานะเป็น "ไม่สมบูรณ์" และ "พร้อม" ถ้าคุณมีคุณenum [Flags]Steps { First, Second, Third }จะตั้งชื่อตัวแปรของคุณcompletedStepหรือไม่?
Pakman

26

สถานการณ์ไม่ได้ใช้กับพหูพจน์อย่างแท้จริง

enumแสดงแอตทริบิวต์ของบางสิ่งบางอย่างหรืออื่น ฉันจะให้ตัวอย่าง:

enum Humour
{
  Irony,
  Sarcasm,
  Slapstick,
  Nothing
}

คุณสามารถมีได้หนึ่งประเภท แต่ลองคิดในหลาย ๆ แบบมากกว่าพหูพจน์:

Humour.Irony | Humour.Sarcasm

ค่อนข้างมากกว่า

Humours { Irony, Sarcasm }

คุณมีอารมณ์ขันคุณไม่มีอารมณ์ขัน


5
ฮ่า ๆ ๆ โปรแกรมเมอร์ไม่ได้ถูกต้องตามหลักไวยากรณ์ / การเมืองเสมอไป ในกรณีของคุณฉันอาจใช้ "HumourTypes" นิสัยไม่ดีฉันเดา
okw

ถ้าฉันต้องการค้นหาบุคคลที่มีความรู้สึกว่า Sarcasm หรือมีความรู้สึกประชดฉันจะไม่ผ่านตัวอย่างการค้นหาHumoursที่มีคำตอบหรือHumours.Irony | Huomours.Sarcasmไม่?
Charles Bretana

14

โดยทั่วไปคำแนะนำวิธีปฏิบัติที่ดีที่สุดคือเอกพจน์ยกเว้นสำหรับ enums ที่มีแอตทริบิวต์ [Flags] ติดอยู่ (ซึ่งอาจมีเขตข้อมูลบิต) ซึ่งควรเป็นพหูพจน์

หลังจากอ่านคำถามที่แก้ไขแล้วของฉันฉันรู้สึกว่าคุณอาจคิดว่าชื่อคุณสมบัติหรือชื่อตัวแปรต้องแตกต่างจากชื่อประเภท enum ... ไม่ ต่อไปนี้เป็นอย่างดี ...

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

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

จริงฉันคิดว่าวิธีการของฉันเป็นวิธีที่ 'รวดเร็วและขี้เกียจ' ในการหลีกเลี่ยงความจำเป็นที่จะต้องนึกถึงชื่อเมื่อใช้ enums
okw

1
เพื่อรองรับคำตอบของคุณ: บน MSDN จากชื่อของประเภทสมาชิกในส่วน "ชื่อของคุณสมบัติ": ✓พิจารณาให้ชื่อเหมือนกับประเภทของคุณสมบัติ ตัวอย่าง: public Color Color { get {...} set {...} }
DavidRR

10

นี่เป็นหนึ่งในไม่กี่แห่งที่ฉันไม่เห็นด้วยกับการประชุมที่จะต่อต้านมัน TBH ฉันเกลียดที่คำจำกัดความของ enum และอินสแตนซ์ของมันสามารถมีชื่อเดียวกันได้ ฉัน postfix Enums ทั้งหมดของฉันด้วย "Enum" โดยเฉพาะเพราะทำให้ชัดเจนว่าบริบทของมันอยู่ในการใช้งานใด ๆ IMO ทำให้โค้ดอ่านได้ง่ายขึ้น

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


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

ไม่มีใครเคยสับสนสิ่งที่เป็น enum และสิ่งที่เป็นตัวอย่างของมัน


2
ฉันมาที่นี่เพื่อมองหารูปแบบการตั้งชื่อ Enum หลังจากที่มีชั้นเรียนและ Enum ชื่อเดียวกัน - และต้องการมี "บางสิ่งบางอย่าง" เพื่อให้ชัดเจนยิ่งขึ้น ฉันกำลังคิดคำนำหน้าด้วย "E" (สำหรับ Enums อย่างเห็นได้ชัด) เหมือนเรานำหน้าส่วนต่อประสานกับ "I" - แต่ฉันชอบโซลูชันของคุณ Heather! ทำได้ดีนี่!!!
สกอตต์

1
จากแนวทางการออกแบบของ Microsoft: "อย่าใช้ส่วนต่อท้าย" Enum "ในชื่อประเภท enum" docs.microsoft.com/en-us/dotnet/standard/design-guidelines/…
Thoryn Hawley

3
บางทีคุณอาจพลาดประโยคแรกที่ฉันพูดไป? ที่นี่ให้ฉันคัดลอกและวางเพื่อคุณ: "นี่เป็นหนึ่งในไม่กี่แห่งที่ฉันไม่เห็นด้วยกับการประชุมที่จะต่อต้านมัน" ฉันอธิบายต่อไปว่าทำไม
Heather

2
ฉันไม่ขัดกับแนวทาง "ในทุกวิถีทาง" นั่นคืออติพจน์ ฉันไม่เห็นด้วยกับแนวทางในวิธีที่เฉพาะเจาะจงซึ่งได้รับการสนับสนุนโดยเหตุผลที่ฉันระบุ หากคุณไม่เห็นด้วยให้ปรับเหตุผลที่ไม่เห็นด้วย อติพจน์ของคุณไม่จำเป็นและไม่เลื่อนตำแหน่งของคุณ
ฮีทเธอร์

1
หากมีการชนกันของเนมสเปซที่เป็นไปได้ฉันไม่เห็นปัญหาในการเพิ่มEnum? ไม่ใช่ว่าผู้เขียนกำลังเสนอ postfixing vars ทั้งหมดด้วยประเภทของพวกเขา ผู้เขียนยังมีกรณีที่ชัดเจนมากขึ้นเนื่องจากมีเหตุผลให้ในขณะที่ M $ ให้เหตุผลเป็นศูนย์
ใจ Govindani

7

หากคุณกำลังพยายามที่จะเขียนตรงไปตรงมา แต่รหัสที่ต้องห้ามเช่นนี้:

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

ตัวเลือกของคุณคือ:

  1. ไม่สนใจคำแนะนำ MS และใช้คำนำหน้าหรือคำต่อท้ายกับชื่อ enum:

    public class Person
    {
        public enum GenderEnum
        {
            Male,
            Female
        }
        public GenderEnum Gender { get; set; }
    }
  2. ย้ายนิยาม enum นอกคลาสโดยควรเป็นคลาสอื่น นี่เป็นวิธีแก้ไขปัญหาที่ง่ายกว่า

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

2
สถานการณ์สมมุติไม่ใช่ทางออกที่ดี เหตุใดจึงใช้การซ้อนกันenumในสถานที่แรกและจากนั้นซ้อนในอีกชั้นหนึ่ง
Gert Arnold

1
ในกรณีที่มีเพศของมันความหมายมากขึ้นที่จะมีชื่อคุณสมบัติเป็นGenderและชื่อ enum Sexเป็น ดังนั้นisac.Gender = Sex.Male..
nawfal

3
ฉันไม่แน่ใจว่าทำไมผู้ชายคนนี้จึงถูกลดระดับลง สถานการณ์นี้ถูกต้องตามกฎหมายและอยู่ไกลจากสมมติฐาน หนึ่งรัง enum ประเภทใน C # ด้วยเหตุผลที่คล้ายกันที่หนึ่งอาจใช้ชั้นในใน Java ... เพราะประเภทชั้นในจะใช้เฉพาะในด้านนอกและไม่มีที่อื่นและทำให้รู้สึกเฉพาะในบริบทของด้านนอกและที่อื่น ๆ และเนื่องจากข้อ จำกัด ของคอมไพเลอร์คุณต้องเลือกหนึ่งในวิธีการแก้ไขที่กล่าวถึง
นาธานพิตแมน

คุณจะต้องตั้งค่าจากที่ไหนสักแห่งโดยปกติแล้วจะอยู่นอกชั้นเรียนหรืออาจจะสร้างคลาสขึ้นมาซึ่งในกรณีนี้คุณจำเป็นต้องกำหนดค่า enum ไว้นอกหากคุณไม่ต้องการส่งใน Person.Gender.Male เพศชายสามารถนำไปใช้ได้มากกว่า มากกว่าแค่คนฉันคิดว่าการไม่มีซ้อนกันเป็นวิธีที่ดีที่สุดต่อไป
Jim Wolff

2
อีกทางเลือกที่ดีกว่าอาจเป็นคำตอบจาก "Serge - appTranslator"
Curtis Yallop

6

วิธีปฏิบัติที่ดีที่สุด - ใช้เอกพจน์ คุณมีรายการสิ่งของที่ทำขึ้นเป็น Enum Versions.1_0ใช้รายการในรายการเสียงแปลกเมื่อคุณพูด มันสมเหตุสมผลมากกว่าที่จะพูดVersion.1_0เนื่องจากมีเพียง 1_0 เวอร์ชั่นเดียว


5

มาช้า ...

มีความแตกต่างที่สำคัญระหว่างคำถามของคุณกับคำถามที่คุณพูดถึง (ซึ่งฉันถาม ;-):

คุณใส่นิยาม enum ออกจากคลาสซึ่งอนุญาตให้คุณมีชื่อเดียวกันสำหรับ enum และคุณสมบัติ:

public enum EntityType { 
  Type1, Type2 
} 

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

}

ในกรณีนี้ฉันจะทำตามแนวทาง MS และใช้ชื่อเอกพจน์สำหรับ enum (พหูพจน์สำหรับธง) มันเป็นเรื่องง่ายที่สุดสำหรับการแก้ปัญหา

ปัญหาของฉัน (ในคำถามอื่น ๆ ) คือเมื่อกำหนด enum ในขอบเขตของคลาสป้องกันการใช้คุณสมบัติที่มีชื่อหลังจาก enum


0

ในหัวข้อการตั้งชื่อเธรดC # สำหรับ enum และการจับคู่คุณสมบัติบางคนชี้ให้เห็นสิ่งที่ฉันคิดว่าเป็นความคิดที่ดีมาก:

"ฉันรู้ว่าคำแนะนำของฉันนั้นขัดกับอนุสัญญาการตั้งชื่อ. NET แต่ฉันก็เติมคำนำหน้าด้วยตัวอักษร 'E' และ enum flag ด้วย 'F' (คล้ายกับวิธีที่เรานำหน้าส่วนต่อประสานกับ 'I')"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.