resueltos - ¿Cuándo debería una función de Erlang regresar bien?
erlang jk (3)
A menudo veo que las funciones de Erlang vuelven ok
, o {ok, <some value>}
, o {error, <some problem>}
.
Supongamos que mi función devuelve un entero N. ¿Debería mi función devolver solo N o {ok, N}
?
O supongamos que mi función incluye la llamada io:function("Yada yada")
. ¿Debería volver ok
o nada?
O supongamos que estoy haciendo un disco o diversión. ¿Debo devolver {ok, R}
o (ok, F}
?
Gracias,
LRP
Supongamos que mi función devuelve un entero N. ¿Debería mi función devolver solo N o {ok, N}?
Si no hay posibilidad de error en absoluto, o cualquier error indica un error de programación, N
Si puede haber una buena razón para fallar, devuelva {ok, N}
(y {error, Reason}
en caso de falla).
¿Debería volver bien o nada?
En Erlang, no puedes devolver nada en absoluto. Si no tiene un valor de retorno significativo, ok
lo hará bien.
Es una cuestión de estilo, pero tomar decisiones razonables hace mucho para que su código sea más fácil de leer y mantener. Aquí hay algunos pensamientos basados en mis propias preferencias y lo que veo en la biblioteca estándar:
- Si la función puede regresar con un caso de falla tanto exitoso como recuperable, puede querer que el caso de éxito se vea como
{ok, _}
ook
. Buenos ejemplos son:orddict:find/2
yapplication:start/1
. Hacemos esto para que ambos casos puedan coincidir fácilmente con los patrones al realizar la llamada. - Si la función solo tiene un caso de éxito con un resultado significativo, simplemente devuelva el resultado ya que no es necesario agregar información adicional. De hecho, si tuviera que envolver el resultado en una tupla, entonces no podrá encadenar llamadas fácilmente, por ejemplo,
foo(bar(N))
puede no funcionar si labar/1
devuelve{ok, _}
. Buenos ejemplos son:lists:nth/2
ymath:cos/1
. - Si la función solo tiene un caso de éxito sin un resultado significativo, el lenguaje común es devolver
ok
otrue
en lugar de lo que sea el último valor devuelto en la función. Buenos ejemplos son:ets:delete/1
yio:format/1
.
Este es un enigma que me encuentro en muchas ocasiones. La regla del pulgar (al menos mi pulgar) es que si una función se va a usar principalmente con otras funciones (funciones de orden superior como map (), filter () etc.) o si la función está diseñada para ser "puramente" funcional (sin efectos secundarios), entonces preferiría NO devolver un {ok, _} y simplemente devolver el resultado. Los errores en este caso deben ser debidos a algún error lógico / algorítmico que debe solucionarse y el cliente de la función debe conocer este error.