robotlegs-as3-framework

Robotlegs ist ein schlankes Open Source ActionScript-Framework. Es kann sowohl in reinen ActionScript- als auch in Flex- bzw. AIR-Projekten verwendet werden.

Robotlegs is a pure AS3 micro-architecture (framework) with a light footprint and limited scope. Simply put, Robotlegs is there to help you wire your objects together. […] By promoting loose coupling and avoiding the use of Singletons and statics in the framework Robotlegs can help you write code that is highly testable.

Der Einstieg in Robotlegs fällt dank der guten Dokumentation, einfachen Beispielen und hübschen Diagrammen leicht. Deshalb gibt es in diesem Artikel eine kurze Übersicht, was Robotlegs auszeichnet. Darüber hinaus erläutere ich die wichtigsten Konzepte anhand eines MVC-Beispiels.

MVCS Reference Implementation

Robotlegs bringt eine vorschlagene Referenzimplementierung des Model-View-Controller-Prinzip (MVC), erweitert um den zusätzlichen Bereich „Service” für externe Datenanbindungen (MVCS). Die einzelnen Bereiche schildere unten bei der Erklärung des Beispiels.

robotlegs-mvcs

Dependency Injection

Robotlegs bietet die Möglichkeit, Variablen über die Deklarierung in den Metadaten zu "injizieren" (Dependency Injection).

Actionscript:
  1. [Inject]
  2. public var statsModel:StatsModel;

Events

Robotlegs verwendet das gewohnte Eventsystem von Flash. Man also entweder bereits vorhandene Events verwenden oder die Event-Klasse erweitern. Ebenfalls interessant (z.B. im Vergleich zum Mate Framework): Es können auch Events von Objekte erfasst werden, die sich nicht in der Display List befinden. Auch wird das Event Bubbling nicht vorausgesetzt.

Hello-World-Beispiel mit Flash (AS3)

hello-flashIm folgenden erläutere ich kurz die wichtigsten Konzepte. Das Beispiel stammt aus dem Demobundle und heißt „Hello Flash” (Beispiel und Quellcode.

Context

Startpunkt der Anwendung ist die Klasse HelloFlash.as. Dort wird ein neues Objekt der Klasse HelloFlashContext erstellt.

Actionscript:
  1. context = new HelloFlashContext(this);

Die Klasse HelloFlashContext erbt von Context und beinhaltet grundlegende Funktion (z.B. die Initialisierung der Anwendung). Sie sorgt also quasi für den nötigen "Kontext", in dem die Anwendung läuft.

Actionscript:
  1. public class HelloFlashContext extends Context
  2.     {
  3.         public function HelloFlashContext(contextView:DisplayObjectContainer)
  4.         {
  5.             super(contextView);
  6.         }
  7.  
  8.         override public function startup():void
  9.         {
  10.             // HIER DIE INITIALISIERUNGEN DURCHFÜHREN
  11.  
  12.             // And we're done
  13.             super.startup();
  14.         }

Die entsprechenden Initialisierungen führt man durch Überschreiben der Funktion startup() durch.

Eine Aufgabe dort kann sein, ein Datenmodel vorzubereiten, dass in allen anderen Klasse über [Inject] eingefügt werden kann. Dadurch wird gewährleistet, dass alle Klassen auf demselben Datenobjekt arbeiten. Dies geschieht z.B. mit injector.mapSingleton(StatsModel).

Eine andere Aufgabe kann sein, ein Objekt zur Bühne (innerhalb dieses Contexts) hinzuzufügen. Dies funktioniert z.B. mit contextView.addChild(new Readout()).

Zwei weitere Möglichkeiten für die Funktion startup, die im Anschluss erklärt werden, ist das Zuordnen von Events für den Controller (Command) und die Verknüpfung von Views mit dem dazugehörigen Mediator.

View und Mediator

Die View, also das reine Frontend (z.B. die Klasse Ball), wird mit einem dazugehörigen Mediator (z.B. Klasse BallMediator) verknüpft. Dies geschieht mit der Zeile mediatorMap.mapView(Ball, BallMediator) in der Funktion startup (siehe oben).

Der Mediator enthält quasi die Logik für die View. Er hört sowohl auf Events der View (z.B. einen Buttonklick) als auch auf Events, die vom Framework kommen (z.B. dass eine Änderung in der View durchgeführt werden soll).

Mit eventMap.mapListener(view, MouseEvent.CLICK, onClick) wird im Beispiel auf einen Mouseklick auf das Viewobjekt reagiert. Wichtig: Das Mapping im Mediator muss innerhalb der Funktion onRegister():void geschehen und nicht im Konstruktur!

Mit eventMap.mapListener(eventDispatcher, HelloFlashEvent.BALL_CLICKED, onSomeBallClicked) wird auf das Event des Frameworks reagiert (nämlich vom zentralen eventDispatcher).

Controller und Commands

Die Commands sind zustandslos und erledigen eine Aufgabe.

Commands are stateless, short-lived objects used to perform a single unit of work within an application.

Das Mapping findet ebenfalls wieder in der startup-Funktion des Contexts durch den Befehl commandMap.mapEvent() statt.

Mit commandMap.mapEvent(HelloFlashEvent.BALL_CLICKED, CreateBallCommand, HelloFlashEvent ) wird auf das Event HelloFlashEvent.BALL_CLICKED reagiert. Als Reaktion wird der Command bzw. die Klasse CreateBallCommand ausgeführt. Außerdem wird automatisch das Event, das den Command ausgelöst hat, in das Command-Objekt injiziert (so könnte man dem Event Informationen mitgeben).

Wichtig in der Command-Klasse: Die Aufgaben werden einfach durch Überschreiben der Funktion execute() erledigt.

Actionscript:
  1. override public function execute():void
  2.         {
  3.             // Add a Ball to the view
  4.             // A Mediator will be created for it automatically
  5.             var ball:Ball = new Ball();
  6.             ball.x = Math.random() * 500;
  7.             ball.y = Math.random() * 375;
  8.             contextView.addChild(ball);
  9.         }

Über contextView.addChild() wird hier beispielweise ein Objekt auf der Bühne hinzugefügt.

Links und Quellen

Link: www.robotlegs.org
Link: Robotlegs Beispiele
Link: TexFlex09 Robotlegs Slides
Link: Best Practices