[erlang-questions] OO programming style in Erlang?
Ulf Wiger
ulf@REDACTED
Mon Jan 22 12:39:10 CET 2007
Den 2007-01-22 11:52:35 skrev Ladislav Lenart <lenartlad@REDACTED>:
> *Question:* Based on what should I decide how a particular
> piece of functionality should be implemented?
As far as possible, try to separate side-effect free code
from that with side-effects. Typically, at least 90% of
your code can be made side-effect free, and it's a good
idea to really isolate the remaining 10%.
This also affects your interface design. Try to make
sure that your interfaces do not mandate side-effects.
Compare e.g. dict.erl and ets.erl
ets:insert(Tab, Obj) -> true % mandates side-effects
dict:store(Key, Value, Dict1) -> Dict2 % doesn't
> For example, there are dict and orddict modules which have compatible
> (polymorphic) interfaces but differ in their implementations. This is
> essentially good, but when I actually use one of these modules, my
> code will look like
>
> orddict:new()
> orddict:store(...)
>
> But this is bad because when I later decide to change (my)
> implementation I actually have to go through my code and
> replace orddict with dict. So this is not a polymorphism
> I am looking for.
A fairly common solution to this dilemma is to use
your own wrapper functions
dict_new() ->
orddict:new().
etc.
You could also use a macro, of course:
-define(DICT, orddict).
?DICT:store(...)
but I much prefer the wrapper function.
One reason is that ?DICT can really be any
syntactic expression, so anytime a macro is
used, the reader has to make sure he/she knows
what's hidden behind it.
> *Question:* Is there a way such polymorphism can be
> achieved in Erlang without actually merging (see above)
> the modules that should behave polymorphically?
No universally agreed upon common method, no,
if I understood your question correctly.
Xmerl, for example, introduced a notion of module
inheritance, with which one were supposed to extend
the functionality of export callbacks. See e.g.
http://jungerl.cvs.sourceforge.net/jungerl/jungerl/lib/xmerl/src/xmerl.erl?revision=1.2&view=markup
mainly lines 267-313.
(or the OTP source tree for a more current version.)
I don't know if anyone has actually made use of it.
BR,
Ulf W
--
Ulf Wiger
More information about the erlang-questions
mailing list