On Thu, May 3, 2012 at 10:47 AM, Vincent Massol <[email protected]> wrote:
> Hi devs,
>
> We have recently voted a rule where we said that we will do the following:
> * Always deprecate APIs
> * Always move them to Legacy modules
> * And when there's a technical issue to moving stuff to the Legacy module, 
> only then, send a VOTE to remove an API
> (see http://markmail.org/message/tino4ngttflc5i3s).
>
> This means that from now on (starting on 26th of April 2012)  we're not 
> allowed to put excludes in CLIRR.
>
> However I've seen that we have added some CLIRR excludes after the vote was 
> passed.
>
> I believe that the main issue we have is for "young" APIs that are not 
> considered stable.
>
> Proposal 1: Internal package
> =========
>
> * Young APIs must be located in the "internal" package till they become 
> stable. I propose "internal" to reuse an existing package that we filter when 
> testing for CLIRR. "internal" means that users should not use this API 
> because it's considered unstable and can change at any time.
> * When a Young API is considered stable enough and we want to open it to 
> public consumption then we move it from "internal" to its target package 
> (that's easy to with IDEs). From that point forward any changes to them goes 
> through  the standard mechanism of deprecation/legacy.

> * If we want to add a new method to an existing public API then this should 
> not be considered a "young" API. It's just an addition to an existing API and 
> thus goes directly to the deprecation/legacy cycle.

It's not clear for me how we can keep backward compatibility when
adding a new method to an interface. What do you put in legacy?

> * We need to be careful to isolate "young" APIs from public API so that users 
> don't inadvertently use "young" unstable APIs by mistake. If not possible 
> then directly go through the deprecation/legacy cycle.
>
> The advantage of this proposal is that it doesn't change our current 
> practices and is very easy to verify through CLIRR.

+1

Thanks,
Marius

>
> Proposal 2: Experimental package
> =========
>
> Another possibility I can think of is to introduce a new "experimental" 
> package instead of reusing the "internal" one. It has the advantage of being 
> able to follow "young" APIs and ensure they don't stay in that state 
> indefinitely, while still allowing the user who uses it to notice it's 
> experimental.
>
> Proposal 3: Experimental Annotation
> =========
>
> Another idea is to just use an @Experimental javadoc tag  for experimental 
> code. It has the advantage of using the target package but it has drawbacks:
> * It's impossible for users to notice that they're using Experimental APIs 
> since when they import a class they won't see anything that'll tell them 
> they're using a "young" API
> * It's almost impossible to tell CLIRR to exclude those APIs from its checks. 
> The only way to do this is to modify the source code of the CLIRR plugin 
> AFAIK. Thus we would need to exclude those manually using CLIRR excludes and 
> thus before we release we would need to go over the full list of CLIRR 
> excludes to ensure the excludes listed are only for "young" APIs marked 
> "experimental".
>
> Note that I mentioned javadoc tag and not annotation because I believe we 
> need to add information about when the Experimental API was first introduced 
> so that we eventually move it as a proper API by removing the Experimental 
> tag. Maybe we would need a rule such as: keep that tag for less or equal to 3 
> full minor releases (i.e. 6 months).
>
> WDYT? Any other idea?
>
> Thanks
> -Vincent
>
> _______________________________________________
> devs mailing list
> [email protected]
> http://lists.xwiki.org/mailman/listinfo/devs
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to