CA1726: FxCop 禁用词:Flags

13
< p >< em >某人要求我将其他人的代码符合一些FxCop规则集,其中包括规则CA1726:使用首选术语。大多数术语/替换都可以接受,我理解必须决定一个单一的方式来命名事物。

然而,“flags”这个术语是怎么回事?有人能解释一下为什么我不应该使用这个术语吗?(在我去抱怨之前;))

比如,我有一个数据对象,它有一个成员类为“flags”,该类捆绑了大量属性,定义如何处理数据对象。你会如何称呼这个对象?

2个回答

12

在基于 FxCop 的《框架设计指南》一书中,作者认为使用 FlagFlags 是不好的。他们提出了一个替代建议,即在为枚举命名时,使用单数名称表示标准枚举,使用复数名称表示位域(标志)枚举。

例如,如果您想创建一个列出不同可见性的枚举,则应将其命名为 Visibilities 而不是 VisibilityFlagsVisibility

[Flags]
public enum Visibilities {
   Public,
   Private
}

根据作者所说,在.NET中唯一被视为标志(flag)的项目是这些位域枚举(bitfield enumerations),因为它们带有Flags属性关键字。


1
我正在使用一个BitArray来表示一组标志。在名称中加入“flags”似乎非常自然。但这对我来说有点过于严格了。 - Andy
复兴旧的问答 - 我遇到这个问题是因为业务确实使用术语“标记”,我想在领域模型中表示它。我确信该书在涉及开/关字段的编程概念时将标记称为不好的想法,这很好。但是,在FXCop中实现此规则,使得任何使用标记都被视为过时的想法,在我看来甚至更糟糕 - 只需查看谷歌并发现术语“标记”仍在用于许多事情,例如国旗或标记帖子。 - chiccodoro
具有讽刺意味的是,Stackoverflow确实有一种标记帖子的概念;想象一下SO团队被迫在其领域模型中使用一个不同于“flag”的术语来表示帖子标志,仅仅为了满足FXCop,这有点令人担忧... - chiccodoro

3
我认为属性的命名应该恰当,术语“Flags”表征了属性而不是描述它。
引用:
标志或Flags | 没有替代术语,请勿使用。
例如,Flags通常与枚举一起使用(这些枚举已经装饰了适当的属性),我们肯定不需要在属性的名称/标识符中明确说明。
[Flags]
enum StorageMode
{
    None = 0,
    Next = 1,
    ...
    Last = 32
}

class StorableItem
{
    public StorageMode StorageMode { get; set; }
}

但是在你的情况下,我有一种感觉,无论是被命名为或者包含 Flags 在其名称中的东西,并不是以上意义上的一组标志 - 这也提出了另一个需要避免它的原因。


1
这有点像匈牙利命名法,只不过它是一个后缀,而且是一个单词,而不是一些神秘的字母。 - R. Martinho Fernandes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接