[Engine-devel] Simplifying our POJOs
Livnat Peer
lpeer at redhat.com
Wed Feb 1 06:59:32 UTC 2012
On 01/02/12 08:03, Mike Kolesnik wrote:
>
> ----- 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.
>
Since this package is required only during compile time it is relatively
easy to push it in.
Need to make sure it is working nice with debugging and give it a try.
I like this package,
+1 from me.
>>>>
>>>>> 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
>>
> _______________________________________________
> 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