Возвращать логическое значение вместо объявления пустого типа в Java? - PullRequest
14 голосов
/ 28 января 2010

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

Ответы [ 9 ]

22 голосов
/ 28 января 2010

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

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

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

Затем вместо проверки возвращаемого значения false просто поместите вызов метода в try / catch, если вы ожидаете, что метод может легко завершиться с ошибкой.

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

6 голосов
/ 28 января 2010

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

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

4 голосов
/ 28 января 2010

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

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

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

2 голосов
/ 28 января 2010

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

1 голос
/ 28 января 2010

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

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

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

1 голос
/ 28 января 2010

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

1 голос
/ 28 января 2010

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

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

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

1 голос
/ 28 января 2010

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

Однако этот шаблон встречается в основных библиотеках Java. См. File.delete () в качестве примера.

0 голосов
/ 28 января 2010

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

Бросок исключения является главной альтернативой, с за и против.

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

...