Let me clarify, I have no problem with adding Factories and using them
everywhere possible.  Just don't take my access away from direct
constructors.


On Fri, Jan 25, 2013 at 9:39 AM, Rob Godfrey <rob.j.godf...@gmail.com>wrote:

> In general dependency on implementation is bad, dependency on interface is
> better.  One of the problems we've had with Qpid historically is it become
> hard to test as we have dependencies on implementation everywhere.
>
> From an end user perspective the difference is only replacing
>
> X x  = new X();
>
> with
>
> X x = XFactory.newInstance();
>
> But it makes it a lot easier to properly describe the functionality being
> returned. For implementation reasons, the concrete class may have public
> methods that are not intended to be exposed to the application programmer
> but only to other cooperating classes.  To avoid confusion, and to make it
> clear to us the delta between the "shared" API and the API extensions that
> we are supporting for the pure Java implementation the interfaces seem like
> the right way to go for me.
>
> The idea is that those who need the extension features will still have a
> very clear way to get the implementation that provides these, without ever
> having to cast.
>
> -- Rob
>
>
>
>
>
> On 24 January 2013 20:03, Rafael Schloming <r...@alum.mit.edu> wrote:
>
> > On Thu, Jan 24, 2013 at 5:06 AM, Rob Godfrey <rob.j.godf...@gmail.com
> > >wrote:
> >
> > > On 23 January 2013 17:36, Phil Harvey <p...@philharveyonline.com>
> wrote:
> > > >
> > > > As part of the Proton JNI work, I would like to remove all calls to
> > > > proton-j implementation constructors from "client code".  I intend
> that
> > > > factories will be used instead [1], thereby abstracting away whether
> > the
> > > > implementation is pure Java or proton-c-via-JNI.
> > > >
> > > > I'd like to check that folks are happy with me making this change,
> and
> > to
> > > > mention a couple of problems I've had.
> > > >
> > > > In this context, "client code" is anything outside the current
> > > > sub-component, where our sub-components are Engine, Codec, Driver,
> > > Message
> > > > and Messenger, plus each of the contrib modules, and of course third
> > > party
> > > > code.
> > > >
> > > > To enforce this abstraction, I am planning to make the constructors
> of
> > > the
> > > > affected classes package-private where possible.  I believe that,
> > > although
> > > > third party projects might already be calling these constructors, it
> is
> > > > acceptable for us to change its public API in this manner while
> Proton
> > is
> > > > such a young project.
> > > >
> > >
> > > +1 to all of the above
> > >
> > > >
> > > > Please shout if you disagree with any of the above.
> > > >
> > > > Now, onto my problem.  I started off with the
> > > org.apache.qpid.proton.engine.
> > > > impl package, and found that  o.a.q.p.hawtdispatch.impl.AmqpTransport
> > > calls
> > > > various methods on ConnectionImpl and TransportImpl, so simply using
> a
> > > > Connection and Transport will not work.  I don't know what to do
> about
> > > > this, and would welcome people's opinions.
> > > >
> > >
> > > So, the simplest change would be to change the factories to use
> > > covariant return types
> > >
> > > e.g. EngingFactoryImpl becomes:
> > >
> > >     @Override
> > >     public ConnectionImpl createConnection()
> > >     {
> > >         return new ConnectionImpl();
> > >     }
> > >
> > >     @Override
> > >     public TransportImpl createTransport()
> > >     {
> > >         return new TransportImpl();
> > >     }
> > >
> > >
> > > ... etc
> > >
> > > Code that requires the extended functionality offered by the pure Java
> > > implementation can thus instantiate the desired Factory directly.
> > >
> >
> > What's the point of going through the factory in this scenario rather
> than
> > directly instantiating the classes as Hiram suggests? Is there some class
> > of thing the factory would/could do that the constructor can't/shouldn't?
> >
> > A second refinement might be to actually separate out the interface
> > > and implementation within the pure Java implementation so that we have
> > > a well defined "extended" Java API.  This interface could then be the
> > > return type of the factory.
> > >
> >
> > Maybe I'm misunderstanding, but what's the point of using an interface
> here
> > if you're still locked into the pure Java impl? Are you expecting to swap
> > out that impl under some circumstances?
> >
> > --Rafael
> >
>



-- 

**

*Hiram Chirino*

*Engineering | Red Hat, Inc.*

*hchir...@redhat.com <hchir...@redhat.com> | fusesource.com | redhat.com*

*skype: hiramchirino | twitter: @hiramchirino<http://twitter.com/hiramchirino>
*

*blog: Hiram Chirino's Bit Mojo <http://hiramchirino.com/blog/>*

Reply via email to