Hi,

Several different threads have brought up issues with sharing code between 
component sets.  Other threads have offered different and clever ways to do 
various things like how MXML is applied to a component.  Meanwhile, over in MX 
emulation, I was starting to copy some code from Basic to MXRoyale to get the 
various MX components to be valid item renderers.  MXRoyale is using Basic's 
item renderer architecture which is better encapsulated:  the renderer draws 
its hovered and selected state.  In Flex, the List draws over the renderer, 
which makes it hard to customize the way the renderer will look when hovered 
and selected.

It finally occurred to me that one of the reasons we end up copying code is 
because we are still using too many "is" checks instead of "has" checks.  I'm 
not even sure we have any "has" checks in the Royale framework.  I was afraid 
of the overhead of a "has" check, but I'm starting to change my mind because:

1) The "is" check actually runs a fair amount of code, especially for (comp is 
ISomeInterface)
2) The length of bead arrays don't seem too long.

A "has" check calls getBeadByType(ISomeInterface), so it actually will run the 
(bead is ISomeInterface) on potentially the entire strand array/vector, 
although we could speed that up by annotating beads or keeping track of what is 
on the strand.  But the code sharing/reuse potential of this pattern seems 
significant to me.  

For example, it could change how hard it is to make a component usable as a top 
tag in MXML.  Instead of the component having to implement certain methods, the 
component could have a bead installed and the MXMLDataInterpreter could talk to 
that bead instead of the component.

In the case of the item renderers, instead of testing if the renderer "is" 
ISelectableLIstItemRenderer, it could ask if the created widget "has" an 
ISelectableLIstItemRenderer bead and the logic in that bead can be reused in 
both Basic and MXRoyale without being copied.

Some code, like Container overrides of addElement probably can't be refactored 
into a "has".  But I wonder how many other things could.  I'm not sure I would 
move everything that could be moved into a shared bead.  We'd have to think 
about the overhead on small components and apps.  But for MXML support and Item 
Renderer support, it seems to make sense.

Anyway, I will look into refactoring the item renderer code in a  few days 
unless feedback indicates otherwise.  Bugs like #676 and #681 inspired this 
post.

Of course, I could be wrong...
-Alex

Reply via email to