On Thu, Aug 6, 2009 at 12:50, Asiri Rathnayake<[email protected]> wrote:
Hi all,
While working on macro categories implementation I came across a small problem that made me little uncomfortable with AbstractMacro API. I'm writing this email just to make sure that I'm not making things worse in the public API.
Currently AbstractMacro has 4 constructors:
* public AbstractMacro(String description);
* public AbstractMacro(String description, ContentDescriptor contentDescriptor)
* public AbstractMacro(String description, Class< ? > parametersBeanClass)
* public AbstractMacro(String description, ContentDescriptor contentDescriptor, Class< ? > parametersBeanClass)
Now, I wanted to introduce a MacroDescriptor::getDefaultCategory() method and I also wanted to make this new parameter available in AbstractMacro constructors (makes sense). Now the problem with this is, If I introduce an optional 'defaultCategory' parameter into AbstractMacro, this will make the total number of constructors 8. What will happen if someone wants to introduce a MacroDescriptor::getIcon() method some time later?
One solution is to have setXXXX methods for those parameters instead. But then a slight problem occurs where AbstractMacro needs to somehow call setXXX methods on it's internal MacroDescriptor instance. It's not that we can't cook comething up, but it's going to look hackish.
My question is, why do we have to make AbstractMacro constructors so simple? Can't we have these two constructors only?
* public AbstractMacro();
* public AbstractMacro(MacroDescriptor);
The problem with this approach is that a client will have to do little more work like;
ContentDescriptor myContentDescriptor = new DefaultContentDescriptor("This is my content", true);
MacroDescriptor myMacroDescriptor = new DefaultMacroDescriptor("This is my macro", myContentDescriptor, beanManager.getBeanDescriptor(MyParametersClass.Class))
super(myMacroDescriptor);
Even though this is too much of work, I think it will make the API more extensible an clean.
This is not possible in java, the super()/this() has to be the first thing call in the constructor.
This is only my opinion. I didn't want to drag this issue this far but I just couldn't feel myself comfortable with the way I'm going to implement the macro categories support.
Up to you.
Thanks.
- Asiri _______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs
-- Thomas Mortagne