Problème d'utilisation du type * dans les propriétés virtuelles dans Flash CS3 et CS4 en mode "avertissement"
Par eKameleon le vendredi, juillet 31 2009, 22:00 - AS3 - Flex - Air - Lien permanent
Flash CS3 et Flash CS4 proposent par défaut d'améliorer le débogage AS3 avec un "Mode avertissement". Même si à la base ce mode doit aider le flasheur dans son développement, j'avoue que personnellement je considère les "Warning" notifiés dans le panneau de sortie de Flash pas forcément très bien venus la plupart du temps.
On pourra noter d'ailleurs un bon petit feedback sur le sujet sur le site de ByteArray.org : Warnings mode, the dangerous friend
Je vais donc moi aussi vivement vous conseiller de désactiver dans vos paramètres de publication le "Mode avertissement" de votre document.
D'ailleurs il suffit de coder dans FDT quotidiennement et de compiler normalement avec le compiler FCSH et de revenir de temps en temps dans Flash pour se rendre compte que ce retour est parfois bien 'étonnant' 
Voyons un exemple simple de classe pour isoler un warning qui pour moi ne peut vraiment pas être considéré comme une erreur :
package { import flash.display.Sprite ; public class Main extends Sprite { public function Main() { _func = function():void { trace("hello world") ; } function1() ; function2() ; } public function get function1():Function { return _func ; } public function get function2():* { return _func ; } private var _func:Function ; } }
Il suffit d'ajouter la classe ci-dessus dans le panneau de propriété d'un nouveau document AS3 et de lancer la compilation.
Résultat nous obtenons dans le panneau de sortie les deux invocations de la fonction (en gros nous attendions ce résultat) mais très étrangement une notification de type "warning" dans le panneau "Erreurs de compilations" de Flash : "Warning: 3553: Valeur de fonction utilisée alors qu'une valeur de type * est attendue. Il semble que des parenthèses () sont absentes après cette référence à une fonction."
En gros dans la propriété virtuelle "function2" Flash considère qu'il n'est pas possible de renvoyer un objet de type Function dans une fonction qui doit renvoyer un objet de type * ??? Alors que le type * reste un type dynamique qui permet de faire sortir n'importe quel type d'objet ? Très étrange donc ce genre d'alerte ?
Il est vrai que le code ci-dessus n'est pas vraiment très "standard" mais imaginons que dans une classe nous ayons besoin de stocker en mémoire une fonction pour le réutiliser plus tard.. si si ! cela peut arriver ! Par exemple avec une adaptation de la classe Tween bien connue de tous et la nécessité d'utiliser une fonction de "easing" pour changer l'effet appliqué sur l'interpolation.
Imaginons donc un bout du code de cette classe Tween avec le script ci-dessous :
package { import flash.events.EventDispatcher ; public class Tween extends EventDispatcher { public function Tween() { // code } public function get easing():* { return _easing ; } public function set easing( easing:* ):void { if ( easing is Function ) { _easing = easing as Function ; } else if ( easing is Easing ) { _easing = (easing as Easing).ease ; } else { _easing = function(t:Number, b:Number, c:Number, d:Number):Number { return ( ( c * t ) / d ) + b ; // linear easing } } } private var _easing:Function ; // ... reste du code de la classe } }
Avec Easing une interface simple permettant d'implémenter des classes simples pour chaque type de transition : Bounce, Back, etc. Cette interface doit juste définir une méthode ease() personnalisable.
package { interface Easing { function ease ( t:Number , b:Number , c:Number , d:Number ):Number ; } }
Dans la classe Tween définie plus haut, j'ai envie de définir une propriété virtuelle r/w "easing" qui peut prendre des objets de type Easing mais aussi des objets de type Function simples... Je suis obligé de typer les 2 fonctions get et set de ma propriété virtuelle avec le type * (impossible de typer différemment les 2 fonctions).
Dans Flash le problème du "warning" indésirable apparait sur cette classe au niveau de la fonction "get" de la propriété virtuelle "easing". Il est clair que le code ci-dessus même si il est "discutable" n'est pas mauvais en soit et que dans tous les cas l'application malgré ce warning l'application fonctionne sans soucis.
A noter que pour éviter ce warning dans Flash sur une fonction qui retourne un objet de type *, il suffit de forcer le type de l'objet de retour de la fonction avec le type "Object" :
public function get easing():* { return _easing as Object ; }
Plus de message d'alerte après ce petit hack, mais cela reste tout de même à mon sens une solution tirée par les cheveux.
Je code très peu dans l'environnement auteur de Flash en privilégiant son utilisation uniquement pour la création des assets graphiques et des animations et je préfère largement ensuite charger mes swfs d'assets dynamiquement dans mon application principale codée dans FDT et ensuite il suffit de prendre la main sur les éléments graphiques via leurs simple noms d'occurrences.
Ce process de travaille laisse beaucoup plus de souplesse au graphiste, qui n'a plus d'excuse pour trouver l'ActionScript "compliqué" vu que le seul code qui lui ai demandé c'est un stop() de temps en temps sur une image clé, quelques étiquettes sur des images clés et surtout d'indiquer les noms d'occurrences sur les clips importants de l'application.
Bon finalement plus de "peur" que de mal .. mais franchement ils ont à mon sens simplifié à mort le code dans Flash CS3/4 en permettant au développeur débutant de coder sans se prendre trop la tête (pas besoin d'importer les classes natives, etc.) mais avec ce genre de "warning" sans queue ni tête.. pas facile pour un débutant de comprendre les rouages de l'ActionScript vous ne pensez pas ?
Commentaires
Hello,
Je suis d'accord avec toi.
Je n'ai pas encore eu de ce souci dans l'IDE d'adobe mais j'ai parlé justement cette semaine avec une graphiste et ma chef de projet d'éviter au maximum voire ne plus faire de code dans Flash à l'exception des stop et étiquettes nécessaires.
A mon avis cette méthode améliore fortement de workflow.
(pas besoin de catalyst du coup ...)
A++
NairuS
Bonjour,
Moi aussi je me suis mis à coder dans fdt et je dois dire que c'est un outil formidable.
J'ai commencé une première application. Dans un premier se charge un fichier de configuration xml, puis les assets graphiques...
Dans ma classe mère, j'ai un clip liée à une classe Site.
Pour pouvoir utiliser les différents éléments, je fais depuis la classe mère :
package {
import flash.display.*;
public class Application extends MovieClip {
private var _site:Object;
public function Application() {
init();
}
public function init():void {
createSite();
}
private function createSite():void {
_site=this.loaderInfo.applicationDomain.getDefinition("Site");
var _appli = new _site();
addChild(DisplayObject(_appli));
_appli["init"].apply();
}
}
}
Quand je compile dans flash, pas de problème mais dans fdt, j'ai variable Site non définie.
Je pense que cela vient du paramètrage du compilateur dans fdt mais je n'arrive pas à régler ce problème.
Merci pour ton aide. (cela manque des tuto sur fdt en français...)
Hello
Ne confonds pas "blog" et "forum"
Si tu as des questions à poser, n'hésite pas à le faire sur le FCNG par exemple :
http://groups.google.com/group/fcng
Imagine si tout le monde vient poser ses questions dans les commentaires de mes articles, comment peut on s'y retrouver ensuite au niveau du sujet de l'article pour différencier les commentaires à propos de l'article et ceux qui n'ont aucun rapport ??
Donc merci de participer sur mon blog sans hors sujet et tu as vraiment tout ce qu'il te faut pour poser tes questions sur le net... Surtout que ta question est super simple au niveau de la réponse... c'est tout à fait logique que FDT crée un "problème" sans en être un vraiment
eKA+
Avec toutes mes excuses. Pour être honnête j'ai hésité avant de poster. Je voulais juste faire appel à tes compétences car à priori tu as l'habitude d'utiliser FDT.
Encore une fois désolé, ce qui te paraît simple pour toi ne l'est pas pour les autres ; je n'ai toujours pas trouvé la solution au problème.
Tu peux effacer les messages pour rendre plus lisible le blog.
Salut
A noter que l'on peut configurer les warnings dans Flash, en enlever et en ajouter (par ex : type ou visibilité non déclaré), à partir du fichier
Program Files/Adobe/Adobe Flash CS4/fr/Configuration/ActionScript 3.0/EnabledWarnings.xml (ou celui dans les docs n' settings, je me rappelle jamais).
Bon, c'est un peu ridicule comparé à FDT, mais c'est déjà mieux que rien pour ceux qui utilisent FlashDevelop/Flash.
En formation, je conseillais aux stagiaires de désactiver certains warnings et d'en activer d'autres, genre type non déclaré pour les forcer à tout typer... (gniark, gniark, gniark... :D ).
++
Le plus ridicule avec les warning dans Flash CS4 c'est qu'ils sont pleins de bugs et parfois coupent la compilation alors que le code est bon (style avec une classe qui implémente une interface) alors que dans FlashCS3 cela passe... personnellement j'ai abandonné la compilation dans Flash surtout depuis la CS4 et je n'utilise plus que le fcsh dans FDT
Les compilations dans flash sont justes bonnes pour les assets graphiques et les animations (là par contre c'est toujours une bonne chose de l'utiliser) mais sans une trace de code (ou alors un stop() ... et encore !!)
EKA+
Salut ekameleon , je suis tout a fait d'accord avec toi pour l'histoir de warning sur flash , mais le warning reste un warning et non plus une erreur de compilation ,parfois c'est vrai on se retrouve avec de warning un peu bêtes , mais autres non , comme la duplication de variable , et meme ton exemple pour le retour de type Function , que je trouve pas trop choquant , meme si le message un peu bizarre , mais pour moi Function c'est un type trop particulier tout comme Class , ça mérite un petit message d'alerte pour son utilisation surtout que une tel utilisation dans ton exemple ne vient que d'un développeur confirmé donc ca va pas lui trop impacter s'il sait bien ce qu'il fait . sinon il doit prendre au sérieux l'alerte , parce que c'est rare qu'un débutant utilise un retour type Function ,
j'ai essayé un peu d'exposer mon avis j'espère que ca été bien transmis ?