布尔方法命名肯定与否定


43

布尔方法是否应该始终采用肯定形式,即使仅将它们用作否定形式也是如此?

假设我想在创建实体之前检查一个实体是否存在,我的论点是下面的第一种形式要好于第二种形式,无论该方法是否曾经以肯定形式使用过。

总而言之,我觉得if(!affirmative)比容易阅读if(negative)。我有一个不同意的同事,有何想法?

第一种形式:

int entity_id = 42;
if(!entity_exists(entity_id)) create_entity(entity_id);

第二种形式:

int entity_id = 42;
if(entity_not_exist(entity_id)) create_entity(entity_id);

3
C ++?怎么样if (not entity_exists(entity_id))
科斯


可能要去。老实说,我错过了!很多次字符,导致我误解了代码,直到我再次阅读它。所以我可能会更同意您的同事。我喜欢在您检查时可以评估为真的表格。
贝琳·洛里奇'17

只是想说一点,if (!exists) create()在许多语言/框架中,这可能被视为不良做法,因为它往往不是线程安全的。通常,首选方法是调用create()并处理特定的异常或返回码,说明该实体已存在。当然,这不是对实际问题的答案(这就是为什么仅是评论)。
julealgon

Answers:


61

布尔方法是否应该始终采用肯定形式,即使仅将它们用作否定形式也是如此?

为这样的事情制定规则似乎有点麻烦-我不想在编码标准文档中看到一条准则,说你不能对布尔属性使用负数名称。但是,就个人风格而言,我认为尝试使名称保持正面可能是一个理想的选择。但是,我认为避免使用那种又瘦又容易错过的东西也很不错!。人们通常可以找到将否定名称变成肯定名称的方法:

  • accountHasCharges
  • accountIsClear(与相同!accountHasCharges

清晰度是最重要的考虑因素,避免使用否定方法名称的一个很好的理由是,它们可能导致双重否定或更糟的情况:

  • isComplete // 好的
  • isNotComplete //!isComplete通常更好
  • isIncomplete //如果“不完整”是对象的已知状态,则可能有意义
  • !isNotComplete //太恐怖了
  • !isNotComplete == 0 //可能导致永久休假

5
“我不想在编码标准文档中看到一个准则,说您不能对布尔属性使用否定名称。” - 我就把这个留在这里...
AakashM

16
您忘记了!isNotIncomplete
李·本

那么(而不是)的反义词entity_exists是吗?还是按照丹的建议?entity_should_be_createdentity_not_existsentity_missing
ADTC 2014年

1
在这里,编码标准文档可以使用单词“ prefer”而不是“ should”或“ must”。
韦恩·康拉德

15

我同意该肯定语更易于阅读。你可以试试

第三形式

int entity_id = 42;
if (entity_is_missing(entity_id)) create_entity(entity_id);

要么

第四形式

int entity_id = 42;
if (is_entity_missing(entity_id)) create_entity(entity_id);

2

它还取决于您的方法将如何使用。如果要在肯定和否定情况下都使用它,例如

if (!entity_exists(entity_id)) create_entity(entity_id);

if (entity_exists(entity_id)) publish_entity(entity_id);

然后,方法名称应像上面一样是肯定的。如果您不确定如何使用它,请坚持上述内容。

但是,如果在否定情况下使用,则以下内容是可以接受的(甚至更理想)

if (entity_not_exists(entity_id)) create_entity(entity_id);

甚至改写得更肯定

if (entity_is_absent(entity_id)) create_entity(entity_id);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.