2015-08-21 4 views
5

В нашей инструкции по кодированию Java написано:Должен ли я избегать использования "!" в выражении if на Java?

Избегайте использования "!" в выражении if, насколько это возможно.

Я спросил других коллег, но никто не дал мне ясных идей, потому что руководство было создано давным-давно, и автор, возможно, покинул нашу компанию.

У вас есть идея?

+4

Единственная причина, по которой я могу думать, может иметь отношение к читаемости – MadProgrammer

+0

@MadProgrammer Спасибо. Гм ... Я сначала подумал, используя «!». проще и легко читать ... это вопрос смысла или образа мышления? – phi

+2

Я думаю, что 'if (notTrue) {}' легче читать, чем 'if (! True) {}' –

ответ

9

С предоставленной информацией это требует некоторых спекуляций. Одна из возможных причин заключается в том, что намерение было сделано не для оператора if, а для оператора if-else. В этом случае я могу видеть, где вы можете сказать, что вы должны отменить дела, чтобы у вас не было дополнительной операции отрицания. Вместо

if (! boolVar) { 
    // Something 
} else { 
    // Something else 
} 

вы можете предпочесть

if (boolVar) { 
    // Something else 
} else { 
    // Something 
} 

ли это стоит или нет, вероятно, больше дело вкуса и стандартизации, чем все остальное.

1

Конечно, «!» может использоваться, когда вам нравится. В java нет «если», и в некоторых условиях у вас нет другого выбора.

0

Конечно, вы можете использовать оператор отрицания ! всякий раз, когда захотите.

Однако, если у Вас есть ситуация, где вы должны написать какие-то действия в обоих if и else блока, то следующий более читаемым:

if(status){ 
//do something 
} 
else{ 
//do something else 
} 

чем

if(!status){ 
//do something 
} 
else{ 
//do something else 
} 

Но если у вас есть ситуации, когда вам нужно выполнить определенные действия только на одном условии, то есть, если у вас есть только блок & no else, тогда разумно использовать ! в if

4

Правило, скорее всего, адаптация от чистого кодекса Роберта Мартина, страница 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! 
+0

Эти два условия работают при разных обстоятельствах, это не два разных способа сказать одно и то же. –

+0

@AndrewHood: Ошибка копирования. Одна секунда. – Makoto

+0

Я так и думал, но я спрашивал о своем здравом рассудке. –

1

Выглядит как еще-еще-бесполезных-правила. Вообще говоря, нет абсолютных терминов в этом случае, правда, что если вы в если-то еще пункте, то, возможно, лучше написать

if(myCondition) { 
    doThis() 
} else { 
    doSomethingElse() 
} 

Вместо

if(!myCondition) { 
    doSomethingElse() 
} else { 
    doThis() 
} 

однако, что указанные , в некоторых случаях на самом деле вполне нормально использовать оператор отрицания, особенно если нет предложения еще не предусмотрено, например,

if (!tokenDoesCompute()) { 
    throw InvalidTockenException("Whatever") 
} 

И на самом деле в этом сценарии, с помощью «!» для меня это очень немного.

Наконец, если никто не может действительно объяснить, ПОЧЕМУ это правило, возможно, пришло время его удалить, единственная веская причина, по которой я мог бы найти, - обеспечить согласованность стиля кода.

+0

Я уверен, что сценарий if-then-else является причиной. В подобном случае я определенно предпочитаю 'if (expr)' to 'if (! Expr)'. Но похоже, что кто-то взял этот случай и либо перешел за борт, превратив его в простое правило, либо просто стал крайне неаккуратным и не объяснил, что они имели в виду. Я видел, что подобное происходит слишком часто. _Sigh _.............. – ajb

+2

Ваш второй пример не имеет смысла «if (! TokenDoesNotCompute)», поэтому токен вычисляет, а затем генерирует исключение? Это доказывает, что оператор отрицания иногда может вводить в заблуждение ... :). –

+0

@MathiasBegert, вы абсолютно правы, я исправил его. (благодаря!) –

0

Я не видел, чтобы кто-нибудь еще предлагал это, вероятно, потому, что они ненавидят его так же сильно, как и я, но я показываю его для полноты.

// Using not operator (preferred) 
if (! someTest) { ... } 

// Using compact not operator (kind of hides it) 
if (!someTest) { ... } 

// Comparing to false (ok, explicitly states what you want) 
if (someTest == false) { ... } 

// Comparing to true (a bit obscure) 
if (someTest != true) { ... } 

Они все делают то же самое, но, пожалуйста, продолжайте использовать !, просто убедитесь, что вы добавляете пробел после него, так что легче увидеть.

1

Хорошо, я отвечаю на свой вопрос. Как говорят другие, возможно, это написано для читаемости. (Стр. 72)

В The Art of Readable Code говорит:

Предпочитают дело с положительным случае первого вместо отрицательного например., if(debug) вместо if(!debug)

я нашел ниже должности, а также:

  • Readable Code - Remove Checking null

    bool func(String name) 
    { 
        if ((name != null) && (name.equals("true")) { 
         //... 
        } else { 
         //... 
        } 
    } 
    

    bool func(String name) 
    { 
        if ("true".equals(name)) { 
         //... 
        } else { 
         //... 
        } 
    }