On Wed, 03 Nov 2010 06:02:28 -0400, spir <[email protected]> wrote:

Right. I know properties from python. This is also very close to the "principle of uniform access" supported by Bertrand Meyer for Eiffel. The latter means, from the client side, a "query" like obj.prop should not expose whether prop is directly accessed or computed and returned. This has the advantages you note above. But, in addition to the drawbacks you also note, there are 2 other relevant ones that make this scheme, indeed attractive at first sight, rather limited and risky in practice: * The advantage of beeing able to change direct access by computation only works when the comutation reqires no parameter! One obviously cannot opaquely change obj.prop to a call like obj.getProp(param)... So that using properties is only useful in practice when (1) the query was first direct (2) this needs to be replaced by computaton (3) this computation requires no parameter. Else, one would have to force the client to set parameters somewhere on the interface, before using the property; thus re-exposing the implementation.

The idea is that a property acts like a field, but is really a function under the hood. There are no parameters for property getters.

* From the efficiency pov, a client cannot know whether a given property is computed or not; worse, because of using ordinary direct access syntax it looks like cheap; moreover, the programmer may simply not know it is a property instead of an ordinary slot! This leads to blind overuse of property access, possibly severely affecting efficieny. In particular, client code may simply neglect to locally cache a property value and "read" it multiple times instead.

This is quite well solved by inlining. You should not notice any significant reduction in performance.

It also introduces synactic noise, and trouble for newcomers to the language. Python was forced to invent the @xyz format for its decorators (of which @property is an example), because of its overall syntactic esign. But D does not need that: it already has a whole set of modifiers or qualifiers well integrated in the language's syntax: private, static, override, etc. All of these key terms express the fact that a given language element (variable, function, class...) has alternate semantics and must be processed differently by D. Why make a syntactic exception for property? (I mean, if ever advantage/drawback ratio proved we simply cannot live without the feature.)

This is really a bikeshed discussion. The syntax for declaring properties was discussed at length, and @property was chosen. It's too late to change it now. Note you can use @property to describe multiple functions at once via:

@property:

or

@property
{
   ...
}


-Steve

Reply via email to