[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