Flashhilfe.de - Flash Community

Typsichere PureMVC Verwendung [Flash 10]

 


AntwortenRegistrieren Seite1  

springer#1
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

14.11.2010, 18:00

hi,
ein nachteil von puremvc scheint mir die nicht typsierte übergabe von daten in den notifications. zudem bin ich nicht ein fan davon, immer wieder switch anweisungen zu schreiben.
ich habe mir da was kleines überlegt. sind sicher schon mehrere drauf gekommen, wollte das aber hier noch reinstellen.

ich erstelle im Command und im Mediator eine map mit den notifications und dessen handlern, welche die notification verarbeiten. das abstrakte Command kann dann folgendermassen aussehen:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package
{
     import flash.utils.Dictionary;
     
     import org.puremvc.as3.interfaces.INotification;
     import org.puremvc.as3.patterns.command.SimpleCommand;
     
     public class AbstractCommand extends SimpleCommand
     {
        private var map : Dictionary;
        
        public function AbstractCommand()
        {
           super();
           this.map = new Dictionary();
        }
        
        protected function mapHandler( notification:String, handler:Function ):void{
           this.map[ notification ] = handler;
        }
        
        override public function execute(notification:INotification):void{
           var name:String = notification.getName();         
           if( this.map[ name ] && this.map[ name ] != null ){
              var handler:Function = this.map[ name ] as Function;
              handler( name, notification.getBody(), notification.getType() );
           }
        }
     }
}


der abstrakte mediator könnte so aussehen:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package
{
     import flash.utils.Dictionary;
     
     import mx.collections.ArrayCollection;
     import mx.events.FlexEvent;
     
     import org.puremvc.as3.interfaces.INotification;
     import org.puremvc.as3.patterns.mediator.Mediator;
     import org.puremvc.as3.patterns.observer.Notification;
     
     public class AbstractMediator extends Mediator
     {
        protected var interests : Array;      
        protected var map       : Dictionary;
        
        public function AbstractMediator(mediatorName:String=null, viewComponent:Object=null)
        {
           super(mediatorName, viewComponent);
           this.interests = new Array();
           this.map = new Dictionary();
        }
        
        protected function mapHandler( notification:String, handler:Function ):void{
           this.interests.push( notification );
           this.map[ notification ] = handler;
        }
        
        override public function handleNotification(notification:INotification):void{
           var name:String = notification.getName();         
           if( this.map[ name ] && this.map[ name ] != null ){
              var handler:Function = this.map[ name ] as Function;
              handler( name, notification.getBody(), notification.getType() );
           }
        }
        
        override public function listNotificationInterests():Array{
           return this.interests;
        }
     }
}


die konkrete implementierung eines commands könnte dann so aussehen:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package
{
     public class ConcreteCommand extends AbstractCommand
     {
        public function ConcreteCommand()
        {
           super();
           this.mapHandler( ApplicationFacade.TEST_COMMAND, testHandler );
        }
        
        private function testHandler( notification:String, body:TestVO, type:String ):void{
           // ....
      }
     }
}



die konkrete implementierung eines mediators könnte so aussehen:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package
{
     import org.puremvc.as3.interfaces.INotification;
     public class ConcreteMediator extends AbstractMediator
     {
        public static const NAME : String = "TESTMEDIATOR";
        
        public function ConcreteMediator( viewComponent:Object=null )
        {
           super( NAME, viewComponent );
           this.mapHandler( ApplicationFacade.TEST_COMMAND, testHandler );
        }
        
        private function testHandler( notification:String, body:TestVO, type:String ):void{
           // ....
      }
     }
}


das sonst übliche überschreiben der methoden listNotificationInterests, handleNotification im Mediator, und execute im Command wird damit hinfällig... finde das noch nützlich und erspart einem doch die eine oder andere zeile code....

grüsse
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
Geändert von springer am 14.11.10 um 18:04 Uhr
Werbung
Beiträge: 0
Registriert: Feb 2016


Sebastian#2
Benutzerbild von SebastianFlashhilfe.de Moderator
Beiträge: 6981
Wohnort: München
Registriert: Jan 2002

17.11.2010, 00:14

Sieht interessant aus. Vor allem das der Wert durch die Methoden Definition gleich typisiert ist gefällt mir.

Was mir nur aufgefallen ist. Ich arbeite aktuell an einem Projekt wo es einige Module gibt die von Basis Mediatoren Erben um bestimmte Eigenschaften von vorne rein zu unterstützen. Da man diese Eigenschaften ab und zu auch überschreiben möchte, könnte es zu einer kleinen unschöhnheit kommen bzw. weis ich nicht wie PureMVC da reagiert.

