On Friday, 30 December 2016 at 23:49:23 UTC, Andrei Alexandrescu
wrote:
The main win, which indeed is not emphasized enough, is better
encapsulation. Walter pointed that out, and I will redo the DIP
to put that front and center.
Maybe i can provide an example where i think DCD's would be
usefull.
Im experimenting with a more Qt like signals and slots
implementation,
it introspects some type for function declarations with the
@("Signal") uda
and mixes them into the current type.
It currently looks like this:
// moda.d
interface TestSignals
{
import modb: TestType;
@("Signal"):
void someTestSig(TestType);
}
// modb.d
struct TestType{}
// test.d
class A : SignalObject
{
import moda: TestSignals;
import modb: TestType; // has to be manually imported for the
generated signal
mixin signalsOf!(SignalList, TestSignals);
interface SignalList
{
@("Signal"):
void foo(int);
void bar(string, int = 100);
int bar(int a, int b);
}
void someFun(string s) { s.writeln; }
}
class B : SignalObject
{
struct SignalList
{
@("Signal"):
void someSig(string);
}
mixin signalsOf!SignalList;
void fooHandler(int i){ i.writeln; }
int onBar(int a, int b){ writeln(a + b); return a + b; }
void onBar(string s, int i){ writeln(s, i); }
import modb: TestType;
void someTestSigHandler(TestType t){ t.writeln; }
}
class C : SignalObject
{
import modb: TestType; // has to be manually imported for the
generated signal
mixin signalsOf!(A, B);
// i wanted to support string based signal declaration
// but that would require double manual import declarations
// import modb: TestType;
// enum signalList =
// q{
// import modb: TestType;
// @("Signal"):
// void someSig(TestType);
// int someOtherSig();
// }
// mixin signalsOf!signalList;
}
void main(string[] args)
{
auto a = new A;
auto b = new B;
auto c = new C;
a.connect!"foo"(&b.fooHandler);
a.connect(b); // connect all bar's with all onBar's
a.foo(66);
a.bar("asd");
a.bar(4, 6);
c.connect!"someSig"(&b.someSig);
b.connect!"someSig"(&a.someFun);
c.someSig("emitted by c forwarded by b handled by a");
a.connect!"someTestSig"(&b.someTestSigHandler);
c.connect!"someTestSig"(&b.someTestSigHandler);
import modb: TestType;
TestType t;
a.someTestSig(t);
c.someTestSig(t);
}
i assume with DCD's i could remove those manual imports if they
get some traits.