[erlang-questions] Simple multi-case
Richard A. O'Keefe
ok@REDACTED
Tue Nov 14 00:22:18 CET 2006
I wrote:
There is no such thing as code that is too small to move into a
separate function.
"datacompboy" <datacompboy@REDACTED> replied:
separate function -- more chars to type, and code far from table
itself.
More characters to type?
(a) If it makes the code clearer, what the heck does THAT matter?
(b) You can probably use machine aid. For example, it should be a
small matter to program Emacs or an Emacs-like editor (such as
Alpha) so as to add an "extract function" command. Select the
expression you want to be the body, type some chord, and presto
chango, there's a function. (This kind of thing is apparently
routine in Eclipse thse days.)
(c) If the body of the function is so small that this is a problem,
then it won't hurt to type it twice in the case expression; if
it's big enough to be annoying to write twice in the case
expression, you'll probably type *less* by making it a function.
(d) Give a specific example and then we can discuss the issue without
wandering off into generalities.
Code far from the table itself?
(e) Certainly not!
Common_Case = fun () -> .... end,
case Whatever
of foo -> Common_Case()
; bar -> Common_Case()
; ugh -> uncommon_case()
end
Apparently the Erlang compiler *doesn't* inline a local function
like this, but it *could*, and arguably it should. The main point
is that the function *doesn't* have to be far from the case.
separate function is not a problem to speed of runtime, but that
problem for development speed. I need at least create new function
name, that must contain info about "what doing here", but not "how it
doing that", since after some changes name will be wrong...
So?
Cascade CASEs better, than just copy code, and better than
separate function for short results. As for now, its my decision:)
Let me make another suggestion. The difficulty you are encountering is
a typical "code smell", of the kind that should suggest a refactoring.
What kind of refactoring? In this case: a DATA refactoring.
Suppose you have
type t() -> fee | fie | foe | fum
and you find yourself wanting to write
case X
of fee | fie -> boo()
; foe | fum -> jum()
end
Is this just an exceptional case? If so, put up with writing the case
bodies twice. If it's *not* an exceptional case; if you think you are
likely to need this again, that's a sign that you should have
type t() -> {bee,(fee|fie)} | {fly,(foe|fum)}
and the case expression should be
case X
of {bee,_} -> boo()
; {fly,_} -> jum()
end
As I said above, let's see a real example.
More information about the erlang-questions
mailing list