Java versus Flex: dispatch table

 
08 januari 2009

In deze serie zullen Daan Wanrooy en collega Peter Geldof Flex/ActionScript en Java/JavaFX vergelijken. Zij werken samen aan een project waar deze talen en platformen gebruikt worden. Wij hebben graag inzicht in de verschillen en overeenkomsten die er zijn.

Ontkoppeling maakt code flexibeler. Het is dan mogelijk om een component te veranderen zonder het geheel geweld aan te doen. Een manier om deze ontkoppeling te bewerkstelligen is door middel van een dispatch table.

Het grote voordeel van een dispatch table is de mogelijkheid om gedrag dynamisch te veranderen. Dit is mogelijk doordat gedrag geabstraheerd wordt in een handler. Deze handler wordt aan een bepaalde sleutel gekoppeld.

Probleemstelling
Ter illustratie implementeren wij in ActionScript en Java de volgende situatie. Iedereen heeft het over het weer. We maken een Person klasse die een commentTheWeather(WeatherType) methode heeft. Deze methode geeft, afhankelijk van het WeatherType, commentaar over het weer terug. De volgende WeatherTypes worden onderscheiden.

FREEZING, COLD, TEMPERATE, WARM, HOT

Implementaties
ActionScript
In ActionScript kan je een Dictionary object gebruiken om een weertype te koppelen aan een commentaar functie.

private var commentHandlers:Dictionary = new Dictionary();

De weertypen zijn publieke constante velden van het type String in de WeatherType klasse. Daarnaast zijn functies in ActionScript primitieve datatypen. Dat maakte het implementeren van een dispatch table voor ons zeer gemakkelijk.

Hieronder zie je een functie die een CommentHandler registreert en hoe deze wordt gebruikt:

public function registerCommentHandler(weatherType:String, commentFunction:Function):void {
 
    commentHandlers[weatherType] = commentFunction;
 
}
 
...
 
    registerCommentHandler(WeatherType.COLD, function():String {
 
        return("Lekker weertje zeg!");
 
    });

Java
Wij hebben er voor gekozen om een Map<WeatherType, CommentHandler> te gebruiken als dispatch table. Hiervoor was het noodzakelijk een CommentHandler interface te schrijven. Deze heeft maar een methode, namelijk comment() die een String teruggeeft. Wanneer een Person gevraagd wordt commentaar te geven op het weer, wordt deze methode uitgevoerd.
Daarnaast hebben wij een Enum klasse aangemaakt met de verschillende weertypen.

Hieronder zie je hoe een CommentHandler wordt geregistreerd. Er wordt gebruikt gemaakt van anonymous inner classes.

this.registerCommentHandler(
 
    WeatherType.COLD, new CommentHandler() {
 
        public String comment() {
 
            return ("Lekker weertje zeg!");
 
        }
 
});

Deze techniek wordt ook wel Function Object genoemd.

Hieronder een voorbeeld van hoe de dispatch table wordt gebruikt

    return dispatchTable.get(WeatherType.COLD).comment();

Voor- en nadelen
ActionScript
Een van de grootste voordelen is dat er function literals bestaan. Hierdoor schrijft een dispatch table zichzelf en hoeft er weinig boilerplate code geschreven te worden. Het is aan de syntax al duidelijk dat het om een functie gaat.

Er zijn ook nadelen. Hoewel ActionScript function literals heeft, zijn zij niet helemaal onafhankelijk. Het eerste argument van de call() methode verwijst naar een object. Dit heeft gelukkig geen grote gevolgen aangezien dit argument ook null mag zijn.
Daarnaast is het een nadeel dat ActionScript sterk gebonden is aan een specifiek platform. Het is niet mogelijk code te executeren buiten een shockwave player.
Verder is jammer dat ActionScript geen Enums kent. Deze constructie kan veelvoorkomende typefouten in een vroeg stadium signaleren.

Java
Het grootste voordeel van de Java versie is haar platform. Dit platform is rijk aan beproefde bibliotheken en constructies, zodat bijvoorbeeld Enums voorhanden zijn.

Een nadeel van Java is dat het geen function literals kent. Door gebruik te maken van Function Objects is dit op te vangen. Dit resulteert helaas in wat wijdlopige code. Het is, zonder commentaar, niet duidelijk dat het om een functie gaat.

Conclusie
Function literals geven een handvat om code te ontkoppelen. De function literals van ActionScript zijn niet pure functies, maar geven een werkbaar resultaat. Java kent geen function literals. Er is een alternatief in functie objecten. Dit gaat echter gepaard met wijdlopige code.


Werken met ?
Kijk dan bij onze mogelijkheden voor zowel starters als ervaren engineers.


Categorieën: Development

Tags: ,