Enums 使用>=和=和
我正在和大约8个人一起做一个项目,我想知道这里的最佳代码实践,因为其他人将在未来的几年里从事这个代码的工作 假设我有一个包含10个值的枚举:Enums 使用>=和=和,enums,language-agnostic,enumeration,Enums,Language Agnostic,Enumeration,我正在和大约8个人一起做一个项目,我想知道这里的最佳代码实践,因为其他人将在未来的几年里从事这个代码的工作 假设我有一个包含10个值的枚举: typedef enum { Tag1 = 1, Tag2, Tag3, Tag4, Tag5, Tag6, Tag7, Tag8, Tag9, Tag10 } Tag; 如果我想检查标记是否等于Tag6、Tag7、Tag8、Tag9或Tag10,使用如下比较是否是一种良好的
typedef enum {
Tag1 = 1,
Tag2,
Tag3,
Tag4,
Tag5,
Tag6,
Tag7,
Tag8,
Tag9,
Tag10
} Tag;
如果我想检查标记是否等于Tag6、Tag7、Tag8、Tag9或Tag10,使用如下比较是否是一种良好的做法:
if(myTag >= Tag6 && myTag <= Tag10) {
//Do something
}
?
还是最好使用Or并检查每个标签
使用>=和
我能期望有人不会在其他标记之间添加新标记吗
我不敢打赌。除非枚举的序数/基础值具有某种固有的含义或顺序,否则我将避免过多地使用它们
我只会使用范围检查,如果我真的希望有人能够插入额外的枚举而不调整所有检查。但这可能是一个相当罕见的案例。给出了一个关于优先级枚举的好例子,我能想到的另一个例子是日志级别
<> P>确切的语法取决于语言,但我通常认为这样的东西是最可读的:
if(myTag in [Tag6, Tag7, Tag8]) {
// ...
}
if(message.Priority >= Priority.Medium) {
// Notify user
}
或者更好地使用一些描述变量名,使其他标记更为明显:
topTags = [Tag6, Tag7, Tag8]
if(myTag in topTags) {
// ...
}
我能期望有人不会在其他标记之间添加新标记吗
我不敢打赌。除非枚举的序数/基础值具有某种固有的含义或顺序,否则我将避免过多地使用它们
我只会使用范围检查,如果我真的希望有人能够插入额外的枚举而不调整所有检查。但这可能是一个相当罕见的案例。给出了一个关于优先级枚举的好例子,我能想到的另一个例子是日志级别
<> P>确切的语法取决于语言,但我通常认为这样的东西是最可读的:
if(myTag in [Tag6, Tag7, Tag8]) {
// ...
}
if(message.Priority >= Priority.Medium) {
// Notify user
}
或者更好地使用一些描述变量名,使其他标记更为明显:
topTags = [Tag6, Tag7, Tag8]
if(myTag in topTags) {
// ...
}
是,但仅适用于表示值比例的枚举,例如:
enum Priority {
None = 0,
Low,
Medium,
High,
Critical
}
那么这段代码是有意义的,并且是可读的:
if(myTag in [Tag6, Tag7, Tag8]) {
// ...
}
if(message.Priority >= Priority.Medium) {
// Notify user
}
如果枚举不表示这样的比例,那么请避免使用,因为它们可能会相当混乱。改用位标志
标志枚举使用二进制值,以便可以组合值:
enum UserAudiences {
// Basic values: dec // binary
None = 0, // 0000
Client = 1, // 0001
Employee = 2, // 0010
Contractor = 4, // 0100
Key = 8, // 1000
// Combined: dec // binary
KeyClient = 9, // 1001 : Key + Client
BoardMember = 10, // 1010 : Key + Employee
CounterParty = 5, // 0101 : Client + Contractor
BusinessPartner = 13 // 1101 : Key + Client + Contractor
}
然后,在检查组合枚举值时,我们查看二进制数以及是否设置了适当的位。例如,如果我们要检查userviewers.Employee,我们可以只查找表示2的位,如果设置了该位,则我们有一个包含该位的枚举值:
if((message.Audience & UserAudiences.Employee) != 0) {
// Post on intranet
} else {
// Send externally
}
无法通过密钥、客户或承包商枚举的任何组合设置该位,只能在员工是“源”枚举之一时设置该位
大多数语言都有这方面的帮助程序,您也可以编写自己的帮助程序:
if(message.Audience.HasFlag(UserAudiences.Employee)) { ...
数学可以用任何基数——你可以用十进制的1、10、100等。但是,您需要更快地获得更大的数字
最后,还有一个约定,即对常规枚举使用单数名称,对标记的枚举使用复数名称,提示程序员是使用相等还是按位检查。是,但仅适用于表示数值比例的枚举,例如:
enum Priority {
None = 0,
Low,
Medium,
High,
Critical
}
那么这段代码是有意义的,并且是可读的:
if(myTag in [Tag6, Tag7, Tag8]) {
// ...
}
if(message.Priority >= Priority.Medium) {
// Notify user
}
如果枚举不表示这样的比例,那么请避免使用,因为它们可能会相当混乱。改用位标志
标志枚举使用二进制值,以便可以组合值:
enum UserAudiences {
// Basic values: dec // binary
None = 0, // 0000
Client = 1, // 0001
Employee = 2, // 0010
Contractor = 4, // 0100
Key = 8, // 1000
// Combined: dec // binary
KeyClient = 9, // 1001 : Key + Client
BoardMember = 10, // 1010 : Key + Employee
CounterParty = 5, // 0101 : Client + Contractor
BusinessPartner = 13 // 1101 : Key + Client + Contractor
}
然后,在检查组合枚举值时,我们查看二进制数以及是否设置了适当的位。例如,如果我们要检查userviewers.Employee,我们可以只查找表示2的位,如果设置了该位,则我们有一个包含该位的枚举值:
if((message.Audience & UserAudiences.Employee) != 0) {
// Post on intranet
} else {
// Send externally
}
无法通过密钥、客户或承包商枚举的任何组合设置该位,只能在员工是“源”枚举之一时设置该位
大多数语言都有这方面的帮助程序,您也可以编写自己的帮助程序:
if(message.Audience.HasFlag(UserAudiences.Employee)) { ...
数学可以用任何基数——你可以用十进制的1、10、100等。但是,您需要更快地获得更大的数字
最后,还有一个约定,即对常规枚举使用单数名称,对标记的枚举使用复数名称,以提示程序员是使用相等还是按位检查。您考虑过使用位掩码吗?我还没有听说过这个概念,我会仔细研究一下的。谢谢!Tag6、Tag7、Tag8、Tag9或Tag10中标记的意义是什么?如果这些类似于优先级,那么在当前代码的逻辑中可能应该包括添加7到8之间的标记的人。如果它们是完全不同且不可比较的含义,那么附加标记不应出现在当前代码中,或者在添加该标记时应予以考虑。这取决于你的if条件意味着什么。另外,如果枚举的语义是明确的,那么未来的开发人员希望在添加新标记时会做正确的事情
听说过这个概念,我会在里面看看的谢谢!Tag6、Tag7、Tag8、Tag9或Tag10中标记的意义是什么?如果这些类似于优先级,那么在当前代码的逻辑中可能应该包括添加7到8之间的标记的人。如果它们是完全不同且不可比较的含义,那么附加标记不应出现在当前代码中,或者在添加该标记时应予以考虑。这取决于你的if条件意味着什么。此外,如果枚举的语义得到了明确的表示,那么未来的开发人员在添加新标记时有望做正确的事情。