On 02/05/2013 08:31 AM, Andrei Alexandrescu wrote:
On 2/5/13 3:39 AM, Dmitry Olshansky wrote:
On 02/05/2013 02:28 AM, Andrei Alexandrescu wrote:> On 2/4/13 2:04 PM,
Jonathan M Davis wrote:
>> We could save a lot of boilerplate code if we can simply make it
>> variables and
>> property functions guaranteed to be swappable without breaking code.
>
> I think this is quite powerful. The way we can do this is by making
> properties emulate a subset of actual variables.
>
This is the primary real-world proble to solve.
The problem with this approach is feature creep - there will always be
yet another possible case in which a feature helps some case. We need to
put a halt on that.
Unprotected, unchecked member variables that can be get and set without
any hooks into the enclosing structure are rare. That's not the case we
should help and cater for. When that's the case, the entire object is
legitimately a "bag of values" that has only public data.
Andrei
Hmmm. This statement that unchecked public members are rare makes me
wonder if there is a fundamental difference of background here. Things
might be much different if you came from C# or Java instead of C++.
I always get this feeling that Walter and Andrei never truly understood
how to use properties effectively. That's why I bring up C# and Java:
those programmers are very comfortable with properties and know how to
use them. Properties are an alien concept in C programming, and
probably C++ as well. As a result, I wouldn't be surprised at all of
Walter and Andrei haven't really used properties in the same capacity as
the typical C# or Java coder, and thus would think things like
"unchecked public members are rare".
This isn't a bashing post or an ad hominem; I'll try to be informative.
In C# properties actually work very well, or at least they did 8 years
ago when I used them (ignoring Java: those programmers use properties a
lot, but it is a pain). They did not require an enormous amount of
features to gain their power, and D shouldn't either. The primary
differences are these:
(1) C# usually doesn't allow address-of on /anything/.
(2) User-defined value types are rare in C#.
(3) Unambiguous property declaration syntax.
In C# if you try to use a property to return a struct and manipulate a
variable off of that, then the compiler will error because C# never
implemented property rewrites. It didn't matter because value types are
rare. (This may be dated by about 3 years.)
I think that those differences are very solvable in D:
(1) Disallow address-of on anything dealing with @property. No one will
miss it; they didn't expect it to exist in the first place.
(2) Do semantic rewriting on properties. Once you have semantic
rewriting, the value-type-properties problem is SOLVED and never needs
to be revisited again. (Disallowing value types in properties would be
poor course in a language where user-defined value types are very common.)
(3) This is pretty much solved in DIP23 already.
In both Java and C# the initial state of properties has always been a
huge pain. Just because something /might/ be a property in the future,
you always have to make a bunch of boilerplate. Java/C# programmers
probably don't believe in "bags of values"; such things are nonsense if
you want proper encapsulation! People coming from this background are
going to LOVE having a shorthand like "public @property int foo;" that
removes all of the pain from properly encapsulating public state.
Using properties in a properly-constrained system was actually very
enjoyable.
The above is why I don't see feature creep. The D designers probably
don't see where it ends because they've never been to that edge.
I worry that I could be totally wrong about Andrei/Walter's experiences
in these arenas. I don't assert these notions as truth, but instead as
a way of communicating my perceptions. I hope this is informative and
not insulting.