[erlang-questions] variable exported from case in OTP 18
Richard A. O'Keefe
ok@REDACTED
Thu Oct 1 08:08:08 CEST 2015
On 29/09/2015, at 9:06 pm, Martin Koroudjiev <mrtndimitrov@REDACTED> wrote:
> test(Mode) ->
> case Mode of
> r -> {ok, FP} = file:open("warn.erl", [read]);
> w -> {ok, FP} = file:open("warn.erl", [write])
> end,
> file:close(FP).
[Why is this considered worse than this rewrite?]
>
> test(Mode) ->
> {ok, FP} =
> case Mode of
> r -> file:open("warn.erl", [read]);
> w -> file:open("warn.erl", [write])
> end,
> file:close(FP).
You will get a diversity of opinions on this.
In general, I think that *avoiding* variable exports from
case, if, receive, &c can lead to contorted code.
In this specific instance, however, the original code
violates the "once and only once" principle. I'd even
prefer to see
test(Mode) ->
{ok, FP} = file:open("warn.erl", full_mode(Mode)),
file:close(FP).
full_mode(r) -> [read];
full_mode(w) -> [write].
The kind of thing that I'd call contorted is avoiding
case foo(...)
of {bar,X,Y} -> ...
; {ugh,Y,X} -> ...
end,
use(X, Y)
by writing
{X,Y} = case foo(...)
of {bar,X1,Y1} -> ..., {X1,Y1}
; {ugh,Y2,X2} -> ..., {X2,Y2}
end,
use(X, Y)
Stuffing things into a data structure just so that you can
*immediately* pull them out again is obfuscation in my book,
and renaming what are going to be the same variables is also
obfuscation.
It's better to look for a somewhat larger refactoring, if you
want to avoid this annoyance.
More information about the erlang-questions
mailing list