I remember being baffled when trying to figure out events.  I managed to cobble 
something together for the Cocoa UI processor from snarfing bits of code from 
elsewhere, but I wince in pain whenever I revisit the code.  

So FWIW, I support Dean's proposal.

Brian.

On 22-Sep-2011, at 3:30 PM, Dean Roberts wrote:

> While trying to understand UIEvents and how the topics are built up for 
> subscribe operations I found the buildTopic() methods a little cumbersome and 
> a barrier to understanding what was really going on. 
> 
> I would like to make a suggestion that I think would 
> 
>         1) Make the code look cleaner 
>         2) Make the concepts clearer 
>         3) Improve run time performance (albeit marginally) 
> 
> For illustration purposes, here is an example of an interface definition from 
> UIEvents for the UIElement model object generated by GenTopic 
> 
>         public static interface UIElement { 
>                 public static final String TOPIC = UIModelTopicBase + 
> "/ui/UIElement"; //$NON-NLS-1$ 
>                 public static final String ACCESSIBILITYPHRASE = 
> "accessibilityPhrase"; //$NON-NLS-1$ 
>                 public static final String CONTAINERDATA = "containerData"; 
> //$NON-NLS-1$ 
>                 public static final String CURSHAREDREF = "curSharedRef"; 
> //$NON-NLS-1$ 
>                 public static final String ONTOP = "onTop"; //$NON-NLS-1$ 
>                 public static final String PARENT = "parent"; //$NON-NLS-1$ 
>                 public static final String RENDERER = "renderer"; 
> //$NON-NLS-1$ 
>                 public static final String TOBERENDERED = "toBeRendered"; 
> //$NON-NLS-1$ 
>                 public static final String VISIBLE = "visible"; //$NON-NLS-1$ 
>                 public static final String VISIBLEWHEN = "visibleWhen"; 
> //$NON-NLS-1$ 
>                 public static final String WIDGET = "widget"; //$NON-NLS-1$ 
>         } 
> 
> To subscribe to an event that tracks a UIElements visible change you would 
> write 
> 
> eventBroker.subscribe(UIEvents.buildTopic(UIEvents.UIElement.TOPIC, 
> UIEvents.UIElement.VISIBLE), visibilityHandler); 
> 
> To subscribe to all changes to UIElement you would write 
> 
> eventBroker.subscribe(UIEvents.buildTopic(UIEvents.UIElement.TOPIC), 
> visibilityHandler); 
> 
> I think it would be much nicer to write, for the first case, 
> 
> eventBroker.subscribe(UIEvents.UIElement.VISIBLE), visibilityHandler); 
> 
> or, for the second case, 
> 
> eventBroker.subscribe(UIEvents.UIElement.ALL), visibilityHandler); 
> 
> To make this possible I propose that we would generate the UIElement 
> interface definition like this. 
> 
>         public static interface UIElement { 
>                 public static final String ALL= UIModelTopicBase + 
> "/ui/UIElement/*"; //$NON-NLS-1$ 
>                 public static final String VISIBLE = UIModelTopicBase + 
> "/ui/UIElement/" + "visible"; //$NON-NLS-1$ 
>                 ... 
>         } 
> 
> This would allow us to delete two of the buildTopic() methods.  We could 
> leave the 3 argument version of buildTopic() to retain construction of topics 
> that filter based on event type ( although nobody calls this internally at 
> this time so do we really need it?). 
> 
> The code would also be more efficient as we would be removing method calls 
> that do string concatenation with simple static references.  In fact, I 
> believe the compiler will just in line the references at compile time. 
> 
> Although I would be a fan of simply making these changes and requiring 
> consumers to make a few small simplifying changes, we could provide a 
> stepping stone by regenerating the new shape, deprecating the buildTopic() 
> methods and all the TOPIC fields.  We would then change the implementation of 
> the buildTopic methods to return the appropriate constant directly without 
> concatenating. 
> 
> Admittedly there is higher priority work to be done but since this class is 
> essentially API, if we don't change it now, we will never be able to make the 
> change.  And I think the clarity in the subscribe statements make the change 
> worth it.  This change seems to fit well with the Eclipse 4 mantra that 
> simple things should be simple.   
> 
> I also believe the effort required to change GenTopic to generate the new 
> shape is small, and I volunteer to create the patch.  Admittedly changing the 
> calling code to use the new shape is more wide spread, but a very simple 
> task.  Although an actual committer probably wants to do that work as it 
> would be a LOT of patches to apply :-) 
> 
> What does the community think?  Does it make sense?  Am I totally off base? 
> 
> [email protected]
> _______________________________________________
> e4-dev mailing list
> [email protected]
> https://dev.eclipse.org/mailman/listinfo/e4-dev

_______________________________________________
e4-dev mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/e4-dev

Reply via email to