Я записал следующее if
- оператор в Java:
if(methodName.equals("set" + this.name) ||
isBoolean() ? methodName.equals("is" + this.name) :
methodName.equals("get" + this.name)) {
...
}
Это хорошая практика для записи таких выражений в if
, разделить состояние от условия? И это выражение может быть упрощено?
Я бы изменил его на
if (methodName.equals("set" + this.name)
|| methodName.equals( (isBoolean() ? "is" : "get") + this.name)) {
...
}
Не сработает ли что-то вроде следующего?
if (methodName.equals("set" + this.name)
|| methodName.equals("get" + this.name)
|| (isBoolean() && methodName.equals("is" + this.name))) {
...
}
Это более читабельно, чем то, как вы использовали тернарный оператор, и, конечно, легче для понимания. Он также имеет то преимущество, что позволяет избежать ненужного вызова метода isBoolean
(он имеет 1, 2 или 4 вызова метода, тогда как ваш всегда имеет 1 или 3; прирост / потеря производительности, вероятно, слишком минут, чтобы заметить).
Здесь также есть аналогичный вопрос под названием «Разумно ли это использование тернарного оператора?» Один пользователь сказал следующее:
Тернарный оператор подразумевается чтобы вернуть значение.
IMO, он не должен изменять состояние, и следует использовать возвращаемое значение.
В другом случае используйте операторы if. Операторы If предназначены для выполнения блоков кода.
Обратите внимание, что я заключил в круглые скобки выражение, содержащее '&&', для удобства чтения. В них нет необходимости, потому что x && y
оценивается до m || n
.
Выбираете ли вы его использование, зависит от вас, но я стараюсь избегать этого в пользу удобочитаемости.
Хорошая ли это практика? Хорошая, если это облегчает чтение. Это облегчает чтение, если (1) это так, и (2) человек, которого это смутит, не будет это читать. Кто будет это читать?
Я был бы склонен изменить его на
if (methodName.equals(setterForThis())
|| methodName.equals(getterForThis())) {
...
}
с некоторыми извлеченными функциями:
private String setterForThis() {
return "set" + this.name;
}
private String getterForThis() {
return (isBoolean() ? "is" : "get") + this.name;
}
Конечно, он длиннее, но я все равно не очень люблю гольф.