2017-01-31 6 views
0

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

Есть ли «лучшая практика» на этом или, по крайней мере, что-то более явное на другом языке программирования, о котором я не знаю?

ответ

0

Это не как язык агностик, как вы его делаете, это очень зависит от языка и точной цели функции. Есть довольно много три различных подхода:

  • сгенерирует исключение
  • установить флаг где-нибудь, который указывает, произошла ли ошибка
  • возвращение «вне диапазона» значение

Сейчас:

  • Некоторые языки не имеют понятия об исключениях, или «ошибка» на самом деле не является «исключительной».
  • Установка флажков ошибок может быть или не быть идеальной для данного языка. Go использует этот подход, возвращая результат, а индикатор ошибки - идиоматический по умолчанию. Javascript сделал частично идиоматичным принятие обратных вызовов, таких как function (result, err). Для других языков этот подход может оказаться неприемлемым.
  • Значения «Вне диапазона» типичны для динамически типизированных языков, но могут быть проблематичными для статически типизированных языков.

Что лучше всего подходит для рассматриваемого языка, и конкретная функция должна решаться индивидуально. Цели должны быть взвешены между пониманием смысла («строка не найдена», вероятно, не a исключение), что позволяет легко писать простой и правильный код.

+0

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

+0

Несомненно, это * проблема *, которую вы должны учитывать. В зависимости от языка это может * быть действительно удобным, чтобы объединить их вместе; например PHP часто возвращает «false» или * значение falsey, которое вы можете относить одинаково, если хотите или можете различать более подробно, когда вам нужно (классический пример 'strpos (...) === false'). Это становится очень проблематичным, когда допустимое возвращаемое значение несколько не отличается от значения ошибки. По этой причине более новые языки выбирают исключения/отдельные флаги err. – deceze