命名规范:如何命名布尔变量?

81

我需要一个好的变量名来表示当对象是列表中的最后一个时返回false的布尔值。

我能想到的唯一合适的名称是‘inFront’,但我认为这不够描述清楚。

另一个选择是'isNotLast'。但这不是良好的编程实践(《代码大全》269页,使用正向的布尔变量名)。

我知道我可以改变变量定义,使得当对象是最后一个时返回true,并将变量命名为“isLast”,但如果有第一个解释会更容易完成这个任务。


1
发布一些代码怎么样?变量需要上下文。 - fabrizioM
9
改变名称只是针对症状进行治疗,这个问题的根本原因在于负面逻辑。 - starblue
1
如何使用 hasPredecessor/hasSuccessor 来表示当前项目之前/之后是否有任何项目?如果 (item.hasSuccessor) { blah blah blah } - user1397181
我们不能把它命名为 bool 吗? - Ben Racicot
9个回答

81
isBeforeTheLastItem

isInFrontOfTheLastItem

isTowardsTheFrontOfTheList

也许有点啰嗦,但它们可能会帮助您得到一些想法。


5
我认为我对“isBeforeLast”已经很感兴趣了...呃 - Berek Bryan
16
“isBeforeLast” 可以用 “!isLast” 替换吗? - Joe D
37
如果"Last"之后还能有元素,那么为什么它被称为"最后一个"? - Joe D
5
@雷电 - shouldDisplay - nickiaconis
3
复数情况下应该以“are”开头吗?例如 areAnimalsAllowed?所有名词复数形式通常以“are”开头。因此,在复数情况下,建议将变量或属性命名为 areAnimalsAllowed。至于所有格形式,应该以“has / have”开头吗?例如 hasAnimals?在所有格形式中,建议使用“have”开头,例如 haveAnimals,表示拥有某些动物。 - dpelisek
显示剩余6条评论

36

如果可以的话,我会建议将其命名为IsLast并改变功能。如果这真的不是一个选项,我会将其命名为IsNotLast。

我同意《代码大全》(使用肯定的布尔变量名称)的观点,我也相信规则是为了被打破而存在的。关键是只有在必须打破它们时才这样做。在这种情况下,没有任何替代名称比违反规则的名称更清晰。所以这是一个例外,违反规则可能是可以接受的。


1
如果要使其更加直观:if (isLast) {…} 或者如果需要反转 (我更喜欢保持肯定的名称) if (!isLast) {…} - Breaker222

17

是否有后续的项目?或者列表中的每个项目都有对应的后续XXXX?其中XXXX指的是您列表中的项。


3
我正沿着那个方向思考。hasNext 可能可行。 - Patrick McElhaney

15

个人而言,我会更改逻辑或查看业务规则,以确定它们是否决定了任何潜在的命名。

由于实际切换布尔值的条件实际上是“最后一个”操作。我认为切换逻辑并将其命名为“IsLastItem”或类似名称将是一种更受欢迎的方法。


2
如果我没记错的话,这也是《代码大全》中那一章节的精神所在。 - Austin Salonen

4

isPenultimateOrPrior

isBeforeEnd


2
一个简单的语义名称可以是last。这将允许代码始终使用正面代码,例如:
if (item.last)
    ...

do {
   ...
} until (item.last);

2
如何呢:
 hasSiblings
 or isFollowedBySiblings (or isFolloedByItems, or isFollowedByOtherItems etc.)
 or moreItems

尽管我认为你不应该养成违反“规则”的习惯,但有时候实现某些目标可能需要例外(参考Code Complete指南),在你的情况下,可以将变量命名为isNotLast


兄弟节点是指与另一个兄弟节点有共同父节点的节点。在平面列表中不存在父节点。 - John Topley
@John Topley:是的,我想你是对的,但你可以认为列表中的所有项目都是兄弟姐妹,它们的父项是列表本身。我猜isFollowedBySiblings可以重命名为isFollowedByItems,或者byOtherItems或byMoreItems或其他什么。我仍然觉得isNotLast是更好的名称,除非他可以将标志的含义改为相反的,然后称之为:isLast(哇...那太长了 :) - Mike Dinescu
似乎stackoverflow不鼓励为错别字编辑帖子,因为编辑需要6个或更多字符? - ahong

2
Haskell使用init来表示一个列表中除了最后一个元素以外的所有元素(基本上是tail的相反操作); isInInit可行吗,还是太晦涩难懂?

4
过于晦涩难懂。对不了解 Haskell 的人来说会感到困惑。 - Roy Leban
Matlab和Octave使用end来表示最后一个项目。 - wander95

1

需要考虑的两个问题

  1. 变量的作用域是什么(换句话说:你是在谈论局部变量还是字段?)? 局部变量的作用域比字段更窄。特别是,如果变量在一个相对较短的方法中使用,我不会太关心它的名称。当作用域很大时,命名更重要。

  2. 我认为你处理这个变量的方式存在内在的冲突。一方面,你说“当对象是列表中的最后一个时为false”,而另一方面,你也想称之为“inFront”。在列表中(不)是最后一个对象并不意味着(不)在前面。因此,我会选择isLast。


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