On Fri, 11 Feb 2011 17:26:29 -0500, Andrej Mitrovic <andrej.mitrov...@gmail.com> wrote:

On 2/11/11, bearophile <bearophileh...@lycos.com> wrote:
Steven Schveighoffer:

Any code can access any members defined in the current module, regardless

of access attributes

I am not sure if Walter understands how much this rule makes it hard for
people not already used to protected/private attributes to understand and learn to use those attributes correctly. The C# compiler doesn't have that rule, and it's much more strict. I think this makes learning the usage of
those attributes faster.

Bye,
bearophile


I think one benefit of the current approach is that we'll be able to
use free functions which could be called as if they belong to a class
(if they have that class as the first parameter), since we could use
the uniform function call (UFC) syntax. But UFC doesn't work with
classes yet, otherwise we might be able to do this:

module foo;
import std.stdio;

class Foo {
    private int _x, _y;
    this(int x, int y) {
        _x = x;
        _y = y;
    }
}

int sumXY(Foo foo) {
    return foo._x + foo._y;
}

module main;
import foo;
import std.stdio;

void main() {
    auto obj = new Foo(10, 10);
    writeln(obj.sumXY());  // using UFC, but doesn't work yet
    //~ writeln(obj._x + obj._y);  // not allowed
}


What's wrong with:

class Foo {
    private int _x, _y;
    this(int x, int y) {
        _x = x;
        _y = y;
    }
    int sumXY() {
        return _x + _y;
    }
}

We could have a bunch of templated functions in the foo module which
could work with any class inside that module. So it might help out
against the common God class problem. What do you think?

I'm unaware of this problem, but I'm not sure it's a huge problem. The UFC syntax is a marginal benefit, making a function look like it's part of the class. The "horrible" alternative is to simply call the function with Foo as a parameter instead of the source. i.e. f(x) vs. x.f()

Couldn't the same be achieved via mixins? And in fact, the mixin I think can be defined in a separate module, more flexible.

-Steve

Reply via email to