Do non-member functions improve encapsulation in D?

Lars T. Kyllingstad via Digitalmars-d digitalmars-d at puremagic.com
Mon Apr 21 01:33:20 PDT 2014


On Sunday, 20 April 2014 at 13:01:53 UTC, Gary Willoughby wrote:
> On Sunday, 20 April 2014 at 11:12:42 UTC, Lars T. Kyllingstad 
> wrote:
>> However, in D, all functions defined in the same module as a 
>> class will have access to the private state of that class, on 
>> an equal footing with its member methods.  Therefore, the 
>> above statment doesn't really help in deciding which to use.
>
> Yeah it does. If the function can be used generically across 
> many different parts of the program then it would be much 
> better implemented as a non-member function, even if it's 
> defined in the same module as an associated class.

I agree.  If a function is generally useful outside the context 
of a class, it should not be defined in the class.


> Functions which are focused to only deal with data associated 
> with a particular class then these would be better suited to be 
> implemented as a method of that class.

This is the tricky part, an it is where I have a hard time 
deciding which to use.  For example:

     struct File {
         private int fileno;
         void read(ubyte[] buf) {
             core.sys.posix.unistd.read(fileno, buf.ptr, 
buf.length);
         }
     }

Why, or when, is the above preferable to the following?

     struct File {
         private int fileno;
     }
     void read(File f, ubyte[] buf)
         core.sys.posix.unistd.read(f.fileno, buf.ptr, buf.length);
     }

I still haven't heard any fact-based, logical arguments that 
advise me on which style to use, and so far it seems to be just 
that -- a matter of style.

There are a few clear-cut cases, such as when a function should 
be virtual, or when it is part of a predefined interface (e.g. 
input range), but in the general case one seems just as 
"encapsulated" as the other.


More information about the Digitalmars-d mailing list