Enums 使用>=和=和

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,使用如下比较是否是一种良好的

我正在和大约8个人一起做一个项目,我想知道这里的最佳代码实践,因为其他人将在未来的几年里从事这个代码的工作

假设我有一个包含10个值的枚举:

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条件意味着什么。此外,如果枚举的语义得到了明确的表示,那么未来的开发人员在添加新标记时有望做正确的事情。