Final by default?

Kapps opantm2+spam at gmail.com
Sat Mar 15 14:25:51 PDT 2014


On Saturday, 15 March 2014 at 18:18:28 UTC, Walter Bright wrote:
> On 3/15/2014 2:21 AM, Paulo Pinto wrote:
>> In any language with properties, accessors also allow for:
>>
>> - lazy initialization
>>
>> - changing the underlying data representation without 
>> requiring client code to
>> be rewritten
>>
>> - implement access optimizations if the data is too costly to 
>> keep around
>
> You can always add a property function later without changing 
> user code.

In many situations you can't. As was already mentioned, ++ and 
taking the address of it were two such situations.

ABI compatibility is also a large problem (less so in D for now, 
but it will be in the future). Structs change, positions change, 
data types change. If users use your struct directly, accessing 
its fields, then once you make even a minor change, their code 
will break in unpredictable ways. This was a huge annoyance for 
me when trying to deal with libjpeg. There are multiple versions 
and these versions have a different layout for the struct. If the 
wrong library is linked, the layout is different. Since it's a D 
binding to a C file, you can't just use the C header which you 
know to be up to date on your system, instead you have to make 
your own binding and hope for the best. They tr
y to work around this by making you pass in a version string when 
creating the libjpeg structs and failing if this string does not 
exactly match what the loaded version. This creates a further 
mess. It's a large problem, and there's talk of trying to 
eventually deprecate public field access in libjpeg in favour of 
accessors like libpng has done (though libpng still uses the 
annoying passing in version since they did not use accessors from 
the start and some fields remained public). Accessors are 
absolutely required if you intend to make a public library and 
exposed fields should be avoided completely.


More information about the Digitalmars-d mailing list