Robert,

How about this?  We provide a "default" implementation which just uses JDK
proxies.  So, ReflectionProxyFactory would become ProxyFactory and
JavassistProxyFactory and CglibProxyFactory would just extend/override it.
That way, if we do add a method to ProxyFactory, the subclasses don't
necessarily have to override it.  The implementations would just use
reflection rather than a more advanced proxying technique.  ProxyFactory
would actually be concrete and not abstract in that case.  Does that sound
like it would work better?  Would that address your concerns with the binary
compatibility?  

James

-----Original Message-----
From: robert burrell donkin [mailto:[EMAIL PROTECTED] 
Sent: Wednesday, October 19, 2005 6:18 PM
To: Jakarta Commons Developers List
Subject: Re: [proxy] Moving Proxy to Commons Proper

On Wed, 2005-10-19 at 16:35 +0200, Knut Wannheden wrote:
> On 10/19/05, James Carman <[EMAIL PROTECTED]> wrote:
> > > i would also like to reiterate stephen's warning: if you use
interfaces,
> > > be very sure that you are not going to need to change them in any
> > > fashion. i would very strongly suggest implementing the key
> > > ProxyFactory logical interface as an abstract class. this isn't bias
(i
> > > love interfaces when coding applications) but a hard lesson painfully
> > > learnt.
> >
> > Robert,
> >
> > I understand the concerns here, but I am really torn between changing
the
> > API and leaving it like it is.  IMHO, it is *very* unlikely that a user
of
> > Commons Proxy is even going to implement ProxyFactory on their own.  If
I
> > had to ballpark it, I would be surprised if 1 out of every 100 (I might
even
> > go 1000) people who use Commons Proxy implement ProxyFactory.  That's
the
> > whole point of using Commons Proxy in the first place.  You don't have
to
> > write the proxying logic yourself!  So, what is our target here?  Are we
> > looking for 100% backward compatibility with *all* projects?  Or, are we
> > happy with keeping something more like 90% or 95% of our users happy?
Maybe
> > we could tell them in the documentation that if they have a proxying
> > technology that they wish Commons Proxy supported that they can submit a
> > request to the mailing list or into Bugzilla for it and we can take care
of
> > it (of course, any code that gets us going would help).  As long as we
> > decide between AOP Alliance vs. "rolling our own" interfaces, I'm pretty
> > happy with the ProxyFactory interface.  Besides, there's really nothing
you
> > can't do with Invokers.  That's sort of the "common denominator."
> >
> 
> In Eclipse APIs it is common practice that interfaces are never
> changed -- hence new interfaces have to be added when new changes are
> required -- and abstract classes are used where changes (in form of
> new methods) are expected (see
> http://www.artima.com/lejava/articles/designprinciples.html).
> 
> As you say the Invokers are the "common denominator". So ProxyFactory
> could be implemented as an abstract base class with the
> createInvokerProxy() method declared as abstract and the other proxy
> factory methods defined in terms of that. Concrete implementaions
> would although do best in overriding these other methods for
> performance reasons.
> 
> Although, as you say, there are probably not many users who will want
> to implement this interface anyways. So maybe it's best left as it is.
> 
> I'm torn on this one. Any other thoughs?

there are certain pitfalls associated with deep libraries that are not
commonly found elsewhere and are therefore not generally well known
amongst other communities. (by deep libraries, i mean libraries that are
used by libraries rather than applications.) these issues don't really
effect applications or frameworks. 

we often talk about two different forms of compatibility: semantic and
binary. binary compatibility is defined by the java language and
concerns when one version of a class can be substitute for another.
semantic compatibility means that existing uses don't break when one
version of a class is substituted for another.

when developing a deep library, compatibility is big issue. since the
library will be used by many other libraries and so indirectly by many,
many applications, breaking compatibility means disrupting many users
who were not aware that they even used your library. this will make you
very personally unpopular. due to the number of end users who may be
effected by changes in semantics, breaking semantic compatibility is
quite a big deal. so, it's usually better to choose delegation and
logical interfaces over subclassing frameworks.

breaking binary compatibility is a very big deal for deep libraries. by
breaking binary compatibility, all users must be forced to choose to
have only one version of the library on the classpath. if a user is
building an application and require two libraries each of which depends
on a different version of your library, this will cause them great pain
resulting in great anger. 

the problem with interfaces is that adding methods breaks binary
compatibility. 

some of the commmons components are amazingly widely distributed. proxy
is just starting out but in a year or two, maybe it'll be relied upon by
hundreds of open source libraries (as several of the deep commons
libraries are). now, imagine having to justify yourself to all those
downstream users who use those libraries why you needed to break binary
compatibility: this kind of thing really trashes your reputation and the
reputation of your component as well as upsetting all those downstream
users who'd never even heard of your library before.

but, this choice is yours. this is just advice and not a condition :)

- robert


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



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

Reply via email to