Правило, скорее всего, адаптация от чистого кодекса Роберта Мартина, страница 302:
Отрицательных просто немного сложнее понять, чем позитивов. Поэтому, когда это возможно, условные выражения должны быть выражены как положительные. Например:
if(buffer.shouldCompact())
предпочтительнее
if(!buffer.shouldNotCompact())
В качестве примера предположим, что вы создаете валидатор, который требует две вещи, чтобы быть ложным для объекта, чтобы быть действительным:
- Предприятие не должно быть создано за последние 12 часов, а
- Банковский счет предприятия общая сумма не должна превышать 50 000 долларов США.
Естественно, идея будет написать два способа для этого:
boolean isCreatedWithinLastTwelveHours(BankAccount account)
boolean hasMoreThanTotalSumCap(BankAccount account)
... в этот момент, вы затем вызвать их как:
boolean newAccount = isCreatedWithinTheLastTwelveHours(account);
boolean highEndAccount = hasMoreThanTotalSumCap(account);
if(!newAccount && !highEndAccount) { // ... other logic
// The more astute would use DeMorgan's law in an effort to make this more readable
if(!(newAccount || highEndAccount)) { // other logic
Ну ... Wouldn 't было бы лучше, если бы вы только что сказали, что они не были вместо этого?
boolean isNotCreatedWithinLastTwelveHours(BankAccount account)
boolean hasLessThanTotalSumCap(BankAccount account)
Это было бы сделать выражение немного более кратким:
if(notNewAccount && notHighEndAccount) { // .. carry on!
Единственная причина, по которой я могу думать, может иметь отношение к читаемости – MadProgrammer
@MadProgrammer Спасибо. Гм ... Я сначала подумал, используя «!». проще и легко читать ... это вопрос смысла или образа мышления? – phi
Я думаю, что 'if (notTrue) {}' легче читать, чем 'if (! True) {}' –