Nick Sabalausky wrote:
"Zhenyu Zhou" <rin...@gmail.com> wrote in message news:h4rfif$2os...@digitalmars.com...
e.g.
Rectangle rect(Rectangle r) {
 _rect = r;
 redraw();
 return _rect;
}

If you allow
widget.rect.w = 200;
widget.rect.h = 100;
you will have to write much more code to handle the painting correctly.
and we don't want to call redraw twice here


I've dealt with that sort of thing in C# and it's a trivial issue. When you write code such as the above, it's very clear that you're changing the rect twice. If that's a problem, you just do this:

widget.rect = Rect(200, 100);

Easy.

It's kind of a moot point anyhow, because most respectable graphics frameworks will defer any rendering until all properties have been set. Something like this:

   class Rect {

      private int _w;
      private int _h;
      private boolean _dirty;

      property set w(int value) {
         _w = value;
         _dirty = true;
      }

      property set h(int value) {
         _h = value;
         _dirty = true;
      }

      void draw() {
         if (_dirty) {
            // rendering code
            _dirty = false;
         }
      }

   }

Rendering code is *never* invoked from within a property-setter, and property values are never changed during rendering code. (Also, there's usually a separate "measurement" phase, following the manual property-setting phase, within which properties can be changed to suit the positional constraints but where no rendering occurs.)

Anyhow, I think those kinds of considerations are mostly orthogonal to a discussion of properties, in the general sense, except insofar as the existence of a property syntax makes it more convenient to implement things like dirty-flag marking, property-change listeners, and the like.

--benji

Reply via email to