Возвращать логическое значение вместо объявления типа void в Java?

StackOverflow https://stackoverflow.com/questions/2156033

  •  23-09-2019
  •  | 
  •  

Вопрос

Существуют ли какие-либо жесткие правила относительно возврата логического значения в сигнатуре метода, указывающего на успешную операцию, а не на объявление void?Я обнаружил, что для более важных операций в моем вызывающем методе мне нужно знать, завершилась ли операция, чтобы я мог зарегистрировать любые проблемы.Это «неуместное» использование логического значения?

Это было полезно?

Решение

Обычно я использую Exceptions, чтобы сигнализировать, когда что-то пошло не так.

Вместо возвращения false, ты можешь throw а Exception с подробным сообщением о том, в чем проблема.

Возвращение false не дает вам много информации о проблеме.

Тогда вместо проверки false возвращаемое значение, просто поместите вызов метода try/catch если вы ожидаете, что метод может легко потерпеть неудачу.

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

Другие советы

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

Если исключения кажутся неприятными, вы можете вернуть собственный объект Status, который содержит логическое значение и сообщение о состоянии (что-то вроде «Добавлено 6 новых Foobars!» или «Не удалось добавить Foobars, потому что Foobin заполнен!»), хотя это, конечно, так. более сложный.

Делайте это только в тех сценариях, где ясно, что что-то имеет логический результат.Нравиться IsValidCustomer() или что-то в этом роде.

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

Так что либо позвольте исключению всплывать в стеке, либо поймайте его и превратите в собственное исключение, либо зарегистрируйте его, либо что-то еще.

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

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

Однако этот шаблон встречается в основных библиотеках Java.Видеть Файл.удалить() В качестве примера.

Для возврата успеха обычно вы видите следующее:

  • Вернуть логическое значение
  • Вернуть void, но выдать исключение в случае ошибки
  • Вернуть код состояния (реже встречается в Java).

Не вижу ничего плохого в возврате логического значения в случае успеха, если только вам не нужна информация о поведении исключений.

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

На практике я считаю, что лучше всего создавать исключение, когда сбой означает, что нам нужно прервать процесс.Например, если вы пытаетесь обработать заказ — выставить счет клиенту, организовать доставку, оплатить налоги с продаж и т. д. — если вы не можете найти запись о заказе, вероятно, нет смысла выполнять всю остальную работу.Ты просто хочешь уйти оттуда.Исключения позволяют вам легко это сделать.Просто поймайте нижнюю часть блока, отобразите или зарегистрируйте ошибку и уходите.

С другой стороны, если «ошибка» означает, что моя программа выбирает другой путь выполнения, возврат логического значения имеет больше смысла.Например, если я ищу конкретного клиента, и если он существует, я обновляю его запись, а если нет, я создаю новую запись клиента, тогда имеет большой смысл вернуть логическое значение и проверить его в вызывающем объекте. и когда истинно, следуйте одним путем, а когда ложно – другим.

На самом деле это два совершенно разных значения слова «ошибка», и они требуют разного подхода.Вполне возможно, что одна и та же функция может выполнять и то, и другое.Например, при обнаружении возвращается true, при не найденном возврате false, при ошибке ввода-вывода при попытке чтения выдается исключение.

Вроде бы все в порядке, но дьявол кроется в деталях.;-)

Вызов исключения — основная альтернатива, имеющая свои плюсы и минусы.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top