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);
if (not entity_exists(entity_id))
!
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.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 é chamarcreate()
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).Respostas:
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
// OKisNotComplete
//! isComplete geralmente é melhorisIncomplete
// poderia fazer sentido se 'incompleto' for um estado conhecido do objeto!isNotComplete
// horrível!isNotComplete == 0
// pode levar a férias permanentesfonte
!isNotIncomplete
entity_exists
serentity_should_be_created
(em vez deentity_not_exists
)? Ou talvez deentity_missing
acordo com a sugestão de Dan?Concordo que a afirmativa é mais fácil de ler. Você pode tentar
Terceira forma
ou
Quarta forma
fonte
Também depende de como o seu método será usado. Se for usado nos casos afirmativo e negativo, por exemplo,
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)
ou melhor ainda reformulá-lo para ser mais afirmativo
fonte