Когда функция Erlang должна вернуться нормально? - PullRequest
18 голосов
/ 25 июля 2011

Я часто вижу, как функции Erlang возвращают ok, или {ok, <some value>}, или {error, <some problem>}.

Предположим, что моя функция возвращает целое число N. Должна ли моя функция возвращать только N или {ok, N}?

Или предположим, что моя функция включает вызов io:function("Yada yada"). Должен ли он вернуть ok или вообще ничего?

Или, предположим, я делаю запись или шучу. Должен ли я вернуть {ok, R} или (ok, F}?

Спасибо

LRP

Ответы [ 3 ]

25 голосов
/ 25 июля 2011

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

  • Если функция может вернуться как с успешным, так и с исправимым случаем сбоя, вы можете захотеть, чтобы случай успеха выгляделкак {ok, _} или ok.Хорошие примеры: orddict:find/2 и application:start/1.Мы делаем это так, чтобы оба случая можно было легко сопоставить с шаблоном при выполнении вызова.
  • Если функция имеет только успешный случай с значимым результатом, просто верните результат, так как нет необходимости добавлять дополнительную информацию.Фактически, если вы хотите обернуть результат в кортеж, вы не сможете легко объединить вызовы вместе, например, foo(bar(N)) может не сработать, если bar/1 вернет {ok, _}.Хорошими примерами являются: lists:nth/2 и math:cos/1.
  • Если функция имеет только успешный случай без значимого результата, общая идиома состоит в том, чтобы возвращать ok или true в отличие от любого последнегоВозвращенное значение в функции оказалось.Хорошие примеры: ets:delete/1 и io:format/1.
5 голосов
/ 25 июля 2011

Предположим, что моя функция возвращает целое число N. Должна ли моя функция возвращать только N, или {ok, N}?

Если вообще нет возможности ошибки или любой ошибкиуказывает на ошибку программирования, N.Если для сбоя может быть веская причина, верните {ok, N}{error, Reason} в случае сбоя).

Должен ли он вернуться нормально или ничего не делать?1013 * В Эрланге вы не можете вообще ничего не вернуть.Если у вас нет значимого возвращаемого значения, ok подойдет.

2 голосов
/ 26 июля 2011

Это загадка, которую я нахожу во многих случаях. Правило большого пальца (по крайней мере, мой большой палец) заключается в том, что если функция должна использоваться в первую очередь с другими функциями (функциями более высокого порядка, такими как map (), filter () и т. Д.) Или если функция предназначена для "чисто" функциональный (без побочных эффектов), тогда я бы предпочел НЕ возвращать {ok, _} и просто возвращать результат. Ошибки в этом случае должны быть связаны с некоторой логической / алгоритмической ошибкой, которая должна быть исправлена, и клиент функции должен быть осведомлен о любой такой ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...