[erlang-questions] Code critique please

Bernard Duggan bernie@REDACTED
Tue Dec 1 05:53:48 CET 2009


Jarrod Roberson wrote:
>           case Response#dns_rr.ttl == 0 of
>               true ->
>                   NewSub = dict:store(SD,dict:new(),Sub),
>                   process_dnsrec1(NewSub,[]);
>               false ->
>                   % update the dns_rr to the current timestamp
>                   NewRR = Response#dns_rr{tm=get_timestamp()},
>                   NewValue = dict:store(Key,NewRR,Value),
>                   NewSub = dict:store(SD,NewValue,Sub),
>                   process_dnsrec1(NewSub,Rest)
>           end;
>
>   
Traditionally the inner case block would be done as:

Case Response#dns_rr.ttl of
    0 -> % do stuff that was in 'true' block
    _ -> % do stuff that was in 'false' block
end;

Further, if you do do a comparison against 0, nine times out of ten you
will want to use =:= rather than ==.  The former is an exact match
against the integer 0; the latter will also match the floating point
value 0.0.  It may not seem important now, but if, to take one example,
you start using mnesia and qlc it's a really good habit to be in.

If the two-level indenting/nesting of case statements bothers you, the
easiest way is just to break the inner case statement out into another
function..or even a function with two definitions and do away with the
inner 'case' entirely:

process_ttl(0) -> % do stuff in 'true' block;
process_ttl(_) -> % do stuff in 'false' block

Also, from a stylistic point of view, I'd be inclined to alter the
return value of is_subscribed from {ok, S} to {true, S}, just because
the function name appears to ask a question, and "ok" isn't really an
answer :)

Of course, that's all just my opinion - I'm still learning this stuff
too (aren't we all?) ;)

Cheers,

Bernard


More information about the erlang-questions mailing list