Class parameters that are either setable at run-time or compile-time
Martijn Pot via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sun Aug 10 08:08:14 PDT 2014
On Sunday, 10 August 2014 at 10:47:34 UTC, Markus Mayr wrote:
> Hello,
>
> I am new to D. I am sorry if this question was already answered
> or if it is trivial. I am having a class. That class takes
> several parameters that may be known at either compile time or
> run time. I want users of my class to be able to pass the
> parameters either as template parameters to the class or to the
> constructor of that class. At the moment, I have got the
> following code:
>
> class X(int a = some_dummy_value, int b = some_dummy_value)
> {
> static if (a == some_dummy_value) static immutable int
> a_ = a;
> else immutable int a_;
>
> // etc.
>
> this(int a = some_dummy_value, int b =
> some_dummy_value) {
> static if (a != some_dummy_value) this.a_ = a;
> static if (b != some_dummy_value) this.b_ = b;
> }
> };
>
> This works, as far as I can tell. But there is one problem:
> users may forget to provide the value at compile time and run
> time. In that case, the members a_, b_ end up with
> some_dummy_values. Of course, I can notify the user at run time
> about this misbehaviour, but I would prefer to tell them at
> compile time.
>
> The only solution I am aware of is to use static if in order to
> provide one of four constructors depending on the compile time
> values of a, b, i.e.
> * none provided at compile time,
> * a provided at compile time,
> * b provided at compile time,
> * both provided at compile time.
>
> This is perfectly fine for one or two arguments, but I have
> gotten three of them (i.e. 8 constructors) and may want to add
> more later on. Since the number of constructors scales
> exponentially with the number of parameters, I have a feeling
> that this approach won't scale well.
>
> Is there any elegant solution to the problem?
>
> By the way, this is why I am doing this: Depending on the
> values of a and b, the class chooses how to implement some
> parts of its interface; if a or b are not provided, it may
> choose generic but slow fall back implementations. If there is
> any other solution to that problem, I also would like to know.
>
> Thanks a lot and I hope this is how this mailing list works!
>
> Best regards,
> Markus Mayr
A couple of words (search terms) pop up in my mind:
1) inversion of control / Dependency injection.
The class has a member which does the actual work. This member is
a reference to an object passed in e.g. the constructor.
2) Factory pattern
A Factory determines how the object are created. Don't let the
objects do that themselves. This breaks the single responsibility
'rule'. Note that a Factory works nice together with 1).
3) Inheritance. You could create multiple classes which override
certain functions. This also works with 1) and 2)
More information about the Digitalmars-d-learn
mailing list