Одиниця чи множина для перелічень?


91

Чи використовуєте ви для перерахування однину чи множину? Я думаю, що це найкраще має сенс у множині в декларації

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

... але я думаю, що це має більше сенсу в однині при використанні типу, наприклад

Weekday firstDayOfWeek = Weekday.Monday;

Я десь читав рекомендацію використовувати однину із звичайними переліченнями та множиною з прапорами, але хотів би почути ще деякі плюси і мінуси.


Це повинні бути перелічення, а не перелічувачі.
Рід Копсі,

Відповіді:


91

Ось це прямо від Microsoft:

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

Використовуйте ім’я однини для більшості типів Enum, але використовуйте ім’я множини для типів Enum, які є бітовими полями.


1
З зауваженням, що бітові поля мають бути множинні.
М. Дадлі,

2
Ось остання версія Рекомендацій MSDN щодо проектування переліків
Родні С. Фолі

Я дуже вдячний, що прочитав одну книгу, - “ Рекомендації щодо структурного проектування” . В основному це написано 15+ авторами, які протягом багатьох років відігравали велику роль у розробці .NET framework. Книга дає вам уявлення про їхній розумовий процес, коли вони розробляють API фреймворків, і тим самим робить вас граничним ясновидцем, коли справа доходить до навігації в будь-якій структурі Microsoft, наборі інструментів тощо. Багато, якщо не весь текст, можна знайти в їхніх docs веб-сайту, але це дуже красиво упаковує.
Lopsided

30

Одна з рекомендацій випливає з Рекомендацій щодо розробки .NET Framework , стор. 59-60:

Є чи використовувати сингулярне ім'я типу для перерахування, якщо його значення не є бітовими полями.

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

Є чи використовувати множинну ім'я типу для перерахування з бітовими полями в якості значень, також називають прапори перерахування.

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

13

У .NET Framework більшість "звичайних" перелічень (наприклад DayOfWeek) мають одиничні імена, а переліки (наприклад StringSplitOptions, BindingFlags) мають множинні імена. Це має сенс, оскільки значення переліку переліку прапорів може представляти кілька елементів, але для переліку, що не є прапором, воно може представляти лише один елемент.


5

Взагалі, я вважаю визначення перерахування визначенням типу, при цьому значення переліку є різними значеннями, які може мати тип; тому він отримує єдину назву: enum Weekday { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY }; enum CoffeeSize { SMALL, MEDIUM, LARGE };

Так. Якщо ви робите розумовий досвід реалізації перелічень як класів, то той факт, що ви б використовували єдине ім'я для типу, повинен виявити, що має сенс використовувати окремі імена для таких перерахувань. Наприклад,

struct Weekday {};

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

...

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

Хто б віддав перевагу множині в переліченнях, чи могли б ви це назвати struct Weekdays?


2

Взагалі, я вважаю визначення перерахування визначенням типу, при цьому значення переліку є різними значеннями, які може мати тип; тому він отримує єдину назву:

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

enum CoffeeSize { SMALL, MEDIUM, LARGE };

2

Корпорація Майкрософт рекомендує використовувати єдине ім'я для перелічень, якщо воно не використовує Flagsатрибут. І як випливає з книги Framework Guidelines Guide, ви не повинні суфіксувати імена типів перелічення за допомогою Enum, Flags тощо, і не слід додавати значення перелічення до префікса абревіатурою або абревіатурою, як це було звично для перелічень VB того дня.


Але чи є насправді причина, чому? Ми додаємо інтерфейси префіксом до "Я". Чому б не перефіксувати перелічення з "E" та прапори з "F". Це зробило б це кристально чистим. Зауважте, що мені не подобається робити префікси ні до чого іншого, але це такі особливі випадки, як інтерфейс, де тип ніколи не зміниться.

0

Це суб’єктивно і не має значення, чим ви користуєтесь, якщо ви послідовні (особисто я використовую однину як перенесення з моїх конвенцій Sql)


10
Це має значення. Конвенції сприяють читабельності та ремонтопридатності. Особиста послідовність не порівняється зі звичайною послідовністю.
граната

1
Важко бути послідовним, якщо кожна бібліотека має свою "суб'єктивну" думку.
Пол Біггар,

1
Думаю, як Microsoft каже, використовуйте однину, ми ВСІ повинні використовувати однину. Ні. Поки ви узгоджуєтесь із вашою плюалізацією та сингулярізацією (?), Це насправді не має значення.
Jaimal Chohan

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.