[Engine-devel] [engine-devel] frontend builders proposal

Eli Mesika emesika at redhat.com
Sat Jan 26 20:58:57 UTC 2013



----- Original Message -----
> From: "Tomas Jelinek" <tjelinek at redhat.com>
> To: engine-devel at ovirt.org
> Sent: Friday, January 25, 2013 11:55:43 AM
> Subject: [Engine-devel] [engine-devel] frontend builders proposal
> 
> Hi All,
> 
> as many of you may know, the way how the frontend and backend models
> are built on frontend (uicommonweb project) is not really ideal.
> Currently this logic is copy pasted over and over again to different
> places where it is needed with minor changes to fulfill the specific
> requirements. It is not only aesthetically problematic, but I recall
> tons of bugs caused by introducing a new field and forgetting to add
> it to every place it is used in GUI.
> 
> Now, as there will be big changes in the VM/Template models
> (http://www.ovirt.org/Features/Instance_Types), so the way how the
> VM, Template, Pool and also the newly created Instance Types models
> are being built has to be touched anyhow, it is a great opportunity
> to rethink the way how we do it.
> 
> I have created a simple infrastructure
> (http://gerrit.ovirt.org/#/c/10874/) which could be used for it, and
> a PoC patch which uses this infrastructure
> (http://gerrit.ovirt.org/#/c/11354/). Please note that the PoC is
> not really impressive in means of removing duplications, I wanted to
> start with the simplest possibility.
> 
> The principles behind the infrastructure:
> - have small, well named, easy to understand and reuse builders
> - this builders can be chained together or embedded to each other to
> build the full resulting object (composite pattern)
> - this builders can be asynchronous, and the next builder in the
> chain has to be executed only when the current is completely done
> 
> The structure:
> - the base is an interface called Builder which has a method
> build(source, destination, rest)
> - the builder implementing this interface
>   + will get the source and destination objects
>   + copies whatever he wants from source to destination
>   + when done, executes build on the first element of the rest
>     + this may sound awkward, but this is the way how the async calls
>     can be "linearized" in a general way, not embedding anonymous
>     class into anonymous
>       class into anonymous class... as we do it today.
>     + for synchronous builders, there is a BaseSyncBuilder which
>     takes care of this boilerplate calling of next and exposes a
>     simple method
>       build(S source, D destination)
>   + to simplify the creating and running the chain of builders, there
>   is a BuilderExecutor class (can be created as sync or async)
> 
> So, a simple example - even more simple than the PoC patch :)
> 
> //create the first builder
> class FirstLetterBuilder extends BaseSyncBuilder<String,
> StringBuilder> {
>  @Override
>  protected void build(String source, StringBuilder destination) {
>      // copy the first letter to the destination
>      destination.append(source.charAt(0));
>  }
> }
> 
> //create the second builder
> class SecondLetterBuilder extends BaseSyncBuilder<String,
> StringBuilder> {
>  @Override
>  protected void build(String source, StringBuilder destination) {
>      // copy the second letter to the destination
>      destination.append(source.charAt(1));
>  }
> }
> 
> // usage
> ...
> // create the destination object
> StringBuilder res = new StringBuilder();
> 
> // configure the executor with the two builders
> BuilderExecutor<String, StringBuilder> executor = new
> BuilderExecutor<String, StringBuilder>(
>         new FirstLetterBuilder(),
>         new SecondLetterBuilder()
>         );
> 
> // execute the builder chain ("ab" is the source, res the
> destination)
> executor.build("ab", res);
> 
> // use the result
> ...
> 
> That's it. And the nice part is, that this FirstLetterBuilder and
> SecondLetterBuilder can be reused anywhere or combined with any
> other builders.
> 
> Any comments on this will be more than welcome!

great and really simplifies work and eliminate bugs resulted from copy/past code
gave +1 
Thanks
Eli
> 
> Thank you,
> Tomas
> _______________________________________________
> Engine-devel mailing list
> Engine-devel at ovirt.org
> http://lists.ovirt.org/mailman/listinfo/engine-devel
> 



More information about the Devel mailing list