Properties

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Sun Jan 11 11:45:00 PST 2009


Denis Koroskin wrote:
> On Thu, 08 Jan 2009 03:45:08 +0300, Vishaal <vishaal at nospam.com> wrote:
> 
>> Properties, such as array.length, should return lvalues to allow:
>> a.length += 8;
>> or other similar statements.
> 
> I'd like to point out another related issue that everyone seems to miss.
> 
> The following code is taken from a GUI library:
> 
> struct Rect
> {
>    int x, y, width, height;
>    void reset() { x = y = width = height = 0; }
> }
> 
> class Control
> {
>    //...
> 
>    Rect rect()
>    {
>        return _rect;
>    }
> 
>    void rect(Rect newRect)
>    {
>        _resizeControl(newRect);
>    }
> 
>    void _resizeControl(Rect rect)
>    {
>        // ...
>    }
> 
>    private Rect _rect;
>    //...
> }
> 
> Imagine rect is not a property but a field, first. How would you mutate 
> it? I'd do it as follows:
> 
> Control c = new Control();
> c.rect.reset();
> c.rect.width = 100;
> 
> Both lines do nothing when field replaced with a property. Code is 
> broken but there is no complains from compiler.
> You should write the following code instead:
> 
> Control c = new Control();
> auto tmp = c.rect;
> tmp.reset();
> c.rect = tmp;
> 
> auto tmp = c.rect;
> tmp.width = 100;
> c.rect = tmp;
> 
> but it doesn't look good. Compiler could be smarter in this regard - it 
> could generate the code above automatically whenever a mutating method 
> is called on a property.
> 
> And here is also another issue I can't wait to be fixed. The following 
> syntax:
> auto prop = foo.prop();
> 
> works for properties but not for fields, meaning that whenever code 
> author decides to change it from property to field, user code is broken. 
> Properties should not have optional braces!
> 
> As a result, properties and fields can not be used interchangeably until 
> issues above are fixed.

This is a very strong argument. The issue is related to the fact that 
calling a member function is allowed on an rvalue, an anomaly that D 
inherited from C++.

Andrei



More information about the Digitalmars-d mailing list