使用“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_lame
或has_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 查询的结果中了解实际值的含义是非常有用的。例如,如果您只看到 mandatory
是 1
,那么您无法确定它的含义:
1
代表true
(而不是false
)
必填项的数量为1
(相对于2
或3
)
isMandatory
之类的名称清楚地表明这是一个布尔值。
另一方面,根据前缀后面单词的含义,使用isSomething
、hasSomething
、doesSomething
等其他前缀是有意义的。例如,isValid
、@987654334 @、doesExist
等等。像isChildren
这样混淆它们会在语法上不正确且令人讨厌。
因此,不要强制使用is
。任何暗示真/假含义的东西都可以。比如wasChecked
、hadInvestigation
等。
我也使用这条规则来命名变量、数据库字段和函数/方法。
与问题没有严格联系但相关:
我喜欢将表示基数的变量和字段称为numOf<Whatever>
。例如,numOfChildren
、numOfItems
等。
我喜欢将表示时间戳的值命名为 <happened>At
,例如 createdAt
、updatedAt
、approvedAt
等。
【讨论】:
【参考方案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”来命名布尔变量是不好的做法吗?的主要内容,如果未能解决你的问题,请参考以下文章