Re: I am close to using a behaviour as a pure interface and I feel dirty...
Stanislav Ledenev <[email protected]>
| Newsgroups | gmane.comp.lang.erlang.general |
|---|---|
| Message-ID | <CAOkK=A+bYXpnx3R7n5W1xL05U0GtYhBSrqGmB1fDAX0Ho4gV8Q@mail.gmail.com> |
Erlang's behaviour is NOT an interface! If you are looking for some analogy from other languages the closest one is abstract classes in C#. вт, 24 авг. 2021 г. в 01:00, Brett Hemes <[email protected]>: > ... should I? > > > > I have some servers that carry around references to other (let’s call them > child) servers. Each of the referenced child servers are doing their own > thing and are implemented as different modules but also share some common > functions (albeit with different implementations). At some point, I end up > fetching a reference to a child server and want to make a call that is > common to all of the child servers. As of right now I do not know what > specific type (module) the child server is, only that they ALL offer some > subset of functionality. > > > > Assuming I am not approaching this entirely wrong (which could be the > case) I have identified two leading options for my case: > > > > 1) use a behaviour (perhaps improperly) as a pure interface (i.e., with > only callbacks and no "general" functionality). For a child implemented in > a `my_child_mod` module that implements behaviour `my_iface`, this could > result in calls like `my_iface:a_common_fun(ChildServerRef)` after fetching > the child server reference where I use the behaviour's module to access the > child's functionality... OR > > > > 2) store the particular module of each child with the reference and use > the stored module name at time of the call (and know/assume that all > children have some shared functionality). So using some tuple or similar > `{my_child_mod, ChildServerRef}` (versus just the reference) could result > in a call like `my_child_mod:a_common_fun(ChildServerRef)` after fetching > the reference info (as a tuple). > > > > I, perhaps naively, gravitate towards #1 above for various reasons > (compile-time checks, only having to carry around refs, my C++ background, > etc.), but the internet (and ferd in particular here ( > https://stackoverflow.com/questions/4119477/implementing-interfaces-in-erlang/4119615#4119615)) > seems to imply that this is not the Erlang way (despite finding OTP cases > like this: > https://github.com/erlang/otp/blob/master/lib/ssh/src/ssh_sftpd_file_api.erl). > ... shame on me? > > > > > > I am trying very hard to leave my C++ past behind and do things in the > Erlang way, but need a little help in this particular case... > > > > Thanks, > > Brett >