Jörg Schaible schrieb:
>>> IMHO we should define what we want to reach. Adding a
>>> method to an interface does not break *binary* compatibility
>>> of existing code. The method is simply not called. However, a
>>> client will have to implement the new method, if CConf is a
>>> compile time dependency *and* he uses an implementation not
>>> delivered by CConf. Maybe it is the best approach to have an
>>> abstract base class and the interface. We have to tell our
>>> users, that they should extend from the abstract class if
>>> they want to ensure backward compatibility for own
>>> implementations of the Configuration interface. Point is,
>>> that it *is* only an advice/recommendation and something like
>>> clirr will always report a violation in compatibility.
>>> Hoiwever, it is our desicion how we should proceed.
>>>
>>> - Jörg
>>>
>>>       
>> I 'd be happy to do it this way, but I am skeptical whether such a
>> policy can actually be established. You know how hard it is
>> to convince
>> people to vote +1 for a release. If clirr claims that there
>> is a binary
>> incompatible change, chances a pretty good that you get a veto.
>>     
>
> Clirr is used to detect unintentional binary incompatibility. If we document 
> the facts (in site documentation and javadoc) everybody is informed and 
> should not be surprised if we actually follow this agenda. If a new version 
> is enhancing the Configuration interface then, the release manager should 
> state this fact in release notes and vote call by documenting the *expected* 
> clirr result with a pointer to the agreement that is used as basis for the 
> incompatibility. IMHO this should be enough. Following either the interface 
> or the abstract class approach has its downside. Maybe such a combination 
> will give you the pros of both worlds.
>   
So the rule would be:
* the project provides both an interface and an abstract class that
implements that interface.
* code that *uses* the API should always use just the interface, ie
*call* methods via the interface and pass instances around as the
interface type
* code that *implements* the API should always subclass the base class.

The project reserves the right to add methods to the interface, but will
always provide a concrete default implementation on the abstract
subclass. Methods will *not* be added to the interface if a sensible
default implementation cannot be provided.

That sounds like a pretty good approach to me; seems to ensure maximum
backward compatibility while keeping a clean interface-based API (which
allows interface-based proxies to be generated at runtime).

I would agree with Jörg here, that as long as release-notes document
expected clirr incompatibilities there is no problem. Clirr can of
course be configured to ignore specific classes when processing...

Regards, Simon


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to