On May 22, 2012, at 12:06 PM, Jerome Velociter wrote:

> On Tue, May 22, 2012 at 11:50 AM, Vincent Massol <[email protected]> wrote:
>> Hi Jerome,
>> 
>> On May 21, 2012, at 7:12 PM, Jerome Velociter wrote:
>> 
>>> Hi devs,
>>> 
>>> Following a thread on github, here's a mail to start a discussion
>>> about the way we determine what is API or not.
>>> 
>>> Our current rule is :
>>> 1) "Non user-public code must be located in an internal package just
>>> after the module name." c.f. [1] (implied that what is not in internal
>>> is public)
>>> 2)  What is public has to go through the deprecation strategy described at 
>>> [2]).
>>> 
>>> I think the rule is good but there is a problem in its enforcement
>>> right now, mainly because :
>>> * There is some legacy code where 1) does not make much sense because
>>> it "arrived too late at the party" (for example in oldcore)
>>> * There is some "new code" where some classes/interfaces hasn't been
>>> made internal when they likely should have been. For example I've been
>>> playing around with the WYSIWYG recently and in the client module,
>>> there are *only* user-public classes [3]. I'm sure we can find a lot
>>> of examples of such practice and I'm OK to work and list some if
>>> needed.
>>> 
>>> The problem I see coming is that the cost of refactoring will increase
>>> for a lot of modules/classes/etc., while at the same time those
>>> modules should not have been API to begin with, and are probably not
>>> even being used as such by anybody. The risk is our progress being
>>> bogged down for no good reason.
>>> So what can we do to enforce a solid backward-compatibility policy for
>>> API code, while keeping flexibility in XWiki internals ?
>> 
>> I agree with you that all developers needs to be more careful about where 
>> they put code and they should favor the internal package (i.e code 
>> defensively) and open up APIs only when asked by someone or needed by some 
>> other modules.
>> 
>>> We could :
>>> A) Not do anything :) Maybe it's just me that sees this as a potential 
>>> problem.
>>> B) Do the work to move everything that ought to be in an internal
>>> package to an internal package. But I don't believe we're reading to
>>> make that effort, so that's not going to happen IMHO
>>> C) Do the work to move what ought to be in an internal package "on the
>>> fly", when refactoring code. That would be on a case-by-case case,
>>> probably requiring a mail to announce it ; or more coercive, a VOTE.
>>> C) We change the rule. We could decide that instead of having
>>> everything be an API and enforce the "internal" status in a special
>>> package, we take it the other way around and Day everything is
>>> internal, and APIs needs to be in a special package (or be annotated
>>> with a special annotation). This could also be the opportunity to
>>> introduce another rule that says that such APIs should be referenced
>>> in their own module documentation on extensions.xwiki.org.
>>> 
>>> What do you think ?
>> 
>> C is too much work. I prefer to keep the current rule, i.e. internal for non 
>> user-public work.
> 
> Sorry, last item should have been D) of course.
> 
>> 
>> IMO we should review modules one by one and list potential classes that 
>> should be internal instead.
> 
> Yes, that's what I've started to take a look at to see if it was just
> my imagination :)

:)

> I think doing it all at once is too much work, that's why I proposed
> in item C) to do it when actually doing something that impact such
> code.

Yes that's a good strategy.

> For example, let say I refactor something in the REST module,
> and realize there are some classes that shouldn't have been made
> public to begin with, I send a mail (possibly a VOTE?) to explain the
> deal and if we agree, the incriminating code is moved into internal
> when doing the refactoring. Of course it also means we document the
> breakage in the release notes

Yes, this is our current strategy: we're not allowed to add a CLIRR exclude 
without a VOTE.

Thanks
-Vincent

>> Now for old modules (oldcore + plugins) since we need to rewrite them IMO we 
>> just need to continue our rewriting process and when we rewrite them take 
>> that occasion to move the max stuff in the internal package.
>> 
>> I don't think we should touch existing oldcore/plugins code though to not 
>> break backward compat. since we need to move that code to new modules anyway 
>> and at that time we'll move old code to legacy modules.
>> 
>> So, unlike you, I don't think we have a major generic problem. I think we 
>> just need to be careful and make sure that committers review code committed 
>> by others and when doing this review take care to check the package.
>> This means raising the awareness of backward-compatibility in general which 
>> is what I'm trying to achieve with the new Deprecation/Legacy policy. Note 
>> to self: need to conclude on young APIs.
>> 
>> Thanks
>> -Vincent
>> 
>>> Jerome.
>>> 
>>> [1] 
>>> http://dev.xwiki.org/xwiki/bin/view/Community/JavaCodeStyle#HPackagenames
>>> [2] 
>>> http://dev.xwiki.org/xwiki/bin/view/Community/DevelopmentPractices#HBackwardCompatibility)
>>> [3] 
>>> https://github.com/xwiki/xwiki-platform/tree/master/xwiki-platform-core/xwiki-platform-wysiwyg/xwiki-platform-wysiwyg-client/src/main/java/org/xwiki/gwt/wysiwyg/client/
>>> 
>>> --
>>> Jérôme Velociter
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to