On Saturday, 2 February 2013 at 23:23:37 UTC, TommiT wrote:
You say "there's no real benefit". I say "there's the benefit of being able to add another layer of encapsulation when it's needed". Here's what I mean by that:

The lack of encapsulation with @property attribute:

struct T
{
    private int _value;

    void add_twice(int v)
    {
        _value += 2 * v;
    }
}

struct S
{
    private T _t;
    private int _sum_of_squares; // Can't update this

    @property ref T prop()
    {
        return _t;
    }
}

void main()
{
    S s;
    s.prop.add_twice(); // *Not* incrementing s._sum_of_squares
}

I'd just call that bad design, I wouldn't reference a variable like that unless it's returned const or I don't care about if anything else accesses it. Since T/_t is private you shouldn't be giving access to them without a good reason.


...Whereas with memberspaces we can add that extra layer of encapsulation:

struct S
{
    private T _t;
    private int _sum_of_squares;

    memberspace prop
    {
        ref const(T) opCall() const
        {
            return _t;
        }

 So this one's allowed a const get return....

        void add_twice(int v)
        {
            _sum_of_squares += (2 * v)^2; // Yippee!
            return _t.add_twice(v);
        }
    }
}

Hmmm curiously the above previous example didn't include add_twice outside of T. had it of and had a const get I'm sure these would be about the same.

I'll your example(s) here reflect a bad/different design rather than why namespaces should be used.

Besides, wasn't namespaces in D handled due to initial modular setup and alias?

Reply via email to