Hi Stefan,

Let me start by saying that the roles proposal had not in mind
solving the polimorphism issue (which I think is what is at the bottom 
of your points here). I have no problem on arriving to a solution that
covers this aspect, but I do not want it to be the stumbling block
on the whole thing. 

> From: Stefan Bodewig [mailto:[EMAIL PROTECTED]
> 
> On Mon, 28 Apr 2003, Costin Manolache <[EMAIL PROTECTED]> wrote:
> 
> 
> > - addComponent( MyRole ) or addMyRole( MyRole ) or both ?
> 
> I assume you are taking MyRole as the name of the interface here, as
> I'm not convinced that we need formal roles at all.
> 

I agree with you here, the main problem I see with adding a "MyRole"
name to the name of the method is that it will hardcode this name
in the code of everyone. Moreover this will be a global name which
will complicate any handling of 3rd party roles and implementations.
I think this would be a name administration nightmare.

In the antlib proposal the name of the role (or as I would like to call it
the alias for the role is only to help on declarations but with
respect to the code of programmers such names are irrelevant, 
the only thing they care is Java types.

> 
> Let's take DependSet as an example.  It has two kinds of nested
> FileSets, srcfileset and destfileset.  For the sake of discussion lets
> assume that placing ClassFileSet or ZipFileSet for either "kind" of
> FileSet was useful - I think it is at least for ZipFileSet.
> 
> <dependset ...>
>   <zipfileset src="some.zip"/>
> </dependset>
> 
> with the approach you describe, 
> 
> If we follow the "name determines implementation" route you've
> described here, both addSrcfileset(FileSet) and
> addDestfileset(FileSet) would be candidates for methods to call.  We
> need a way to resolve this - probably via an extra attribute that
> explicitly says "I'm a srcfileset".  Something like
> 
> <dependset ...>
>   <zipfileset src="some.zip" element="srcfileset"/>
> </dependset>
> 
> The alternative approach (taken by Mutant IIRC) would look like this
> 
> <dependset>
>   <srcfileset src="some.zip" type="zipfileset"/>
> </depenset>
> 
> Here the approach is to look up the expected interface by the method
> name.
> 
> I feel this second approach is easier in the (rare?) cases where
> things are ambiguous, but it also forces people to always explicitly
> state the type.  I'm not sure that the later is a drawback, though.
> 

As I said at the begining roles where not design for doing this.
There are several things we need to consider, first is whether
the task uses "create" or "add[Configured]", certaintly the use 
of "create" will disallow we passing a different object.
But if you look at ANT today you will see that in both cases we allow
passing a different instance via refids (actually is upto
the data-type to support this).

Now if the datatype where to allow specifying something equivalent
to a refid but in place, we could get the desired effect without
major changes. So lets assume we add to the FileSet class a new method

        addConfigured(FileSet inplaceref){ 
                // do something similar to what setRefid() does.
        }

now we can write the above as follows:

 <dependset>
   <srcfileset>
        <zipfileset src="some.zip"/>
   </srcfileset>
 </depenset>

which it does not look too bad, and does not need special attributes.

> With this approach the parent completely determines which element
> names are supported as nested elements and at the same time clearly
> states which interface is expected from the child element.
> 
> This makes documenting stuff a lot easier.  Imagine the nested
> elements of copy.  <copy> accepts nested <fileset>s or any element
> whose name maps to a class that extends
> org.apache.tools.ant.types.FileSet?
> 
> I think the learning curve for beginners to grok
> 
> <copy ...>
>   <classfileset .../>
>   <zipfileset .../>
> </copy>
> 

This is what you would get with the current roles as long as <copy> 
has something like:

        addConfigured(Fileset fs){...}

> is steeper than the alternative
> 
> <copy ...>
>   <fileset type="classfileset" .../>
>   <fileset type="zipfileset" .../>
> </copy>
> 
> I'm not really sure myself, I've argued the first approach myself when
> we discussed it the last time around (because the non-ambiguos case
> requires less typing 8-)

I do not like the "type" attribute, type is already use on several places
like <available> an I really think the buildfiles from the first one are more 
easy to understand and write (once you know how to use it).

It means that we would need to do a better job describing how things
work genericaly and explain better the concept of generic nested elements.
But we had always had this problem of explaining how nested things work.

Jose Alberto

Reply via email to