使用“is”来命名布尔变量是不好的做法吗?

Posted

技术标签:

【中文标题】使用“is”来命名布尔变量是不好的做法吗?【英文标题】:Is using "is" to name Boolean variables bad practice? 【发布时间】:2011-10-20 12:28:17 【问题描述】:

现在命名以“is”开头的布尔值是不好的做法吗?我的经理认为“isAnything”已过时且实践不佳。这是真的吗?

myManager.isLame ? correct() : incorrect();

【问题讨论】:

用什么语言?例如,在 Java 中,对布尔属性使用“is”是首选方式。 我同意你的经理很蹩脚。我一直在使用它,没有人对我说过任何话。 isLame() 看起来像一个方法,而不是一个变量 ;-) 对于 variables 我很少使用 is 前缀。但是,在公开的方法或访问器上,名称中的“is”可以增加价值——如果它确实增加了价值,那么我认为这是有保证的. (但是,我发现省略“is”或使用其他构建器(例如“has”all 基于给定名称的值)是完全有效的。) 我使用is_lamehas_something 【参考方案1】:

它在很多语言中都经常使用,但我不知道是否可以肯定地说它是首选方法。

我认为重要的是要牢记保持一致性以及给定团队中使用相同标准/风格的每个人。

【讨论】:

我完全同意团队标准的概念。也许如果我的经理一开始就这么说,我就不会发布这个问题了。【参考方案2】:

我不会在这里使用任何硬性规定。尽管我发现“Is”之类的前缀在识别布尔属性时很有用,但在很多情况下“Is”并不是最佳选择。

Car.HasFlatTyre 与 Car.IsFlatTyre Cars.AreAllRed 与 Cars.IsAllRed 等等...

MSDN naming guidelines 包含以下相关建议。

使用肯定短语(CanSeek 代替 CantSeek 的)。或者,您还可以为布尔属性添加前缀 是、可以或有,但仅限于增加价值的地方。

【讨论】:

同意。汽车不是轮胎。 @LoveRight “IsFlatTyred”怎么样? @Dai "Tyred" 似乎是一个动词。 My dictionary 并没有说它可以是动词。即使我的字典错了,这种用法也很少见,而且对非英语人士不友好。为什么我们不使用更简单的语法,HasFlatTyre isAnyTyreDeflated【参考方案3】:

isLame() 很常见,我认为它并不蹩脚。在 Java 中,它是 JavaBeans 规范的一部分,因此是一种相当隐蔽的实践。

【讨论】:

【参考方案4】:

这是风格问题,我已经多次以你的方式看到它(并且我自己也用多种语言这样做)。

【讨论】:

【参考方案5】:

在风格上,我会投给 hasValue 或 isNullOrEmpty。然而,使用巧妙的捷径或单行 if 语句通常是不好的。它大大降低了代码的可读性,并且在大多数语言中不会带来任何性能提升。

【讨论】:

请。使用三元 if 没有任何问题。它与问题无关。 在我的公司里,我们都反对那些单行的声明。然后一个新人加入了我们的团队,他总是使用那些东西。一旦我们都习惯了它,它实际上更容易阅读。当然,你永远不应该让你的表达过于复杂。但是使用漂亮的快捷方式来保持代码的简短和干净提高了的可读性。尤其是 C# 在过去几年中发展了很多。您应该及时了解所有新的快捷方式,否则您将无法在 10 年内阅读代码。 (我没有告诉任何人使用所有新的快捷方式。但你应该知道它们。)【参考方案6】:

从结构转储或 SQL SELECT 查询的结果中了解实际值的含义是非常有用的。例如,如果您只看到 mandatory1,那么您无法确定它的含义:

一个布尔值,其中1 代表true(而不是false) 必填项的数量为1(相对于23

isMandatory 之类的名称清楚地表明这是一个布尔值。

另一方面,根据前缀后面单词的含义,使用isSomethinghasSomethingdoesSomething等其他前缀是有意义的。例如,isValid、@987654334 @、doesExist 等等。像isChildren 这样混淆它们会在语法上不正确且令人讨厌。

因此,不要强制使用is。任何暗示真/假含义的东西都可以。比如wasCheckedhadInvestigation等。

我也使用这条规则来命名变量、数据库字段和函数/方法。

与问题没有严格联系但相关:

    我喜欢将表示基数的变量和字段称为numOf<Whatever>。例如,numOfChildrennumOfItems 等。

    我喜欢将表示时间戳的值命名为 <happened>At,例如 createdAtupdatedAtapprovedAt 等。

【讨论】:

【参考方案7】:

如果您创建具有明确名称的布尔变量会更好

boolean lame;

并制作方法来检查它的值

isLame()
  return lame;

调用方法通常比直接访问变量更好。

【讨论】:

在这种情况下,您可以将变量设为公共只读属性吗?你怎么称呼它?【参考方案8】:

遵循一种语言的书面约定。如果没有约定:

在变量命名中完全省略类型信息。

这包括用于布尔值的 is

boss.lame ? limp() : sprint()

对于强类型的语言,信息是多余的。

对于没有强类型类型的语言,信息仍然是多余的,因为 IDE 和所有可用的各种工具现在都有助于键入,而不必混淆名称。

is 是动词。 is_lame() 应该是一个返回布尔值的访问器方法。

【讨论】:

JavaBean 约定规定在引用布尔字段时使用is 代替get。有相当多基于JavaBeans约定的库。【参考方案9】:

根据Alibaba-Java-Coding-Guidelines

8.[强制] 在定义布尔变量时不要添加'is'作为前缀,因为它可能会导致某些Java框架中的序列化异常。

反例:boolean isSuccess;方法名将是 isSuccess() ,然后 RPC 框架将变量名推断为“成功”,导致序列化错误,因为它找不到正确的属性。

【讨论】:

以上是关于使用“is”来命名布尔变量是不好的做法吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在SAS中使用布尔数据类型?

返回布尔值的 Java 方法的命名约定

如何在shell脚本中声明和使用布尔变量? POSIX

前端代码规范

编写高质量代码改善C#程序的157个建议——建议135: 考虑使用肯定性的短语命名布尔属性

Java变量命名规则