Adding a new design constraint to D
forkit
forkit at gmail.com
Tue Jun 14 05:43:49 UTC 2022
So there has been extensive discussions in other threads, around
the idea of adding a new 'design constraint feature' to the D
programming language.
The design constraint feature, is 'designed' to allow the
programmer to make an explicit declaration, that some aspect of
the design of a class, should be private to that class, and
thereby make that aspect of the class (logically) inaccessible to
code outside of that class, but in the same module.
The constraint could, in theory, apply to other types such as
struct or enum. But the suggestion currently relates to the class
type only.
The below example compiles just fine, as you would expect.
// ------
module test;
@safe:
class someClass
{
private:
string _id;
public:
void setID(string id)
{
// some condition(s), if met, then:
_id = id;
}
}
unittest
{
someClass myclass = new someClass();
myclass.setID("123");
}
// -----
Is the above code consistent with the design intent of someClass?
The answer must be yes, since in D, private is private to the
module.
But what if the intent was to require other code to 'use the
inteface' to access x?
The problem is, many coming to D, come from languages where you
can already declare such an intent, and equally importantly, have
that intent enforced by the compiler, at compile time.
But the D programming language has no feature to declare such an
intent. So where does this leave those programmers?
The argument has been made, that D does not need such a feature,
because scope is always at the module level.
But it does not follow, that scope at the module level eliminates
the need for such a feature. That argument is not logical.
The next response, is that if you need this feature, then you can
'simulate it' by putting the class that needs this feature, into
its own module.
However, the one-class-per-module approach, imposes its own new
design constraint, and not one the programmer necessarily makes
of his/her own volition.
It also does not necessarily follow, that a class in its own
module, is there for the purposes of stipulating this constraint.
There are any number of a reason, why a class might be put into
its own module. You cannot infer anything from that. You'd have
to speak the designer to know intent.
Other arguments have also been made against adding such a
feature, but it is difficult to take them seriously - such as
'why would a class ever need to hide something'.
Now the advantage of adding such a feature, is that it provides
private at the scope level for those who want or expect such a
feature, it provides evidence of the designers intent to separate
implementations from interface, and the compiler which now knows
the intent, can enforce that intent, at compile time.
So the only logical outcome of this discussion, is whether the
benefit of adding a design constraint *option* to the language,
outweighs the cost of adding it to the langauge.
The benefits of adding this feature appear to be self-evident.
So ultimately, this comes down to a benefit-vs-cost consideration.
The cost of adding it to the language, is less self-evident.
Is the cost, the unjustified cognitive burden of having both
'private' and 'private(scope)', instead of just 'private'?
Is the cost - it's just too complicated to change the compiler
source to accomodate this option?
What do you think the cost of adding such a feature is?
More information about the Digitalmars-d
mailing list