Мы все согласны с тем, что код более читабелен при одном возврате.
Не совсем.Это просто структурированное программирование старой школы, когда функции, как правило, не были небольшими, а парадигмы сохранения неизменных значений еще не были популярны.строк кода), которые возвращаются в разных точках.Например, в рекурсивных методах у вас обычно есть по крайней мере один базовый случай, который возвращается немедленно, и другой, который возвращает значение, возвращаемое рекурсивным вызовом.
Часто вы обнаружите, что создание дополнительной переменной результата, просто для хранения возвращаемого значения, и затем проверка того, что никакая другая часть функции не перезаписывает результат, когда вы уже знаете, что можете просто вернуть, просто создает шумчто делает его менее читаемым, а не более.Читатель должен разобраться с когнитивной перегрузкой, чтобы увидеть, что результат не изменяется дальше вниз.Во время отладки это еще больше увеличивает боль.
Я не думаю, что ваш пример - преждевременная оптимизация.Это логическая и критическая часть вашего алгоритма поиска.Вот почему вы можете break
из циклов или, в вашем случае, просто вернуть значение.Я не думаю, что JIT может понять, что он легко может разорвать петлю.Он не знает, хотите ли вы изменить переменную обратно на false
, если вы найдете что-то еще в коллекции.(Я не думаю, что разумно осознавать, что valueFound
не меняется обратно на false
).
По-моему, ваш второй пример не только более читабелен (valueFound
переменная - это просто дополнительный шум), но также и быстрее, потому что она просто возвращается, когда выполняет свою работу.Первый пример будет таким же быстрым, если вы установите break
после установки valueFound = true
.Если вы этого не сделаете, и у вас есть миллион проверяемых предметов, а предмет, который вам нужен, является первым, вы будете сравнивать все остальные просто даром.