[fpc-devel] Re: Class field reordering

Giuliano Colla giuliano.colla at fastwebnet.it
Sun Jul 22 19:52:01 CEST 2012


Il 22/07/2012 10:39, Michael Van Canneyt ha scritto:
>
>
> On Sat, 21 Jul 2012, Florian Klämpfl wrote:
>
>> Am 21.07.2012 23:06, schrieb Ivanko B:
>>> No, just reorder the fields so that they can be properly $IFDEFed as
>>> protected for nonLAZARUS and left (private) as is otherwise.
>>
>> Why should lazarus people have less chances to mess with private fields?
>> Either we make them public for all or for nobody. Of course, then
>> everybody has to take care of the fact that users might mess with these
>> fields.
>
> Which is exactly why we will not do this.
>
> The base classes expose a well-defined API. This API is a contract you 
> make with the developers of descendent classes.
>
> Some fields are kept private to ensure that the terms of the contract 
> can be met. Making them public/protected means that the terms of the 
> contract can be broken by Developer A, when the code of developer B 
> depends on the terms being rigorously enforced, and his code can go 
> very wrong.
>
> This is of course not so for all private fields, which is why I ask 
> for reasons, so I can decide for each field what can or cannot be done.
>
There are excellent reasons not to expose private fields. What must be 
opaque and what must be visible to end users are designers decisions 
which involve the capability of providing new implementation without 
breaking existing code, take into account multiplatform needs, consider 
the planned improvements, etc. etc.

On the other side there are sometimes good and sound reasons for someone 
to break this rule, at his own risk, of course. It may be to quickly fix 
a bug, to provide an extra feature by reusing an existing object instead 
of rewriting a lot of code, etc. Of course this is a practice not to be 
recommended in general, but it occurs. And in many cases it is connected 
to specific needs which aren't of general interest, making the effort of 
supporting them hardly worthwhile.

IMHO a clean solution can be found at language level: if I declare

TMyclass = class(TWhatever)

then I just get the degree of visibility that the class designer has 
decided.

But if I declare (just an example, a better keyword can be found)
TMyclass = subclass(TWhatever)
then I get full visibility, all the private fields of TWhatever become 
just protected in TMyclass, and of course, I'm on my own. The designer 
is not bound to any contract, because I have explicitly decided to run 
the risk.

This solution would allow mainstream designers to keep fields visibility 
to what they deem to be a safe level in general, without making it 
impossible to non mainstream designers to provide features which aren't 
considered of general interest.

Just my 5 cents.

Giuliano




More information about the fpc-devel mailing list