Как оставить поведение функции обратного вызова невыполненным? - PullRequest
0 голосов
/ 21 мая 2019

Предположим, у меня есть gen_server:

-module(myserver).
-behavior(gen_server).
-export([init/1, handle_call/3]).

init(Arg) -> % ...
handle_call(Request, From, State) -> % ...

. При компиляции это, естественно, выдает предупреждение:

myserver.erl:2: Warning: undefined callback function handle_cast/2 (behaviour 'gen_server')

Как мне поступить с этим предупреждением, если мой сервер непонадобится handle_cast/2?Определить ли функцию-заполнитель только для удовлетворения компилятора?Например:

handle_cast(_Request, _State) -> unimplemented.

Или я игнорирую / подавляю предупреждающее сообщение?

Как правильно написать gen_server, где будут использоваться не все функции обратного вызова?

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Мы НЕ должны игнорировать предупреждающее сообщение, это затрудняет отслеживание ошибок / ошибок в нашем приложении в будущем.Оставить функцию заполнителя лучше, но она должна выглядеть следующим образом:

handle_cast(_Msg, State) ->
    {noreply, State}.

По умолчанию эта функция не может передавать данные вызывающей стороне, поэтому вы можете избежать сбоя приложения, когда вы или ваши коллегииспользуйте gen_sever:cast/2.

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

handle_call(_Request, _From, State) ->
    {reply, ok, State}.

handle_cast(_Msg, State) ->
    {noreply, State}.

handle_info(_Info, State) ->
    {noreply, State}.

terminate(_Reason, _State) ->
    ok.
1 голос
/ 21 мая 2019

Как мне поступить с этим предупреждением, если моему серверу не понадобится handle_cast / 2?

Тогда ваш сервер не является gen_server, так что вы можетеудалите строку:

-behavior(gen_server).

, что заставляет компилятор проверить наличие функций обратного вызова gen_server.

Суть в том, что OTP требует контракт между вашим кодом иОТП поведения.Если вы не хотите придерживаться договора, вы не можете использовать OTP-поведение.Другими словами, вам необходимо реализовать ВСЕ функции обратного вызова.

Рекомендуется ли добавить протоколирование в предположительно неиспользуемую функцию обратного вызова, чтобы их непреднамеренное использование появилось в журналах?

Это зависит от вас.Это звучит как хорошая идея для меня.

...