В большинстве случаев удобочитаемость важнее скорости выполнения. Поэтому я стараюсь
оптимизировать для простоты понимания, используя следующий подход:
Все проверки «утверждения» выполняются заранее. это гарантирует, что все ошибочные случаи рассматриваются в самом начале. это особенно важно для проверок нулевых указателей, например
if(arg == null){
throw new IllegalArgumentException(); // harsh (correct)
}
// or
if(arg == null){
arg = ""; // forgiving (lazy)
}
Далее я пытаюсь проверять 1 условие только в каждом операторе if. вместо
if(condition1 && condition2) {
...
} else {
...
}
я вообще предпочитаю
if(condition1) {
if(condition2) {
...
} else {
...
}
} else {
...
}
Этот подход проще для установки точек останова и делает логику более очевидной.
Я избегаю отрицаний; вместо
if(! condition) {
...a...
} else {
...b...
}
вещи лучше переставить на
if(condition) {
...b...
} else {
...a...
}
Наконец, все методы, которые возвращают логический результат, должны иметь «положительное» имя, которое указывает, что означают результаты:
boolean checkSomething(Something x){ ... } // bad -- whats the result?
boolean isSomethingInvalid(Something x){ ... } // better, but ...
boolean isSomethingValid(Something x){ ... } // best, no "mental negation"