Do non-member functions improve encapsulation in D?
monarch_dodra via Digitalmars-d
digitalmars-d at puremagic.com
Sun Apr 20 01:25:45 PDT 2014
On Sunday, 20 April 2014 at 07:11:41 UTC, Lars T. Kyllingstad
wrote:
> In his article "How non-member functions improve encapsulation"
> [1], Scott Meyers makes a good argument for why free functions
> should generally be preferred over class methods in C++.
> TL;DR: Fewer member functions means fewer functions that break
> when the class implementation changes, and free functions can
> be spread across different header files, allowing client code
> to only #include the ones that are needed.
>
> In D, the situation is somewhat different. Firstly, private
> symbols are accessible throughout the module within which the
> class/struct is defined, and secondly, UFC allows us to call
> free functions using the same syntax as member functions. In
> other words, *any* non-virtual function could in principle be
> written as a free function.
>
> The fact that "private" really means "module private" in D
> means that any number of functions can break when a
> class/struct implementation changes. So if we are to take
> Meyers' advice, we have to define a new module for each
> class/struct, and move its associated free functions to
> neighbouring modules. However, this would lead to a
> proliferation of modules that I doubt anyone would want.
>
> So, can anyone think of some good guidelines for when to make a
> function a member, when to write it as a free function in the
> same module, and when to move it to a different module?
>
>
> [1]
> http://www.drdobbs.com/cpp/how-non-member-functions-improve-encapsu/184401197
One thing to keep in mind, is that with the module system, and
templates, is that free functions can only be called if the
module *knows* about your free function.
For example "int[]" is a range thanks to the free
"front/popFront", but also *because* `std.range` imports
`std.array`, and as such *knows* about them.
If you tried the same thing yourself, with your user defined
type, it wouldn't work.
From there, while I'm inclined to say that "yes, non-member
functions improve encapsulation", everything that "defines" an
object *must* be member. Anything non-member is second class, and
"helper".
More information about the Digitalmars-d
mailing list