Упорядочение аргументов String.equals ()

Недавно я получил нижний предел для использования следующего в недавнем ответе :

String word = ...; if ("s".equals(word) || "y".equals(word) 

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

Это плохой стиль кодирования? Если да, то почему?

Билл Пью задал этот вопрос в Devoxx 2011. Подавляющее большинство людей пошли на форму "xyz".equals(str) . Я с Биллом, теперь предпочитаю str.equals("xyz") .

Основополагающим для традиции Java является то, что мы находим ошибки как можно раньше. NPE исключительно распространены. Мы хотим как можно скорее направить эти нули.

Если вы ожидаете, что ссылка может быть null , то я не особо возражаю против обратной записи. Приятно быть явным и понятным, что может быть null с отдельной null проверкой, но обратный порядок должен быть хорошо понят и достаточно дифференцировать код из нормального случая, когда null запрещен.

Работая в области безопасности, некоторые ошибки, допускающие допустимость ошибок, являются уязвимостью.

Условия Йоды (т. Е. Помещение константы перед переменной при сравнении) можно считать плохой практикой, поскольку она делает код кода менее понятным. В этом конкретном случае, однако, я бы сказал, что использование условия Yoda делает код более понятным, так как вам не нужно ставить перед ним лишнюю проверку.

Перейдите по следующей ссылке, чтобы понять, что подразумевается под условиями Yoda.

Его не «плохой стиль кодирования» – его различный способ кодирования.

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

Но Йода может быть плохим, как объясняется в этой длинной, но очень интересной статье.

Конец дня, есть сторонники в пользу и против этого рода нотации.

Смотря как. Если в вашей программе слово «слово» никогда не должно быть нулевым, word.equals («s») может быть действительно лучше. Если по какой-то неясной причине «слово» станет нулевым, вы получите NullPointerException. Думаю об этом. Если вы получаете исключение, вы знаете, что что-то пошло не так, и вы можете быстрее найти ошибку и исправить ее. Если программа продолжит работать беззвучно и приведет к неправильным результатам, будет сложнее обнаружить проблему. На самом деле, вы можете не заметить, что есть проблема.

Все это зависит.

Есть несколько причин не делать этого так, но в конечном итоге это зависит от вас (или от команды, работающей над вашим продуктом), если вы считаете, что это плохой стиль кодирования. Аргументы против этого:

  • Строки редко нулевые (и вы не должны создавать API-интерфейсы, где они есть, потому что люди этого не ожидают)
  • Чувствуется странным, чтобы вы поместили значение, которое вы сравниваете с первым
  • Единообразие стиля кода важно, потому что этот путь является исключением, вы должны делать это только в том случае, если это делают все в вашей команде.

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

TL; DR; Это определенно плохой стиль кодирования NOT: D

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

 int test = 0; if ( test ){ /* do something */ 

но это не разрешено в Java, поэтому вы не сталкиваетесь с такими проблемами, как забывание «=», например

 if ( test = 2 ){ /* do something */ 

вместо test == 2

  • компилятор не позволит вам это сделать. Таким образом, состояние йоды может показаться неестественным для тех, кому это не нужно было заботиться (потому что он / она не использовал какой-либо другой язык, кроме Java).

Это определенно НЕ плохой стиль кодирования, он просто не очень распространен, чтобы видеть, что Java-код использует его

Условие yoda – это где oup поставить литерал перед переменной.

word.equals (“s”) читается как “word equals s”

«s» .equals (word), который человек читает как «равно слова»,

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

единственная причина, по которой imho использовать условия yoda – это предотвратить присвоение как «if (42 = i)» вместо «if (42 == i)»

Ты можешь написать

 if (word != null && (word.equals("s") || word.equals("y"))) 

вместо

 if ("s".equals(word) || "y".equals(word)) 

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

Существует особый случай, связанный с условиями, который я не видел, защищенный или атакованный в любом из ответов, поэтому я добавлю его для справки. Это стиль:

  if(0 < x && x <= max) { 

Yoda условно, потому что константа ( 0 ) находится перед переменной ( x ). Аргументом против условностей Yoda является то, что затрудняет читаемость. Сравните этот пример с функционально эквивалентным

  if(x <= max && x > 0) { 

Вы действительно думаете, что вариант, не относящийся к Йоде, более читабельен? Я не.

Для удобства чтения при использовании упорядочивающих реляционных операторов (<, <=,>,> =) я предпочитаю стиль этих эвристик:

  • Используйте согласованные отношения упорядочения:> согласуется с> =, но не с <или <=; <соответствует <=.
  • Предпочитают <и <= to> и> =, поскольку по умолчанию это восходящий порядок.
  • Поместите условия, которые налагают нижнюю границу переменной перед условиями, которые налагают верхнюю границу, если использовать <и <=. Делайте обратное, если используете> и> =.

Это очень часто приводит к тому, что Yoda является условным для нижней границы.

Можно утверждать, что вы должны (unit-) проверить свой код достаточно, чтобы быть уверенным, что нули не идут туда, где они не должны. Это должно устранить необходимость условий йоды.

  • попытка повторного открытия уже закрытого объекта: SQLiteDatabase
  • Как закодировать WAV в mp3 на устройстве Android
  • Сборщик мусора в Android
  • Получить координаты кнопок и определить, находится ли над ними пальцы - Android
  • Каковы подводные камни Java noob?
  • Отладка Android InetAddress.isReachable
  • Не удается разрешить метод getMap ()
  • preincrement / postincrement в java
  • Как установить тайм-аут HttpResponse для Android в Java
  • java.lang.ClassCastException
  • Сортировка TreeMap по значению
  • Давайте будем гением компьютера.