Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

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

Ответ 4

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

Все зависит.

Ответ 5

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

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

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

Ответ 6

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

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

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

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

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

вместо test == 2

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

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

Ответ 7

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

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

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

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

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

Ответ 8

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

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

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

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

Вы действительно думаете, что вариант, отличный от Yoda, более читабельен? Я этого не делаю.

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

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

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

Ответ 9

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

Ответ 10

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

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

вместо

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

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