[erlang-questions] Must and May convention
Joe Armstrong
erlang@REDACTED
Wed Sep 27 11:08:02 CEST 2017
For several years I've been using a convention in my hobby
projects. It's what I call the must-may convention.
I'm wondering if it should be widely used.
What is it?
There are two commonly used conventions for handling bad arguments to
a function. We can return {ok, Val} or {error, Reason} or we can
return a value if the arguments are correct, and raise an exception
otherwise.
The problem is that when I read code and see a function like
'foo:bar(a,12)' I have no idea if it obeys one of these conventions or
does something completely different. I have to read the code to find
out.
My convention is to prefix the function name with 'must_' or 'may_'
If I see must_ in the name I know the arguments to the function must
be correct and that the function will return {ok,Val} | {error,Why}
If I see may_ in the name I know the arguments must be correct but if
they are not an exception will be generated, with meaningful data in
the exception so I can see what went wrong.
If a function follows neither of these conventions then it can do
whatever it feels like.
- example -
I have a library of interface functions,
something like:
must_read_file(F) ->
case file:read_file(F) of
{ok, Bin} ->
Bin;
{error, _} ->
io:format("Could not read file ~p~n",[F]),
exit({must,violation,read_file, F})
end.
may_read_file(F) -> file:read_file(F).
Now my source code becomes more readable
test(F) ->
Bin = must_read_file(F),
...
or
test(F) ->
case may_read_file(F) of
{ok, B} ->
..
{error, _} ->
..
end.
This turns out to be very convenient - I read many files
in my programs, so it's nice to know that must_read_file
will print a nice error message and terminate
if I give it a bad filename.
Note: I can get the program to crash by writing
{ok, B} = file:read_file(F)
But I don't get a nice error message telling me the filename.
Any takers?
Cheers
/Joe
More information about the erlang-questions
mailing list