Nomeação de método booleano afirmativo vs negativo


44

Os métodos booleanos sempre devem assumir a forma afirmativa, mesmo quando serão usados ​​apenas na forma negativa?

Digamos que eu queira verificar se existe uma entidade antes de criar uma, meu argumento é que a primeira forma abaixo é melhor que a segunda, se o método é ou não usado na forma afirmativa.

Em resumo, acho if(!affirmative)mais fácil ler do que if(negative). Eu tenho um colega que discorda, pensamentos?

Primeira forma:

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

Segunda forma:

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

3
C ++? que tal #if (not entity_exists(entity_id))
Kos


para-maio-para-mah-para. Honestamente, eu senti falta do !personagem tantas vezes, fazendo com que eu entendesse mal o código até relê-lo novamente. Então provavelmente concordo mais com seu colega de trabalho. Gosto da forma avaliada como verdadeira quando você a examina.
Berin Loritsch

Só queria dizer que isso if (!exists) create()pode ser visto como uma prática ruim em muitos idiomas / estruturas, pois tende a não ser seguro para threads. Geralmente, a abordagem preferida é chamar create()e manipular exceções específicas ou códigos de retorno dizendo que a entidade já existe. Obviamente, isso não é uma resposta para a pergunta real (é por isso que é apenas um comentário).
precisa saber é

Respostas:


61

Os métodos booleanos sempre devem assumir a forma afirmativa, mesmo quando serão usados ​​apenas na forma negativa?

Criar regras sobre essas coisas parece um pouco demais - eu não gostaria de ver uma diretriz em um documento de padrões de codificação que diz que você não deve usar nomes negativos para propriedades booleanas . Mas por uma questão de estilo pessoal, acho que tentar manter os nomes positivos pode ser um ótimo ideal. No entanto, acho que também é bom evitar a necessidade de ser magro e facilmente esquecido !. Muitas vezes, podemos encontrar maneiras de transformar um nome negativo em positivo:

  • accountHasCharges
  • accountIsClear(o mesmo que !accountHasCharges)

A clareza é a consideração mais importante e uma boa razão para evitar nomes de métodos negativos é que eles podem levar a negativos em dobro ou coisa pior:

  • isComplete // OK
  • isNotComplete //! isComplete geralmente é melhor
  • isIncomplete // poderia fazer sentido se 'incompleto' for um estado conhecido do objeto
  • !isNotComplete // horrível
  • !isNotComplete == 0 // pode levar a férias permanentes

5
"Eu não gostaria de ver uma diretriz em um documento de padrões de codificação que diz que você não deve usar nomes negativos para propriedades booleanas ". - Vou deixar isso aqui ...
AakashM 2/13/13

16
Você esqueceu!isNotIncomplete
Ben Lee

Então seria o oposto de entity_existsser entity_should_be_created(em vez de entity_not_exists)? Ou talvez de entity_missingacordo com a sugestão de Dan?
ADTC

1
É aqui que um documento de padrões de codificação pode usar a palavra "preferir" em vez de "deve" ou "deve".
Wayne Conrad

15

Concordo que a afirmativa é mais fácil de ler. Você pode tentar

Terceira forma

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

ou

Quarta forma

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

2

Também depende de como o seu método será usado. Se for usado nos casos afirmativo e negativo, por exemplo,

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

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

Em seguida, o nome do método deve ser afirmativo, como o acima. Se você não tem certeza de como será usado, siga o exemplo acima.

Mas, se usado SOMENTE no caso negativo, o seguinte é aceitável (talvez até desejável)

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

ou melhor ainda reformulá-lo para ser mais afirmativo

if (entity_is_absent(entity_id)) create_entity(entity_id);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.