[Engine-devel] Simplifying our POJOs

Mike Kolesnik mkolesni at redhat.com
Wed Feb 1 06:03:47 UTC 2012


----- Original Message -----
> On 01/31/2012 12:45 PM, Doron Fediuck wrote:
> > On 31/01/12 12:39, Livnat Peer wrote:
> >> On 31/01/12 12:02, Mike Kolesnik wrote:
> >>> Hi,
> >>>
> >>> Today many POJO
> >>> <http://en.wikipedia.org/wiki/Plain_Old_Java_Object>s
> >>> are used throughout the system to convey data:
> >>>
> >>>   *   Parameters - To send data to commands.
> >>>   *   Business Entities - To transfer data in the parameters &
> >>>   to/from
> >>>     the DB.
> >>>
> >>> These POJOs are (usually) very verbose and full of boilerplate
> >>> code
> >>> <http://en.wikipedia.org/wiki/Boilerplate_code>.
> >>>
> >>> This, in turn, reduces their readability and maintainability for
> >>> a
> >>> couple of reasons (that I can think of):
> >>>
> >>>   * It's hard to know what does what:
> >>>       o Who participates in equals/hashCode?
> >>>       o What fields are printed in toString?
> >>>   * Consistency is problematic:
> >>>       o A field may be part of equals but not hashCode, or vice
> >>>       versa.
> >>>       o This breaks the Object.hashCode()
> >>>         <http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode%28%29>
> >>>         contract!
> >>>   * Adding/Removing fields take more time since you need to
> >>>   synchronize
> >>>     the change to all boilerplate methods.
> >>>       o Again, we're facing the consistency problem.
> >>>   * These simple classes tend to be very long and not very
> >>>   readable.
> >>>   * Boilerplate code makes it harder to find out which methods
> >>>   *don't*
> >>>     behave the default way.
> >>>   * Javadoc, if existent, is usually meaningless (but you might
> >>>   see some
> >>>     banal documentation that doesn't add any real value).
> >>>   * Our existing classes are not up to standard!
> >>>
> >>>
> >>> So what can be done to remedy the situation?
> >>>
> >>> We could, of course, try to simplify the classes as much as we
> >>> can and
> >>> maybe address some of the issues.
> >>> This won't alleviate the boilerplate code problem altogether,
> >>> though.
> >>>
> >>> We could write annotations to do some of the things for us
> >>> automatically.
> >>> The easiest approach would be runtime-based, and would hinder
> >>> performance.
> >>> This also means we need to maintain this "infrastructure" and all
> >>> the
> >>> implications of such a decision.
> >>>
> >>>
> >>> Luckily, there is a much easier solution: Someone else already
> >>> did it!
> >>>
> >>> Check out Project Lombok: http://projectlombok.org
> >>> What Lombok gives us, among some other things, is a way to
> >>> greatly
> >>> simplify our POJOs by using annotations to get the boilerplate
> >>> code
> >>> automatically generated.
> >>> This means we get the benefit of annotations which would simplify
> >>> the
> >>> code a whole lot, while not imposing a performance cost (since
> >>> the
> >>> boilerplate code is generated during compilation).
> >>> However, it's also possible to create the methods yourself if you
> >>> want
> >>> them to behave differently.
> >>> Outside the POJO itself, you would see it as you would always see
> >>> it.
> >>>
> >>> So what are the downsides to this approach?
> >>>
> >>>   * First of all, Lombok provides also some other capabilities
> >>>   which I'm
> >>>     not sure are required/wanted at this time.
> >>>       o That's why I propose we use it for commons project, and
> >>>       make use
> >>>         of it's POJO-related annotations ONLY.
> >>>   * There might be a problem debugging the code since it's
> >>>   auto-generated.
> >>>       o I think this is rather negligible, since usually you
> >>>       don't debug
> >>>         POJOs anyway.
> >>>   * There might be a problem if the auto-generated code throws an
> >>>   Exception.
> >>>       o As before, I'm rather sure this is an edge-case which we
> >>>       usually
> >>>         won't hit (if at all).
> >>>
> >>>
> >>> Even given these possible downsides, I think that we would
> >>> benefit
> >>> greatly if we would introduce this library.
> >>>
> >>> If you have any questions, you're welcome to study out the
> >>> project site
> >>> which has very thorough documentation: http://projectlombok.org
> >>>
> >>> Your thoughts on the matter?
> >>>
> >>
> >> - I think an example of before/after pojo would help demonstrating
> >> how
> >> good the framework is.
> >>
> >> - Would it work when adding JPA annotations?
> I suspect that yes (needs to be checked)
> Will it work with GWT (if we create new business entity that needs to
> be
> exposed to GWT guys) ?

As it is stated on the site, it supports GWT.

> >>
> >>> Regards,
> >>> Mike
> >>>
> > 
> > Watching the demo it looks like we'll get less code, which in many
> > cases is a good thing.
> > What I'm concerned about is traceability; or- how can we track
> > issues coming from the field
> > when function calls and line numbers in the stack trace will not
> > match the code we know.
> > 
> 
> _______________________________________________
> Engine-devel mailing list
> Engine-devel at ovirt.org
> http://lists.ovirt.org/mailman/listinfo/engine-devel
> 



More information about the Engine-devel mailing list