枚举时使用单数还是复数?我认为声明中使用复数最有意义
enum Weekdays
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
...但我认为使用类型时使用单数更有意义,例如
Weekday firstDayOfWeek = Weekday.Monday;
我在某处读到了关于使用单数和常规枚举以及带有标志的复数的建议,但我想听听更多的优点和缺点。
这是直接来自微软的:
http://msdn.microsoft.com/en-us/library/4x252001(VS.71).aspx
对大多数枚举使用单一名称 类型,但对 Enum 使用复数名称 位字段类型。
一项建议来自 .NET 框架设计指南,第 59-60 页:
Do 对枚举使用单数类型名称,除非其值是位 领域。
public enum ConsoleColor { Black, Blue, Cyan, ...
Do 使用复数类型名称进行以位字段作为值的枚举,也称为标志枚举。
[Flags] public enum ConsoleModifiers { Alt, Control, Shift }
在 .NET Framework 中,大多数“普通”枚举(例如
DayOfWeek
)具有单数名称,而标志枚举(例如 StringSplitOptions
、BindingFlags
)具有复数名称。这是有道理的,因为标志枚举的值可以表示多个项目,但对于非标志枚举,它只能表示单个项目。
一般来说,我认为枚举定义是类型定义,其值是 枚举是该类型可以具有的不同值;因此它有一个单一的名字:
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
吗?
一般来说,我认为枚举定义是类型定义,枚举的值是该类型可以具有的不同值;因此它有一个单一的名字:
enum Weekday { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY };
enum CoffeeSize { SMALL, MEDIUM, LARGE };
Microsoft 建议 对枚举使用单数名称,除非它使用
Flags
属性。 正如《框架设计指南》一书中所述,您不应在枚举类型名称后添加 Enum、Flags 等后缀,也不应在枚举值前添加缩写词或首字母缩写词前缀,这在 VB 枚举中很常见。
这是主观的,只要你保持一致,你使用什么并不重要(我个人使用单数,因为它是我的 Sql 约定的延续)
除了 Microsoft 可能的约定和建议之外,我想引入不同的观点,并认为枚举的复数名称本质上更符合逻辑。
首先,我认为单数 Enum 名称约定出现的一个重要原因是它使其作为类型的使用更加直观和可读。
TS 示例:
interface Car {
length: number;
color: CarColor;
}
enum CarColor {
blue = 'blue',
red = 'red',
black = 'black',
}
不要误会我的意思,这在汽车界面层面看起来很棒。但我认为问题在于人们将类型和枚举混合在一起。
如果我们纯粹关注枚举,那么什么更符合逻辑和直观呢?枚举这个词本身不存在固有的复数吗?毕竟它是事物的枚举,枚举的键和值。任何枚举都是键和值的枚举。
这就是为什么在我看来,在访问枚举值时使用复数名称更符合逻辑(无论是在 TS 级别还是对于运行时代码):
const someCar = {
color: CarColors.black,
};
我们正在从可能值的枚举中访问“黑色”值。另一方面,至少对我来说,
CarColor.black
意味着颜色是某种单一实体,就像 String 或 Number 构造函数代表单一实体(类)一样。
现在您可能会反驳说,颜色枚举本身也是一个单一实体,尽管它的值是复数。这是一个完全有效的论点,但它与我所说的并不矛盾,它只是阐明了关键点:枚举中嵌入了“两者”一条单一信息以及一条复数信息。所以问题很简单:
我们是否想在某处保留复数信息,还是想将其隐式保留并仅表达单数信息?
当人们写下:
enum Color {
blue = 'blue',
red = 'red',
black = 'black',
}
我认为他们隐含的意思是:
enum 'enumeration of colors that can be used as a type Color' {
blue = 'blue',
red = 'red',
black = 'black',
}
那么我们怎样才能保留这两条信息呢?
我们可以创建一个辅助类型:
enum CarColors {
blue = 'blue',
red = 'red',
black = 'black',
}
type CarColor = CarColors;
interface Car {
length: number;
color: CarColor;
}
底线,我认为已经建立的约定很好。但它基于一个捷径来更多地强调枚举创建的类型而不是它的值。