เอกพจน์หรือพหูพจน์สำหรับการแจงนับ?


93

คุณใช้เอกพจน์หรือพหูพจน์ในการแจงนับ? ฉันคิดว่ามันสมเหตุสมผลที่สุดกับพหูพจน์ในการประกาศ

enum Weekdays
{
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
}

... แต่ฉันคิดว่ามันสมเหตุสมผลกว่าเมื่อใช้ประเภทเอกพจน์เช่น

Weekday firstDayOfWeek = Weekday.Monday;

ฉันอ่านคำแนะนำบางแห่งให้ใช้เอกพจน์ที่มี enum และพหูพจน์พร้อมแฟล็ก แต่ฉันต้องการฟังข้อดีและข้อเสียเพิ่มเติม


ควรเป็นตัวแจงไม่ใช่ตัวนับ
Reed Copsey

1
ที่เกี่ยวข้อง: stackoverflow.com/questions/338156/…
harpo

คำตอบ:


93

ที่นี่ส่งตรงจาก Microsoft:

http://msdn.microsoft.com/en-us/library/4x252001(VS.71).aspx

ใช้ชื่อเอกพจน์สำหรับชนิด Enum ส่วนใหญ่ แต่ใช้ชื่อพหูพจน์สำหรับชนิด Enum ที่เป็นเขตข้อมูลบิต


1
โปรดทราบว่าเขตข้อมูลบิตควรเป็นพหูพจน์
M. Dudley

2
นี่คือแนวทาง MSDN สำหรับการออกแบบการแจงนับรุ่นล่าสุด: msdn.microsoft.com/en-us/library/ms229058.aspx
Rodney S. Foley

หนังสือเล่มหนึ่งที่ผมรู้สึกขอบคุณมากที่ผมได้อ่านเป็นแนวทางการออกแบบกรอบ โดยทั่วไปจะเขียนโดยนักเขียนมากกว่า 15 คนซึ่งทุกคนมีบทบาทสำคัญในการพัฒนา. NET framework ในช่วงหลายปีที่ผ่านมา หนังสือเล่มนี้ให้ข้อมูลเชิงลึกเกี่ยวกับกระบวนการคิดของพวกเขาเมื่อพวกเขาพัฒนา API กรอบงานและการทำเช่นนี้ทำให้คุณมีญาณทิพย์ในการสำรวจกรอบงาน Microsoft ชุดเครื่องมือและอื่น ๆ อีกมากมายหากไม่สามารถพบข้อความทั้งหมดได้ใน เว็บไซต์ docs แต่แพ็คเกจนี้มันขึ้นมาอย่างดี
ล่าช้า

30

คำแนะนำหนึ่งมาจากแนวทางการออกแบบ . NET Frameworkหน้า 59-60:

อย่าใช้ชื่อประเภทเอกพจน์นับเว้นแต่ค่าของมันเป็นเขตบิต

public enum ConsoleColor {
  Black,
  Blue,
  Cyan,
  ...

อย่าใช้ชื่อประเภทพหูพจน์นับกับเขตข้อมูลบิตเป็นค่าที่เรียกว่ายังมี enum ธง

[Flags]
public enum ConsoleModifiers {
  Alt,
  Control,
  Shift
}

13

ใน .NET Framework ส่วนใหญ่ "ปกติ" enums (เช่นDayOfWeek) มีชื่อเอกพจน์และ enums ธง (เช่นStringSplitOptions, BindingFlags) มีชื่อพหูพจน์ เป็นเรื่องที่สมเหตุสมผลเนื่องจากค่าของ flag enum สามารถแทนรายการได้หลายรายการ แต่สำหรับ enum ที่ไม่ใช่แฟล็กสามารถแสดงได้เพียงรายการเดียว


5

โดยทั่วไปแล้วฉันถือว่านิยาม enum เป็นนิยามประเภทโดยที่ค่าของ enum เป็นค่าที่แตกต่างกันตามที่ประเภทสามารถมีได้ ดังนั้นจึงได้รับชื่อเอกพจน์: enum Weekday { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY }; enum CoffeeSize { SMALL, MEDIUM, LARGE };

ใช่. หากคุณมีประสบการณ์ทางจิตในการใช้ enums เป็นคลาสความจริงที่ว่าคุณจะใช้ชื่อเอกพจน์สำหรับประเภทนั้นควรเปิดเผยว่าการใช้ชื่อเอกพจน์สำหรับ enums ดังกล่าวเหมาะสม เช่น,

struct Weekday {};

const Weekday SUNDAY;
const Weekday MONDAY;
const Weekday TUESDAY;

...

void func (Weekday *day)
{
   if (day == &SUNDAY)
       ...
}

สำหรับใครชอบพหูพจน์ใน enums คุณจะตั้งชื่อนั้นstruct Weekdaysไหม


2

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

enum Weekday { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY };

enum CoffeeSize { SMALL, MEDIUM, LARGE };

2

Microsoft แนะนำให้ใช้ชื่อเอกพจน์สำหรับการแจงนับเว้นแต่จะใช้Flagsแอตทริบิวต์ และตามที่นำมาจากหนังสือ Framework Design Guidelines คุณไม่ควรต่อท้ายชื่อชนิดการแจงนับด้วย Enum, Flags ฯลฯ และคุณไม่ควรนำหน้าค่าการแจงนับด้วยตัวย่อหรือตัวย่อเหมือนที่ใช้กันทั่วไปกับการแจงนับ VB ในสมัยนั้น


แต่มีเหตุผลจริงหรือไม่? เรานำหน้าอินเทอร์เฟซด้วย 'I' ทำไมไม่เติมคำนำหน้าด้วย 'E' และแฟล็กด้วย 'F' ที่จะทำให้ใส โปรดทราบว่าฉันไม่ชอบคำนำหน้าอย่างอื่น แต่เป็นกรณีพิเศษเช่นอินเทอร์เฟซที่ประเภทจะไม่เปลี่ยนแปลง

0

เป็นเรื่องส่วนตัวและไม่สำคัญว่าคุณจะใช้อะไรตราบใดที่คุณมีความสม่ำเสมอ (โดยส่วนตัวฉันใช้เอกพจน์เป็นสิ่งที่นำมาจากอนุสัญญา Sql ของฉัน)


11
มันสำคัญ. อนุสัญญาส่งเสริมความสามารถในการอ่านและการบำรุงรักษา ความสม่ำเสมอส่วนบุคคลไม่ได้เปรียบเทียบกับความสม่ำเสมอแบบเดิม
ระเบิดมือ

1
ยากที่จะสอดคล้องกันหากแต่ละห้องสมุดมีความคิดเห็น "อัตนัย" ของตนเอง
Paul Biggar

1
ฉันเดาว่า Microsoft บอกว่าใช้เอกพจน์เราทุกคนควรใช้เอกพจน์ ไม่ ตราบใดที่คุณสอดคล้องกับ plualization และ singularization (?) ของคุณมันก็ไม่สำคัญ
Jaimal Chohan

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