ActionScript:
1
2
3
4
protected function mapHandler( notification:String, handler:Function ):void{
     this.interests.push( notification );
     this.map[ notification ] = handler;
}


Du arbeitest an der Stelle zwar mit einem Dictonary was ich auch gut finde da du so den Eintrag überschreiben kannst, allerdings macht das PureMVC nicht mit dem interests Array. Ich würde daher noch eine Abfrage einfügen ob die Notification bereits im Array enthalten ist, und falls ja diese nicht noch einmal hinzufügen.
ActionScript:
1
2
3
4
5
6
7
8
protected function mapHandler( notification:String, handler:Function ):void
{
     if(interests.indexOf(notification) === -1)
     {
        this.interests.push( notification );
     }
     this.map[ notification ] = handler;
}
Wie gesagt, evtl. macht es aber auch keinen Unterschied. ;)


1.) Hast Du mit dieser Implementierung bereits ein Projekt realisiert?
2.) Bist Du an einem Punkt gekommen wo die Art der Implementierung evtl. doch mal hinderlich war?
3.) Wie sieht es mit Kollegen aus die den Code von Dir bearbeiten möchten. Finden die sich schnell zurecht oder sind die erst einmal irritiert bzw. sehen die Implementierung nicht und fügen wie gewohnt die listNotificationInterests hinzu? - leider kann man die Methode ja nicht überschreiben und als final bzw. private deklarieren.
JavaScript & JavaFX Freelancer || Flashhilfe @ Twitter || XING Profil
springer#3
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

Themenautor/in

17.11.2010, 08:28

hi, danke fürs feedback...

1) ja, alle privaten projekte mache ich so. ich habe mir dazu eine library angelegt, und leite alle mediatoren und commands von meinen klassen ab, anstelle der standardklassen von puremvc.
2) bis jetzt nicht, da es ja von der funktionsweise her nichts anderes ist als zb. folgendes:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
override public function handleNotification(notificatio:INotification):void{
       switch( notification.getName()){
             case TestCommand.TEST:
                  handleTestCommand( notification.getBody() )
             break;
       }
}

private function handleTestCommand( body:TestVO ):void{
         //......
}


ich hatte anfangs immer so versucht möglichst lange handlenotification-funktionen zu verhindern. hat bis zu einem gewissen grad auch funktioniert. übersichtlich wurde es dadurch aber nicht gerade. mit der erweiterung sieht man jetzt gleich im konstruktor, welche notification auf welche funktion gemappt ist, und kann daher gleich in die funktion springen. vorher musste ich trotzdem immer in der switch den funktionsnamen suchen...

3) kann ich nicht beurteilen, da ich mit meiner library bisher nicht in teams gearbeitet habe. die umstellung, finde ich zumindest, ist nicht weltbewegend. man muss sich dann einfach dran halten, weil es wie du schon sagst, in kombination mit der "üblichen" weise nicht funktioniert, oder man dann sachen "ausschaltet".

das mit der überprüfung ob die notification schon gemappt ist, finde ich noch gut... ich weiss jetzt gar nicht ob handlenotfication zweimal aufgerufen würde, wenn die notification zweimal im interests-array drin wäre....

ich finde da ganze ziemlich praktisch, weil man so einfach wieder typsicher arbeiten kann, und sich auch irgendwelche "typen-checks" sparen kann...
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
springer#4
Benutzerbild von springer
Beiträge: 4909
Wohnort: zuhaus
Registriert: Apr 2004

Themenautor/in

20.11.2010, 16:31

ich habe jetzt das ganze etwas angepasst, bzw. erweitert. es sollte jetzt keine probleme mehr geben, wenn man einen "BaseMediator" als Basisklasse verwendet.

man kann jetzt handler hinzufügen, entfernenen oder überschreiben. zudem kann man die handler noch priorisieren:

ActionScript:
1
2
3
addNotificationHandler( notification:String, handler:Function, priority:int=-1 ):void
overrideNotificationHandler( notification:String, handler:Function, oldHandler:Function=null, priority:int=-1 ):void
removeNotificationHandler( notification:String, handler:Function=null ):void


override geht natürlich auch mit remove und add.... oder mit direktem überschreiben der methode aus der Basisklasse

Ein DemoProjekt gibts hier: Demo.fxp.zip (184.90 KB) ( pureMVC library erforderlich ;-) )

@sebastian:
bei der alten version hätte es probleme gegeben, wenn eine notification zweimal im listNotifications-Array enthalten gewesen wäre. es hätte alles zweimal ausgeführt....
lieber chips essen und danach voller zweifel sein, als voller zweifel chips essen...
Geändert von springer am 20.11.10 um 16:46 Uhr
Werbung
Beiträge: 0
Registriert: Feb 2016



AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2019 Sebastian Wichmann - Flashhilfe.de