<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blog.lalex.com/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>LAlex devblog v6 - Articles</title>
  <link>http://blog.lalex.com/</link>
  <atom:link href="http://blog.lalex.com/feed/category/Articles/rss2" rel="self" type="application/rss+xml"/>
  <description></description>
  <language>fr</language>
  <pubDate>Fri, 13 Jan 2012 03:40:07 +0100</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Livraison d'une application Flash</title>
    <link>http://blog.lalex.com/post/2011/03/07/Livraison-d-une-application-Flash</link>
    <guid isPermaLink="false">urn:md5:e24574e0c64e66669739960c0df914ec</guid>
    <pubDate>Mon, 07 Mar 2011 23:00:00 +0100</pubDate>
    <dc:creator>-Alexandre LEGOUT aka LAlex-</dc:creator>
        <category>Articles</category>
            
    <description>&lt;p&gt;Une fois n'est pas coutume, ce blog reprend un petit poil de la bête pour un
article même pas fait (que) pour les techos... mais plutôt pour les chefs de
projets.&lt;/p&gt;
&lt;p&gt;Lorsqu'un développeur code une application ou un site, il est victime
systématiquement de l'effet &amp;quot;anguille&amp;quot;. Cette pure invention de ma part
signifie juste qu'il va tester généralement les cas qu'il a lui-même prévu lors
de son développement et se faufiler naturellement entre les bugs qui pourraient
intervenir lors d'une utilisation &amp;quot;normale&amp;quot; par un utilisateur &amp;quot;classique&amp;quot;.
C'est là qu'intervient la recette, généralement effectuée par le chef de
projet, ou par un autre développeur, ou dans les structures les plus
importantes par le service qualité. La recette est ensuite effectuée par le
client final pour une dernière vérification.&lt;br /&gt;
La recette effectuée &amp;quot;en interne&amp;quot; est donc très importante, d'abord parce que
moins il y a de bugs à la livraison finale plus on est crédible, ensuite parce
que le client final n'a pas à sa disposition la même compétence, ni les même
outils pour assurer une recette efficace.&lt;/p&gt;
&lt;p&gt;Vous trouverez donc dans cet article un ensemble de conseils et d'outils
pour une livraison en douceur d'un projet Flash.&lt;br /&gt;
Je précise que je travaille sur MacOSX, mais les pratiques citées ci-dessous
sont tout aussi valables dans le monde PC.&lt;/p&gt;    &lt;h3&gt;I. &lt;ins&gt;Le serveur de livraison&lt;/ins&gt;&lt;/h3&gt;
&lt;p&gt;Afin de s'assurer d'avoir le moins de surprises possible lors du déploiement
en production, il est important pour le client livré de fournir un
environnement de livraison ayant les mêmes caractéristiques que l'endroit ou
sera déployé l'application finale. Il s'agit du serveur de pré-production, dit
&amp;quot;préprod&amp;quot;.&lt;br /&gt;
La livraison s'effectue le plus souvent par FTP sur un serveur qui
idéalement:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tourner sur le même OS que la prod, donc pas de Linux pour une prod Windows
et vice-versa&lt;/li&gt;
&lt;li&gt;fournir les mêmes autorisations sur les dossiers/fichiers (les scripts de
manipulation de fichiers doivent pouvoir accéder aux mêmes choses qu'en
prod)&lt;/li&gt;
&lt;li&gt;faire tourner les mêmes versions mineures des logiciels utilisés (PHP,
MySQL, Apache ou IIS, AMFPHP, etc...)&lt;/li&gt;
&lt;li&gt;donner les mêmes possibilités d'administration des URLs (redirections,
.htaccess, erreurs 404, etc...)&lt;/li&gt;
&lt;li&gt;donner l'accès aux même conditions d'URL (ne pas tester dans un
sous-répertoire d'un nom de domaine un site qui tournera à la racine d'un
domaine). Par exemple, tester un projet qui tournera sur
&lt;ins&gt;http://www.monprojet.com&lt;/ins&gt; sur une préprod qui serait
&lt;ins&gt;http://preprod.monclient.com/monprojet&lt;/ins&gt; peut donner des surprises au
déploiement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;!NOTE AUX DÉVELOPPEURS!&lt;/strong&gt; Comme ce dernier point n'est pas
toujours possible, il est important dans ses développements de privilégier les
chemins d'accès relatifs (../xml/config.xml) aux chemins d'accès absolus
(/xml/config.xml). De la même manière, je conseille de toujours partir sur la
base d'un seul fichier de configuration, commun à tous les codes de
l'application (PHP, Flash, JS, sur front-office comme sur back-office), qui
sera le seul nécessitant une modification lors du déploiement sur
l'environnement de production. Ca simplifiera la vie à tout le monde! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;II. &lt;ins&gt;Configurer son ordi pour une recette&lt;/ins&gt;&lt;/h3&gt;
&lt;h4&gt;1. &lt;ins&gt;Un ordinateur stable&lt;/ins&gt;&lt;/h4&gt;
&lt;p&gt;Ca peut paraître bête à dire, mais si on utilise un ordinateur qui plante
tout le temps (je serais mesquin, je dirais &amp;quot;un PC par exemple&amp;quot; :-P), on ne
saura jamais si c'est l'application ou l'environnement qui plante. Avoir un
système propre et stable est donc la première étape d'une recette.&lt;/p&gt;
&lt;h4&gt;2. &lt;ins&gt;Un navigateur configuré pour &amp;quot;recetter&amp;quot;&lt;/ins&gt;&lt;/h4&gt;
&lt;p&gt;Personnellement, j'utilise Chrome au quotidien, selon moi plus adapté au
surf de tous les jours car rapide et léger. Je n'ai pas besoin d'une quelconque
extension tant mes besoin ne sont vraiment pas exceptionnels en matière de
surf. De plus, la mise à jour est transparente, autant pour le browser lui-même
que pour le player Flash, et je suis donc sûr d'être sur la dernière version
disponible en permanence. De plus, le Flash player est interne à Chrome, ce qui
me permet d'installer une version différente pour mes autres navigateurs.&lt;/p&gt;
&lt;p&gt;Pour le travail, notamment sur Flash, j'utilise par contre Firefox, pour ses
nombreuses extensions dédiées au développement, que nous verrons plus loin. Il
peut-être bien pratique d'installer un navigateur uniquement pour le débugage:
si vous utilisez Firefox en tant que navigateur principal, je crois qu'il est
possible d'en installer plusieurs instances.&lt;br /&gt;
Un navigateur destiné à la recette doit être configuré pour ne pas utiliser de
cache: on n'imagine même pas le nombre d'heures passées en discussions stériles
entre développeurs et testeurs uniquement parce que ce n'était pas la même
version qui était testée... Les navigateurs sont parfois capricieux à vider
leur cache, qui se répand dans les méandres du disque dur. Alors pour vous
épargner ce temps en étant sûr de ne pas avoir affaire au cache, vous pouvez
utiliser un plug-in qui va le désactiver. Pour ma part, il s'agit de la
&lt;a href=&quot;http://chrispederick.com/work/web-developer/&quot;&gt;Web Developer
Toolbar&lt;/a&gt; de Firefox.&lt;/p&gt;
&lt;h4&gt;3. &lt;ins&gt;Le player DEBUG&lt;/ins&gt;&lt;/h4&gt;
&lt;p&gt;Une erreur Flash ne remonte pas lorsque le player classique est utilisé. Il
est donc important d'avoir installé le player DEBUG afin de les retourner au
développeur lorsque l'on rapporte un bug. Etant donné que ces même erreurs
interrompent complètement l'exécution du code, il donnera au développeur une
précieuse information, bien plus utile que &lt;em&gt;&amp;quot;ca ne fait plus rien&amp;quot;&lt;/em&gt;...
Les versions debug des players sont disponibles à l'addresse: &lt;a href=&quot;http://www.adobe.com/support/flashplayer/downloads.html&quot; title=&quot;http://www.adobe.com/support/flashplayer/downloads.html&quot;&gt;http://www.adobe.com/support/flashp...&lt;/a&gt;&lt;br /&gt;

Si vous utilisez le même navigateur pour la recette et votre usage quotidien,
s'il s'agit de Firefox, vous pouvez installer la bien pratique extensions
&lt;a href=&quot;http://blog.sephiroth.it/2008/04/23/flash-switcher-for-windows-osx-and-linux/&quot;&gt;
Flash Switcher&lt;/a&gt;. Vous pouvez ainsi utiliser une version debug pour une
recette, et une version &amp;quot;normale&amp;quot; pour le reste...&lt;/p&gt;
&lt;h4&gt;4. &lt;ins&gt;Un proxy&lt;/ins&gt;&lt;/h4&gt;
&lt;p&gt;Pour les applications communiquant avec un serveur, il peut être bien utile
pour le développeur de savoir si un message réseau est parti, s'il est revenu,
et quel est le contenu de ce retour. Fournir cette information lors de la
déclaration du bug est un gain de temps évident pour sa résolution.&lt;br /&gt;
Pour ma part, j'utilise &lt;a href=&quot;http://www.charlesproxy.com/&quot;&gt;Charles&lt;/a&gt;: pas
cher, entièrement en Java donc dispo pour toutes plateformes, il installe
également un plug-in Firefox qui active/désactive le proxy facilement... Il
existe aussi des extensions Firefox qui font cela, ainsi que d'autres logiciels
standalone.&lt;br /&gt;
Un proxy permet également de voir si des ressources (images, fichiers XML ou
autres...) on été demandées par le Flash, mais pas trouvées sur le serveur
(erreurs 404 ou 500).&lt;/p&gt;
&lt;h4&gt;5. &lt;ins&gt;Une console de traces&lt;/ins&gt;&lt;/h4&gt;
&lt;p&gt;Les développeurs insèrent souvent des messages de trace, ne serait-ce que
pour vérifier que le code passe bien par là où il doit passer. Afin de lire ces
messages, en plus du player DEBUG, il faut vous munir d'une console où les
afficher. Elles ne manquent pas, que ce soit sous forme d'extension pour
navigateur ou en standalone. Pour ma part, j'utilise &lt;a href=&quot;http://www.sos.powerflasher.com/&quot;&gt;SOS&lt;/a&gt;, développé par les excellents
PowerFlasher (je suis un fan absolu de FDT).&lt;br /&gt;
Le testeur ne sais pas toujours à quoi correspondent les différentes traces,
mais cela permet à un développeur de demander si tel ou tel message s'est
affiché dans la console, cela permettant de clarifier et accélérer les échanges
qui mèneront à la résolution du bug. Evidemment un message du type &amp;quot;EH MERDE,
CA MARCHE PAS&amp;quot; qui apparait dans la console peut être pertinent à remonter au
développeur!&lt;/p&gt;
&lt;h3&gt;III. &lt;ins&gt;Echanger avec le développeur&lt;/ins&gt;&lt;/h3&gt;
&lt;h4&gt;1. &lt;ins&gt;Avoir un outil de suivi de bugs&lt;/ins&gt;&lt;/h4&gt;
&lt;p&gt;Il peut prendre plusieurs formes. La plus fréquente est un BugTracker. En ce
qui me concerne, lorsque mes clients n'en ont pas, je leur propose &lt;a href=&quot;http://www.mantisbt.org/&quot;&gt;Mantis&lt;/a&gt;. En PHP, simple d'accès et de
configuration, il est pour moi un des meilleurs compromis
efficacité/simplicité. De grosses structures utilisent souvent &lt;a href=&quot;http://www.atlassian.com/software/jira/&quot;&gt;JIRA&lt;/a&gt;, pour ma part, je le trouve
un peu nébuleux, mais il s'avère efficace lorsqu'il est bien configuré, et que
le projet l'est également. J'ai également entendu dire beaucoup de bien d'un
tracker en mode hébergé, nommé &lt;a href=&quot;http://www.sifterapp.com/&quot;&gt;SifterApp&lt;/a&gt;.&lt;br /&gt;
Un BugTracker permet non seulement de remonter un bug au développeur, mais
également de suivre toute son évolution: qui l'a reporté, les compléments
d'information nécessaires, les captures d'écran, la résolution (ou non) de
celui-ci, etc...&lt;br /&gt;
Lorsqu'aucun BugTracker n'est disponible, les remontées de bugs se font trop
souvent sur un document Excel ou PowerPoint. Autant le dire tout de suite:
&lt;strong&gt;C'EST LA PIRE RECETTE POSSIBLE&lt;/strong&gt;!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sur Excel, aucune capture d'écran n'est possible, et à moins d'écrire une
tartine difficilement lisible dans une case, il est compliqué de donner des
infos détaillées sur le bug&lt;/li&gt;
&lt;li&gt;sur PowerPoint, le bug est souvent une grosse capture d'écran, avec une
flèche pointant vers le bug quand on a de la chance, suivie d'une phrase trop
courte par manque de place&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dans les deux cas, il est surtout impossible ou extrêmement laborieux
d'échanger avec le développeur. Cela se fait souvent par mail ou IM, avec pour
référence &amp;quot;Le document du 17 Février, page 14&amp;quot;, sachant que 2 documents
similaires ont pu être échangés depuis, avec ou sans répétition des
précédents.&lt;br /&gt;
Si ce support devait absolument être utilisé, certaines règles sont
essentielles à respecter afin de limiter les dégats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;donner un numéro unique à chaque bug, et organiser le document de reporting
par ordre de numéro de bug (facilite la recherche dans le document)&lt;/li&gt;
&lt;li&gt;pour chaque document échangé, le dernier en date fait foi. Cela veut dire
qu'il doit contenir tous les bugs restant à résoudre, ou qui nécessitent
l'attention du dev.&lt;/li&gt;
&lt;li&gt;chaque bug doit faire l'objet d'une description détaillée (voir
ci-dessous), avec copie d'écran annotée si nécessaire.&lt;/li&gt;
&lt;li&gt;mettre la date du document dans le nom du fichier, au format
&amp;lt;année&amp;gt;_&amp;lt;mois&amp;gt;_&amp;lt;jour&amp;gt;: cela permet un classement alphabétique
cohérent quand on affiche une liste de fichiers sur son ordi.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En l'absence de tracker, une option a été trouvée avec un de mes clients et
elle s'avère limiter les dégats sous la forme d'une feuille de calcul sur
&lt;a href=&quot;http://docs.google.com/&quot;&gt;GoogleDocs&lt;/a&gt; (ou tout autre outil de
collaboration en ligne). Sans atteindre le confort, la puissance et donc
l'efficacité d'un tracker, cela permet malgré tout une réactivité améliorée par
rapport à un échange de mails, si le document est bien organisé et comporte
toutes les infos nécessaire (voir ci-dessous).&lt;/p&gt;
&lt;h4&gt;2. &lt;ins&gt;Déclarer un bug&lt;/ins&gt;&lt;/h4&gt;
&lt;p&gt;Il s'agit là de la partie la plus anodine, et en même temps la plus
importante d'une recette. Afin d'optimiser la durée et le nombre d'échanges, un
bug doit être déclaré de la manière la plus complète. Souvent, un BugTracker
demande un certain nombres des informations utiles dans des zones de saisie
dédiées, facilitant ainsi la clarté du bug. Dans tous les cas, il est
nécessaire d'avoir pour chaque bug:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un &lt;ins&gt;numéro&lt;/ins&gt;, trés important pour les échanges, il identifie de
manière commune le bug, pour le testeur comme pour le dev. Il permet d'éviter
les noms du genre &amp;quot;Le bug du bouton rouge qui cliquait pas comme il faut&amp;quot;&lt;/li&gt;
&lt;li&gt;un &lt;ins&gt;titre&lt;/ins&gt; clair et concis. Voire ci-dessus un exemple de nom à
éviter! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/li&gt;
&lt;li&gt;une &lt;ins&gt;catégorie&lt;/ins&gt;. Souvent, elle est liée à l'endroit ou à l'écran
sur lequel se situe le bug. Quand ce champ n'est pas prévu, il peut apparaître
sous forme de &amp;quot;tag&amp;quot; avant le nom du bug, par exemple: (Editeur de niveau)
Bouton SAVE inopérant.&lt;/li&gt;
&lt;li&gt;une &lt;ins&gt;description &lt;strong&gt;détaillée&lt;/strong&gt;&lt;/ins&gt;. Elle doit contenir
les effets du bug: un bouton qui ne fait rien, un graphique qui ne s'affiche
pas ou part en sucette, une couleur qui n'est pas la bonne, bref la différence
entre le comportement attendu et le comportement effectif.&lt;/li&gt;
&lt;li&gt;une &lt;ins&gt;priorité&lt;/ins&gt;. Pour un développeur, un bug est un bug. Selon la
méthode de travail qu'il utilise ou le mode de raisonnement qu'il suit, ses
priorités peuvent être différentes des vôtres. Si vous avez besoin que certains
soient résolus avant d'autres, faites le savoir.&lt;/li&gt;
&lt;li&gt;une &lt;ins&gt;sévérité&lt;/ins&gt;. Ca peut être &amp;quot;Bloquant&amp;quot;, &amp;quot;Majeur&amp;quot;, &amp;quot;Mineur&amp;quot;,
&amp;quot;Anecdotique&amp;quot;, &amp;quot;Amélioration&amp;quot;, etc...&lt;/li&gt;
&lt;li&gt;un &lt;ins&gt;scénario&lt;/ins&gt;. Une des parties les plus importantes. Le
développeur doit savoir comment reproduire le bug avant de pouvoir le résoudre.
Le testeur doit donc bien reconstituer l'ensemble des manipulations effectuées
pour arriver à ce bug, quitte à reprendre le parcours depuis le lancement de
l'application. A noter cette phrase tellement vraie: &amp;quot;Quand un chef de projet
reproduit un bug, il est déçu car cela veut dire qu'il reste un bug. Quand un
développeur reproduit un bug, il est content car cela veut dire qu'il va
pouvoir le résoudre&amp;quot;.&lt;/li&gt;
&lt;li&gt;une &lt;ins&gt;reproductibilité&lt;/ins&gt;. C'est la facilité que l'on a à reproduire
le bug. Un testeur ne doit pas remonter un bug tant qu'il ne s'est pas battu
bec et ongles pour le reproduire. La reproductibilité sera de type &amp;quot;Toujours&amp;quot;,
&amp;quot;Fréquent&amp;quot; ou &amp;quot;Non reproduit&amp;quot;... Les bugs relevant de cette dernière
possibilité étant bien évidemment les plus difficiles et donc les plus longs à
résoudre. Souvent d'ailleurs, si on arrive pas à le reproduire au bout d'un
certain nombre d'essais, on le considère comme inexistant par la force des
choses.&lt;/li&gt;
&lt;li&gt;une &lt;ins&gt;cause probable&lt;/ins&gt;. C'est là qu'interviennent les outils cités
plus haut qui permettent au testeur de faciliter et donc d'accélérer le travail
du codeur. Il peut s'agir d'un message réseau qui n'a pas eu de réponse, ou
dont la réponse contient une erreur (message d'erreur PHP par exemple), d'une
ressource non trouvée (image, fichier XML, etc...), d'un message d'erreur
remonté par Flash (player DEBUG), ou simplement remonté par le codeur dans ses
traces (console de trace).&lt;/li&gt;
&lt;li&gt;un &lt;ins&gt;statut&lt;/ins&gt; (voire ci-dessous).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3. &lt;ins&gt;Suivi d'un bug&lt;/ins&gt;&lt;/h4&gt;
&lt;p&gt;Afin que tout le monde parle le même langage durant la recette, pouvoir
suivre les bugs est important, ne serait-ce que pour éviter des échanges
informatifs superflus. Le suivi donnera non-seulement un état des lieux de la
recette, mais évitera aussi, par exemple, de redéclarer un bug que l'on pensait
résolu, alors que le développeur n'a même pas commencé à le regarder, ou qu'il
l'a résolu et pas livré... Ce suivi se fait généralement par deux moyens:&lt;/p&gt;
&lt;h5&gt;a. &lt;ins&gt;Un statut pour le bug&lt;/ins&gt;&lt;/h5&gt;
&lt;p&gt;Il permet de savoir quel est l'état de traitement de celui-ci. Les états
courants, dans l'ordre classique, sont les suivant:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;ins&gt;déclaré&lt;/ins&gt;. Le bug vient d'être déclaré par le testeur.&lt;/li&gt;
&lt;li&gt;&lt;ins&gt;accepté / refusé / incomplet&lt;/ins&gt;. Le développeur a lu le bug. Il le
prend en charge, le refuse en expliquant la raison (ça peut aller de &amp;quot;Mauvaise
interprétation du CDC&amp;quot; - les testeurs ne sont pas toujours les
demandeurs/concepteurs - jusqu'à &amp;quot;Hors de périmètre de la mission&amp;quot; - dans le
cadre d'une amélioration par exemple - ou une impossibilité de reproduire, ou
qu'il s'agit d'un doublon avec le bug N°__), ou bien il demande plus
d'informations pour pouvoir ensuite accepter / refuser le bug.&lt;/li&gt;
&lt;li&gt;&lt;ins&gt;en cours&lt;/ins&gt;. Dans certain process, le développeur notifie le
testeur quand il commence à travailler sur le bug. Très honnêtement, il est
rare qu'un dev utilise ce statut, ne serait-ce que parce qu'il oublie de le
faire... &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;ins&gt;résolu&lt;/ins&gt;. Le développeur notifie le testeur qu'il a résolu le bug,
mais que ce fix n'est pas encore deployé sur la plateforme de test.&lt;/li&gt;
&lt;li&gt;&lt;ins&gt;deployé&lt;/ins&gt;. La résolution du bug est disponible sur l'environnement
de test.&lt;/li&gt;
&lt;li&gt;&lt;ins&gt;retourné&lt;/ins&gt;. Le bug a été testé, mais pas considéré comme résolu.
Le testeur retourne alors ce bug au développeur, avec les informations
détaillées qui lui font dire qu'il n'est pas encore fixé.&lt;/li&gt;
&lt;li&gt;&lt;ins&gt;fermé&lt;/ins&gt;. La résolution du bug est validée par le testeur.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L'état d'un bug peut-être notifié par un code couleur, facilitant ainsi la
vue d'ensemble d'une recette par ses différents intervenants. Cela est encore
plus utile dans le cadre d'un document de reporting qui n'est pas un
tracker.&lt;br /&gt;
Le processus de travail est principalement centré sur ce statut, car il permet
à chaque partie de savoir où il doit intervenir pour faire avancer la situation
du bug: les testeurs doivent intervenir sur les statuts &amp;quot;incomplet&amp;quot; (pour le
complèter) et &amp;quot;deployé&amp;quot; (pour le tester), les devs sur &amp;quot;déclaré&amp;quot; (pour
l'accepter), &amp;quot;accepté&amp;quot; (pour le traiter), &amp;quot;résolu&amp;quot; (pour le déployer) et
&amp;quot;retourné&amp;quot; (pour l'accepter).&lt;/p&gt;
&lt;h5&gt;b. &lt;ins&gt;Des commentaires&lt;/ins&gt;&lt;/h5&gt;
&lt;p&gt;Cela constitue la colonne vertébrale du bug et représente la partie
&amp;quot;échanges&amp;quot; du bug. Dans le cadre d'un BugTracker, les commentaires de chaque
intervenant permettent de retracer la vie du bug, et donc de savoir ce qui a
mené à son état actuel. En dehors d'un tracker, il s'agit le plus souvent de
mails, et ce qui pose problème alors et qu'on aborde souvent plusieurs bugs
dans un même mail. Si les échanges par mails étaient le seul moyen, essayez de
ne faire qu'un mail par bug, et de spécifier dans le titre de celui-ci le
numéro du bug (par exemple (BUG #__) Demande d'infos), permettant ainsi le
regroupement de plusieurs mail parlant du même bug, pour ainsi reconstituer
cette colonne vertébrale.&lt;/p&gt;
&lt;h3&gt;IV. &lt;ins&gt;Conclusion&lt;/ins&gt;&lt;/h3&gt;
&lt;p&gt;Donner la touche finale à un projet n'est pas évident.&lt;br /&gt;
La livraison peut se révéler parfois un véritable parcours du combattant avant
un déploiement en production, et les conseils ci-dessus peuvent aider à la
rendre bien plus douce, et surtout rendre l'échange testeur/développeur bien
plus qualitatif, ce qui permet de préserver les nerfs, le temps et donc
l'argent de tout le monde, pensez-y! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.lalex.com/post/2011/03/07/Livraison-d-une-application-Flash#comment-form</comments>
      <wfw:comment>http://blog.lalex.com/post/2011/03/07/Livraison-d-une-application-Flash#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.lalex.com/feed/atom/comments/973</wfw:commentRss>
      </item>
    
  <item>
    <title>Interfaces et classes virtuelles</title>
    <link>http://blog.lalex.com/post/2004/06/01/Interfaces-et-classes-virtuelles</link>
    <guid isPermaLink="false">urn:md5:2450f21108e76399cbef7597c82c1751</guid>
    <pubDate>Tue, 01 Jun 2004 17:55:19 +0000</pubDate>
    <dc:creator>-Alexandre LEGOUT aka LAlex-</dc:creator>
        <category>Articles</category>
            
    <description>    &lt;p&gt;Plongé actuellement dans le passionant ouvrage qu'est &lt;a href=&quot;http://www.amazon.fr/exec/obidos/ASIN/2711786447/qid=1086105898/sr=1-2/ref=sr_1_0_2/402-0048738-7888977&quot;&gt;Design patterns. Catalogue des modèles de conception réutilisables&lt;/a&gt; (merci Francis pour le conseil ;)), je constate que la base de chaque pattern consiste en un ensemble de classes abstraites ou d'interfaces, alors que peu de programmeurs non-habitués les utilisent réellement à leur plein potentiel. C'est pourquoi j'essaie modestement dans cet article de démontrer la réelle puissance apportée par ces outils. &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;quote&gt;Beaucoup de programmeurs non habitués à la POO ne se servent que trés peu des interfaces, ou des classes virtuelles (quand elles sont disponibles dans le langage utilisé). Cet article se propose de cerner l'utilité de tels outils dans la programmation orientée objet.&lt;/p&gt;
&lt;p&gt;Les codes exemples sont partagés entre du PHP5 et de l'Actionscript. En effet, alors que le premier offre la possibilité de faire des classes abstraites, l'autre est à mon sens plus lisible et permet un typage fort des types simples ! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color:#00118C&quot;&gt;&lt;span style=&quot;font-size:14px&quot;&gt;&lt;strong&gt;Définitions&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;text-decoration:underline&quot;&gt;Signature d'un fonction/méthode&lt;/span&gt; : Il s'agit de la &quot;structure&quot; d'une méthode. En gros, cela correspond aux arguments qu'elle prend en entrée, ainsi que leurs types, et le type de la valeur retournée.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;text-decoration:underline&quot;&gt;Méthode abstraite (ou virtuelle)&lt;/span&gt; : Il s'agit d'une méthode qui ne contient pas d'implémentation. Une telle méthode oblige les classes qui vont hériter de la classe la contenant à implémenter une méthode dont la signature sera exactement la même.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;text-decoration:underline&quot;&gt;Classe abstraite&lt;/span&gt; : Il s'agit d'une classe possédant au moins une méthode abstraite. Une classe abstraite n'est pas instanciable, du fait que l'ensemble de ses fonctionnalités n'est pas implémenté. Une classe abstraite permet de définir certaines implémentations par défaut, et à fournir la signature des méthodes non implémentées.&lt;br /&gt;
Pour l'Actionscript 2, Francis Bourre propose un pattern destiné à émuler les classes abstraites : &lt;a href=&quot;http://www.tweenpix.net/archives/000316.html&quot;&gt;http://www.tweenpix.net/archives/000316.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;text-decoration:underline&quot;&gt;Interface&lt;/span&gt; : L'interface est un ensemble de méthodes qui devront être implémentées dans les classes qui utilisent cette interface. Elle ressemble trés fortement à une classe abstraite qui ne contiendrait que des méthodes abstraites, et ne contient donc que des signatures de méthodes.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color:#00118C&quot;&gt;&lt;span style=&quot;font-size:14px&quot;&gt;&lt;strong&gt;Différence entre classe abstraite et interface&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Tout d'abord, la classe abstraite est utilisée par le biais de l'héritage. Il s'agit donc d'une relation de type &quot;est un&quot;. Les classes qui hériteront d'une classe abstraite auront donc toutes un lien étroit concernant leur type. De plus, la plupart des langages n'autorisant plus l'héritage multiple, une classe ne peut souvent hériter que d'une seule classe, abstraite ou non. Il s'agit donc pour une classe abstraite de définir un &quot;super type&quot;, dont d'autres types concrets pourront dériver.&lt;/p&gt;
&lt;p&gt;Par exemple, on peut considérer que tous les véhicules à moteur se remplissent de la même manière : il suffit de mettre du carburant dans le réservoir. Tous les véhicules à moteur peuvent également être démarrés, mais chacun est démarré d'une manière qui lui est spécifique. Ainsi, il serait possible de créer une classe abstraite qui implémente le remplissage du réservoir, mais qui oblige chacune de ses sous-classes à implémenter la méthode de démarrage.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;php&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe abstraite de véhicule a moteur&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Le replissage du reservoir possède une implémentation&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Par défaut&lt;/span&gt;&lt;br /&gt;
abstract &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; Vehicle &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;private &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$_maxFuel&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;private &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$_currentFuel&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Méthode concrète&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;protected &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; fill&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$quantite&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Code pour remplir le réservoir&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Methode abstraite&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Les sous-classes devront l'implémenter&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;abstract public &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; start&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Voiture&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Heritant de VahiculeAMoteur, on est obligé d'implémenter démarrer&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Si on ne le fait pas, une erreur va survenir&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; Car extends Vehicle &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Surcharge de la méthode abstraite&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;public &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; start&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Code pour démarrer la voiture&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;
L'interface elle, spécifie quelles vont être les possibilités d'une classe, sans en fournir la moindre implémentation. Elle est donc garante des méthodes d'accés à un objet dont la classe implémente cette interface. On peut dire que l'implémentation d'une interface est une relation de type &quot;possède les fonctionnalités de&quot;. D'ailleurs, les interfaces ont souvent des noms synonymes de &quot;capable de&quot; (en plus du 'I' qui commence généralement leur nom) : IDragable, IViewable, etc...
Par exemple, si l'on veut qu'un objet puisse être affiché, il est possible de créer une interface qui obligera la classe dont est issu l'objet d'implémenter une méthode display() ... Pour un objet qui doit pouvoir être déplacé par drag&amp;drop, une interface pourra définir quelles sont les méthodes qui serviront à la manipuler pour cette tâche précise.
&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Interface définissant le comportement d'un objet&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// que l'on peut déplacer à la souris&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Toute classe implémentant cette interface devra&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// implémenter deux méthodes startDrag et stopDrag&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;interface&lt;/span&gt; IDragable &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;startDrag&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;:&lt;span style=&quot;color: #0066CC;&quot;&gt;Void&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;stopDrag&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;:&lt;span style=&quot;color: #0066CC;&quot;&gt;Void&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Un curseur sur une jauge doit pouvoir&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// être déplacé à la souris&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; Cursor &lt;span style=&quot;color: #0066CC;&quot;&gt;implements&lt;/span&gt; IDragable &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;startDrag&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Code de début de déplacement&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;stopDrag&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Code de fin de déplacement&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;
&lt;span style=&quot;color:#00118C&quot;&gt;&lt;span style=&quot;font-size:14px&quot;&gt;&lt;strong&gt;Utilisation&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;
Les interfaces et classe abstraites n'ont un véritable sens que si elles sont associées à un langage typé fortement, ou du moins qui permet d'imposer un type d'objet dans les signatures de méthodes (comme le &quot;type hint&quot; de PHP5). En effet, plus qu'un &quot;carcan&quot; imposé au développeur de classes, elles sont surtout utiles aux classes clientes, qui vont avoir besoin d'être assurée d'un certain comportement des objets qu'elles vont utiliser.
En fait, pour pousser les choses plus loin, je dirait presque que pour une souplesse d'utilisation optimale, il ne faudrait utiliser que les interfaces et classes abstraites avec le typage fort. Il arrive souvent qu'un client ait besoin d'une implémentation précise, mais de toutes façons, le typage fort n'empêche pas une instance de sous-classe d'être utilisée, parfois avec une implémentation totalement différente.
Ainsi, quand une méthode va afficher un objet, elle n'a pas forcément besoin de savoir de quel type est cet objet, mais uniquement de savoir si l'objet est &quot;affichable&quot; ! Donc, si le fait d'être affichable revient à implémenter une interface qui demande à ce qu'une méthode display() soit présente, on utilisera cette interface pour le typage fort. Et l'objet passé à la méthode peut être de n'importe quel type, on est alors sûr qu'il disposera d'une méthode display(), dont la signature est définie par l'interface.
Prenons comme exemple une carte géographique. Cette carte est affichée en grand dans une fenêtre, et un ascenseur doit la déplacer. Pour cela, le déplacement de l'ascenseur recevra en paramètre l'objet qui représente la carte. Mais pour pouvoir la déplacer, il faut être certain que cette carte possède les méthodes qui vont nous permettre de la positionner. Il faut alors créer une interface imposant des méthodes d'accés. Ainsi, toute instance d'un classe qui implémente cette interface pourra être déplacée par l'ascenceur :
&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Interface de déplacement&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;interface&lt;/span&gt; IMovable &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Positionnement de l'objet&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; moveToCoord&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;x:&lt;span style=&quot;color: #0066CC;&quot;&gt;Number&lt;/span&gt;, y:&lt;span style=&quot;color: #0066CC;&quot;&gt;Number&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Déplacement de l'objet&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; moveByOffset&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;dx:&lt;span style=&quot;color: #0066CC;&quot;&gt;Number&lt;/span&gt;, dy:&lt;span style=&quot;color: #0066CC;&quot;&gt;Number&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe d'une carte géographique&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; Map &lt;span style=&quot;color: #0066CC;&quot;&gt;implements&lt;/span&gt; IMovable &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Clip correspondant à l'affichage de la carte&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; _targetMC:&lt;span style=&quot;color: #0066CC;&quot;&gt;MovieClip&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Methode de positionnement&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; moveToCoord&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;x:&lt;span style=&quot;color: #0066CC;&quot;&gt;Number&lt;/span&gt;, y:&lt;span style=&quot;color: #0066CC;&quot;&gt;Number&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;._targetMC.&lt;span style=&quot;color: #0066CC;&quot;&gt;_x&lt;/span&gt; = x;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;._targetMC.&lt;span style=&quot;color: #0066CC;&quot;&gt;_y&lt;/span&gt; = y;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Methode de déplacement&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; moveByOffset&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;dx:&lt;span style=&quot;color: #0066CC;&quot;&gt;Number&lt;/span&gt;, dy:&lt;span style=&quot;color: #0066CC;&quot;&gt;Number&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;._targetMC.&lt;span style=&quot;color: #0066CC;&quot;&gt;_x&lt;/span&gt; += dx;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;._targetMC.&lt;span style=&quot;color: #0066CC;&quot;&gt;_y&lt;/span&gt; += dy;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Scroller&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; Scroller &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; moveObject&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;obj:IMovable&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; obj.&lt;span style=&quot;color: #006600;&quot;&gt;moveByOffset&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;10&lt;/span&gt;,&lt;span style=&quot;color: #cc66cc;&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ainsi, la classe Scroller devient appliquable à n'importe quel objet qui possède les méthodes nécessaires à son déplacement. Il peut tout aussi biuen s'agir d'un dessin ou d'un texte. Ces classes n'ont rien à voir entre elles, mais leur comportement est unifié par l'utilisation de l'interface.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color:#00118C&quot;&gt;&lt;span style=&quot;font-size:14px&quot;&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Comme vous pouvez le constater, les interfaces et classes abstraites offrent un moyen d'assouplir votre code, le rendant ainsi plus évolutif. Le fait d'utiliser un comportement et non plus une classe dans ses typages forts permet de généraliser une instruction à un ensemble bien plus large d'objets.&lt;/p&gt;
&lt;p&gt;Alors que les interfaces sont souvent utilisées uniquement comme structure de classes lorsqu'on les connait peu, les associer au typage fort en font un outil trés puissant !&lt;/quote&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.lalex.com/post/2004/06/01/Interfaces-et-classes-virtuelles#comment-form</comments>
      <wfw:comment>http://blog.lalex.com/post/2004/06/01/Interfaces-et-classes-virtuelles#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.lalex.com/feed/atom/comments/215</wfw:commentRss>
      </item>
    
  <item>
    <title>Communautés Flash francophone sur divan</title>
    <link>http://blog.lalex.com/post/2004/04/28/Communauts-Flash-francophone-sur-divan</link>
    <guid isPermaLink="false">urn:md5:db79cb29a99be1b28aa6a252e594bc60</guid>
    <pubDate>Wed, 28 Apr 2004 09:40:58 +0000</pubDate>
    <dc:creator>-Alexandre LEGOUT aka LAlex-</dc:creator>
        <category>Articles</category>
            
    <description>    &lt;p&gt;Le Flash Festival souhaite organiser une rencontre de flasheurs à l'occasion du festival. Voici donc le mail qui a été envoyé à tous ceux qui peuvent promouvoir cette trés bonne idée ! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;quote&gt;Bonjour,&lt;/p&gt;
&lt;p&gt;Nous aimerions susciter une grande rencontre des communautés à l'occasion de la 3e édition du Flash Festival en France, festival francophone du contenu animé et interactif sur Internet, organisé au centre Pompidou le samedi 08 mai 2004 !&lt;/p&gt;
&lt;p&gt;Nous lançons un rendez-vous (après la soirée de remises des trophées), le samedi 08 mai à partir de 22h30 et jusqu'à 02h00, au Divan du monde qui sera l'occasion aux membres de nos communautés, d'échanger de visu et de se rencontrer ! L'entrée est bien sûr libre et ouverte à tous !  (pas d'open bar ;))&lt;/p&gt;
&lt;p&gt;Nous invitons donc les différentes communautés qui le souhaitent (Flash France, Flash-Forum, VisionFlash, Flashxpress et les blogs Lalex, TweenPix et GotoAndPlay) à communiquer sur ce rendez-vous dans leurs forums ou blogs pour que celui-ci soit une réussite et un grand moment d'échange et de rencontre !&lt;/p&gt;
&lt;p&gt;N'hésitez pas à revenir vers nous pour toutes suggestions &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Le Divan du monde : &lt;a href=&quot;http://www.divandumonde.com/&quot;&gt;http://www.divandumonde.com/&lt;/a&gt;&lt;br /&gt;
Flash Festival en France : &lt;a href=&quot;http://www.flashfestival.net/&quot;&gt;http://www.flashfestival.net/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Divan du monde (Angle des rues La Cigale / chez Michou. Métro Pigalle, ligne 2 ou 12).&lt;br /&gt;
Plan: &lt;a href=&quot;http://www.citefutee.com/Proxi/proxi.php?methode=adresse&amp;lang=FRA&amp;tmpl=CITEFUTEE&amp;adresse=75+rue+martyr+75018&quot;&gt;par ici&lt;/a&gt;&lt;/quote&gt;&lt;/p&gt;
&lt;p&gt;Bon, je suis super déçu de pas pouvoir y aller ... mais je conseille vivement à ceux qui en ont la possibilité de s'y rendre, ca devrait être super sympa ! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_cool.gif&quot; alt=&quot;8)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.lalex.com/post/2004/04/28/Communauts-Flash-francophone-sur-divan#comment-form</comments>
      <wfw:comment>http://blog.lalex.com/post/2004/04/28/Communauts-Flash-francophone-sur-divan#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.lalex.com/feed/atom/comments/203</wfw:commentRss>
      </item>
    
  <item>
    <title>Erratum article sur le pathfinding A star</title>
    <link>http://blog.lalex.com/post/2004/04/26/Erratum-article-sur-le-pathfinding-A-star</link>
    <guid isPermaLink="false">urn:md5:6f44b1c8dd02a52e389ada8dc0caee7c</guid>
    <pubDate>Mon, 26 Apr 2004 10:05:07 +0000</pubDate>
    <dc:creator>-Alexandre LEGOUT aka LAlex-</dc:creator>
        <category>Articles</category>
            
    <description>    &lt;p&gt;Patrick Lester, auteur de &lt;a href=&quot;http://www.lalex.com/blog/archives/200309/49-traduction-article-sur-pathfinding.html&quot;&gt;l'article sur le pathfinding A*&lt;/a&gt; que j'ai traduit, me signale qu'en lisant les commentaires fait sur ce blog à la suite de l'article, il s'est rendu compte d'une erreur, signalée par &lt;a href=&quot;http://www.lalex.com/blog/comments/200309/49-traduction-article-sur-pathfinding.html#comm753&quot;&gt;Yogaman&lt;/a&gt;. En effet, dans le cas où les diagonales sont utilisées, l'heuristique Manhatan peut retourner une estimation supérieure à la distance restant à parcourir. Or, pour une fiabilité complète, il faut que l'estimation de la distance à parcourir soit &lt;strong&gt;inférieure ou égale&lt;/strong&gt; à la distance restant réellement à parcourir ...&lt;/p&gt;
&lt;p&gt;Il est maintenant signalé que la méthode Manhatan est inadmissible pour l'exemple donné, mais pour des raisons de simplification, elle reste celle qui sera utilisée dans l'exemple de l'article, comme l'a signalé l'auteur dans son &lt;a href=&quot;http://www.policyalmanac.org/games/aStarTutorial.htm&quot;&gt;article original&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mon implémentation de l'algorithme se retrouve donc avec la même erreur, faisant que le chemin retourné peut ne pas être le plus court (toujours dans le cas des diagonales autorisées) ... Il s'agit donc de modifier la méthode &lt;em&gt;heuristic&lt;/em&gt; pour prendre en compte les diagonales ou non. C'est là que je suis bien content d'avoir fait de l'heuristique une méthode statique indépendante ! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_cool.gif&quot; alt=&quot;8)&quot; class=&quot;smiley&quot; /&gt; A ce propos, je rappelle que le cout par défaut utilisé est de 10. Dans le cas où les couts de chaque case peuvent varier (couts des terrains, contenu dans chaque case de la carte), il faut donc mettre le &lt;strong&gt;coût minimum&lt;/strong&gt; dans la propriété statique DEFAULT_COST ... &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Voici donc la version modifiée du pathfinder pour une plus grande fiabilité. J'ai également joint la classe Grid dont je me sert maintenant (tableau à deux dimensions), et modifié un peu le package de la classe (maintenant com.lalex.game) ...&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;a href=&quot;http://download.lalex.com/devblog/pathfinder.zip&quot; title=&quot;Download pathfinder.zip&quot;&gt;::Télécharger pathfinder.zip::&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.lalex.com/post/2004/04/26/Erratum-article-sur-le-pathfinding-A-star#comment-form</comments>
      <wfw:comment>http://blog.lalex.com/post/2004/04/26/Erratum-article-sur-le-pathfinding-A-star#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.lalex.com/feed/atom/comments/200</wfw:commentRss>
      </item>
    
  <item>
    <title>ActionScript : Les secrets des prototypes</title>
    <link>http://blog.lalex.com/post/2004/03/01/ActionScript-%3A-Les-secrets-des-prototypes</link>
    <guid isPermaLink="false">urn:md5:c50ada2803d8e97034f983a5a3d08f1c</guid>
    <pubDate>Mon, 01 Mar 2004 09:18:00 +0000</pubDate>
    <dc:creator>-Alexandre LEGOUT aka LAlex-</dc:creator>
        <category>Articles</category>
            
    <description>    &lt;p&gt;Les prototypes sont la base de la POO avec Flash, même en AS2. C'est
pourquoi j'ai considéré qu'il pouvait être sympa de faire une explication
détaillée de leur fonctionnement, dans un didacticiel rédigé pour &lt;a href=&quot;http://www.media-box.net/&quot;&gt;MediaBox&lt;/a&gt;. En fait, l'idée de ce tutoriel m'est
venue il y a un petit moment deja, quand dans un éclair, j'ai fini par
comprendre pourquoi la méthode d'héritage préconisée par Macromedia faisait
effectivement de l'héritage .... &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Auteur :&lt;/strong&gt; LAlex&lt;br /&gt;
&lt;strong&gt;Mail :&lt;/strong&gt; &lt;a href=&quot;mailto:lalex@flash-forum.net&quot;&gt;lalex@flash-forum.net&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;URL :&lt;/strong&gt; &lt;a href=&quot;http://www.flash-forum.net&quot;&gt;http://www.flash-forum.net&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Date de création :&lt;/strong&gt; 26/02/2004&lt;br /&gt;
&lt;strong&gt;Version :&lt;/strong&gt; Flash 5 / MX / MX 2004&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;strong&gt;Pré requis&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Connaître les &lt;a href=&quot;http://www.media-box.net/tuts.php?idfl=15842&quot;&gt;principes de la POO&lt;/a&gt;&lt;br /&gt;
&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Pour appliquer dans Flash MX 2004 : &lt;a href=&quot;http://www.media-box.net/tuts.php?idfl=16543&quot;&gt;De ActionScript 1 à ActionScript
2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Le programmation orientée objet sous Flash est dite &amp;quot;prototype based&amp;quot;, soit
en français &amp;quot;basée sur les prototypes&amp;quot;. Ce type de programmation est opposée à
la programmation dite &amp;quot;class based&amp;quot;, utilisée par la plupart des langages
objets célèbres, tels que le C/C++/C# ou Java. Bien qu'essayant de simuler la
même syntaxe que ces derniers langages, l'ActionScript 2 reste un langage de
prototypes, transformé en ActionScript 1 lors de la compilation. C'est pourquoi
il est également important de connaître les rouages de cette mécanique même si
l'on utilise la dernière mouture de Flash.&lt;/p&gt;
&lt;p&gt;Bien que limitant quelques possibilités très avancées de la POO, les
prototypes sont également un outil fantastique, permettant une programmation
plus souple, et une compréhension plus facile du fonctionnement interne de
votre code. Nous allons ici faire le tour des spécificités de la programmation
à base de prototypes, et plus particulièrement celle de Flash.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;1.
D'ou vient le prototype ?&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Nous partirons du constat que toute fonction à un prototype, &lt;strong&gt;qui est
créé en même temps que la fonction&lt;/strong&gt;. Le prototype est un objet,
contenant des propriétés et des méthodes. En fait, il n'est pas nécessaire d'en
savoir plus sur ce point. D'ailleurs, l'aide de Flash nous donne peu
d'informations sur ce qu'est le prototype, et se contente de dire Dans une
fonction constructeur ActionScript 1, la propriété prototype fait référence à
un objet qui est le prototype de la classe construite.Nous parlons ici de
fonction constructeur, c'est à dire qui va servir à instancier un nouvel objet.
Or, toute fonction peut être utilisée comme constructeur. ActionScript 2
fonctionne de la même manière, et les équivalences avec AS1 sont décrites dans
le tutorial &amp;quot;D'ActionScript 1 à ActionScript 2&amp;quot;.&lt;/p&gt;
&lt;p&gt;Lorsque l'on crée une fonction, on peut considérer que Flash crée
automatiquement un prototype associé, de type Object :&lt;/p&gt;
&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Création d'une fonction&lt;/span&gt;&lt;br /&gt;
myFunction = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;myFunction a été appellée&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Instruction implicite&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// myFunction.prototype = {} &lt;/span&gt;&lt;/code&gt;
&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;2.
L'opérateur new()&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt; Elément de base de la POO, l'opérateur
new() sert à créer un nouvel objet à partir d'une fonction constructeur. Son
fonctionnement consiste à attribuer le prototype de la fonction constructeur à
un objet nouvellement crée. Examinons les différentes étapes de la création de
cet objet. - L'opérateur new() crée un nouvel objet - Il initialise la
propriété système &amp;quot;__proto__&amp;quot; de ce nouvel objet avec le prototype de la
fonction constructeur - Il initialise la propriété système &amp;quot;__constructor__&amp;quot; de
ce nouvel objet avec la fonction constructeur - Il exécute la fonction sur
l'objet nouvellement crée Nous pouvons reproduire le fonctionnement de new() de
la manière suivante :
&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Déclaration du constructeur&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; MaClasse&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;arg&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Instance de MaClasse créée avec le paramètre : '&amp;quot;&lt;/span&gt; + arg + &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;'&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Instruction new &amp;quot;classique&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; monInstance = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; MaClasse&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Argument&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Même instruction décomposée&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// On crée un nouvel objet&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; monInstance = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;Object&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// On lui attribue le prototype de la fonction&lt;/span&gt;&lt;br /&gt;
monInstance.&lt;span style=&quot;color: #0066CC;&quot;&gt;__proto__&lt;/span&gt; = MaClasse.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// On lui attribue le constructeur&lt;/span&gt;&lt;br /&gt;
monInstance.__constructor__ = MaClasse;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// On applique la fonction constructeur à l'objet&lt;/span&gt;&lt;br /&gt;
MaClasse.&lt;span style=&quot;color: #0066CC;&quot;&gt;call&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;monInstance, &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Argument&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/code&gt;
&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;3.
__proto__ et la chaîne de prototypes&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
Nous avons vu précédemment que la construction d'un objet consiste à mettre un
prototype dans sa propriété __proto__. Il s'agit maintenant de comprendre
pourquoi l'on peut accéder aux méthodes et propriétés d'un objet, alors
qu'elles sont créées dans le prototype. Nous allons prendre l'exemple d'un
appel de méthode. En fait, lorsque l'on accède à la propriété d'un objet, Flash
va chercher tout d'abord si cette méthode existe dans l'objet lui-même. Si
c'est le cas, c'est cette méthode qui va être utilisée. Dans le cas contraire,
Flash va rechercher dans la propriété __proto__ de l'objet si la méthode est
présente, et l'utiliser s'il la trouve. S'il ne la trouve toujours pas, étant
donné que __proto__ est un objet, il contient lui-même une propriété __proto__,
dans laquelle Flash va continuer sa recherche, et ainsi de suite, jusqu'à ne
plus avoir de __proto__ dans lequel rechercher. Voici une illustration du
fonctionnement :
&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe &amp;quot;maison&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; MaClasse &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;arg&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Instance créée avec l'argument '&amp;quot;&lt;/span&gt; + arg + &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;'&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Ajout d'une méthode dans le prototype&lt;/span&gt;&lt;br /&gt;
MaClasse.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;innerDoIt&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;arg&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;innerDoIt exécuté&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Création d'une instance&lt;/span&gt;&lt;br /&gt;
monInstance = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; MaClasse&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Argument&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Création d'une fonction dans l'instance&lt;/span&gt;&lt;br /&gt;
monInstance.&lt;span style=&quot;color: #006600;&quot;&gt;doIt&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;doIt exécuté&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Appel des différentes méthodes&lt;/span&gt;&lt;br /&gt;
monInstance.&lt;span style=&quot;color: #006600;&quot;&gt;doIt&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
monInstance.&lt;span style=&quot;color: #006600;&quot;&gt;innerDoIt&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;monInstance.&lt;span style=&quot;color: #0066CC;&quot;&gt;toString&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/code&gt;
Instance créée avec l'argument 'Argument' doIt exécuté innerDoIt exécuté
[object Object] Ce code a en fait exécuté les méthodes suivantes : -
Constructeur - monInstance.doIt(); - monInstance.__proto__.innerDoIt(); -
monInstance.__proto__.__proto__.toString() (méthode toString() de Object) Cette
succession de recherche s'appelle &amp;quot;parcourir la chaîne de prototypes&amp;quot;. La fin
du parcours se fait lorsque la méthode est trouvée, ou lorsque la chaîne se
termine. Nous reviendrons plus tard sur la raison pour laquelle la chaîne se
termine.&lt;strong&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;4. L'héritage&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux méthodes pour implémenter l'héritage en ActionScript 1.
L'instruction 'extends' d'AS2 est un mixage des deux, assez bizarre il faut
bien le dire ... Pour rappel, l'héritage permet de profiter des fonctionnalités
d'une classe mère dans une classe fille qui en hérite. Pour plus
d'informations, rendez-vous sur le tutorial concernant les principes de la
POO.&lt;br /&gt;
&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;strong&gt;La méthode officielle de
Macromedia&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
Elle consiste à faire du prototype de la classe fille une instance de la classe
mère. Les instances de cette classe fille possèderont donc le prototype de la
classe mère dans leur chaîne de prototypes.
&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe mère&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
Parent = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Nouvelle instance de Parent&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe fille&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
Child = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Nouvelle instance de Child&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// La classe fille hérite de la classe mère&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
Child.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; Parent&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Instanciation de la classe fille&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
monInstance = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; Child&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/code&gt;
Pourquoi cette instruction permet-elle de faire de l'héritage ? Penchons nous
en détail dessus, en se servant de ce que nous avons vu ci-dessus concernant
l'instruction new() ... Si l'on utilise la notation &amp;quot;équivalente&amp;quot; de new, nous
obtiendrions :
&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe mere&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
Parent = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Nouvelle instance de Parent&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe fille&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
Child = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Nouvelle instance de Child&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// &amp;quot;Traduction&amp;quot; de Child.prototype = new Parent()&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
Child.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;Object&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
Child.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #0066CC;&quot;&gt;__proto__&lt;/span&gt; = Parent.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
Child.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.__constructor__ = Parent;&amp;lt;br /&amp;gt;&lt;br /&gt;
Parent.&lt;span style=&quot;color: #0066CC;&quot;&gt;call&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;Child.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// &amp;quot;Traduction&amp;quot; de monInstance = new Child()&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
monInstance = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;Object&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
monInstance.&lt;span style=&quot;color: #0066CC;&quot;&gt;__proto__&lt;/span&gt; = Child.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
monInstance.__constructor__ = Child;&amp;lt;br /&amp;gt;&lt;br /&gt;
Child.&lt;span style=&quot;color: #0066CC;&quot;&gt;call&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;monInstance&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/code&gt;
Nous avons donc dans monInstance.__proto__ = Child.prototype, et plus haut,
nous avions Child.prototype.__proto__ = Parent.prototype ... Donc, on peut en
déduire que monInstance.__proto__.__proto__ = Parent.prototype ! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_cool.gif&quot; alt=&quot;8)&quot; class=&quot;smiley&quot; /&gt; Lorsque
l'on va accéder à une méthode de monInstance, conformément au parcours de la
chaîne de prototypes, Flash va d'abord chercher dans monInstance, puis dans
monInstance.__proto__ (prototype de Child), puis dans
monInstance.__proto__.__proto__ (prototype de Parent). Nous avons donc bien de
l'héritage !&lt;strong&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;strong&gt;La méthode plus
&amp;quot;propre&amp;quot;.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
Dans la &amp;quot;traduction&amp;quot; ci-dessus, on peut se rendre compte que toutes les lignes
ne sont pas utiles. En effet, si l'on regarde la sortie générée par ce code, on
peut voir Nouvelle instance de Parent Nouvelle instance de ChildEn effet, le
constructeur de Parent a été appelé, alors qu'il n'est absolument pas
nécessaire. Afin d'éviter cela, une méthode d'héritage préférable consiste à
utiliser les lignes de traduction, mais uniquement celles qui sont nécessaires.
L'instanciation de monInstance peut être refaite par l'opérateur new(), étant
donné que le principe reste le même que ci dessus :
&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe mere&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
Parent = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Nouvelle instance de Parent&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe fille&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
Child = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Nouvelle instance de Child&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Héritage&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// ** Child.prototype = new Object();&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Cette ligne n'est pas nécessaire, étant donné que&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// le prototype de Child est crée automatiquement à la&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// création de la fonction&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
Child.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #0066CC;&quot;&gt;__proto__&lt;/span&gt; = Parent.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
Child.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.__constructor__ = Parent;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// ** Parent.call(Child.prototype);&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Cette ligne n'est pas nécessaire : il est inutile&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// d'exécuter le constructeur de la classe mère&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// &amp;quot;Traduction&amp;quot; de monInstance = new Child()&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
monInstance = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; Child&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/code&gt;
Ainsi, les fonctionnalités de l'héritage sont préservées, sans qu'aucune
instruction inutile ne soit executée. &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; Les spécifications du format SWF
v7 donnent l'implémentation de l'instruction &lt;em&gt;extends&lt;/em&gt; en ActionScript
2:
&lt;code class=&quot;actionscript&quot;&gt;Subclass.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;Object&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
Subclass.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #0066CC;&quot;&gt;__proto__&lt;/span&gt; = Superclass.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
Subclass.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.__constructor__ = Superclass;&lt;/code&gt;
Cette implémentation a fait débat, concernant le fait qu'en executant la
première ligne, à priori inutile, elle détruit le prototype actuel, détruisant
ainsi le prototype courant, et la propriété &amp;quot;constructor&amp;quot; de celui-ci ... Vous
pouvez avoir plus d'informations sur la discussion en français qui a eu lieu
sur &lt;a href=&quot;http://www.lalex.com/blog/post-70.html&quot;&gt;le devblog de
LAlex&lt;/a&gt;.&lt;strong&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;5. Pourquoi parle-t-on de &amp;quot;prototypes de MovieClip&amp;quot;
?&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt; Lorsque l'on parle de prototypes de MovieClip comme
les petits utilitaires permettant de faire un mouvement élastique ou autre, il
s'agit d'un abus de langage, issu des débuts de la programmation Flash durant
lesquels le vocabulaire propre à la POO n'était pas des plus répandus chez les
programmeur utilisant cette technologie. En réalité, pour être exact, faire un
&amp;quot;prototype de MovieClip&amp;quot; signifie &amp;quot;rajouter une méthode au prototype de
MovieClip&amp;quot;. Etant donné que tous les clips de Flash on un __proto__ qui pointe
vers MovieClip.prototype, ajouter une méthode à ce prototype revient à ajouter
une méthode a chaque clip !!!&lt;strong&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;6. La cas particulier de
Object&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
Nous parlions plus haut de parcourir la chaîne de prototypes jusqu'à ce qu'il
n'y ai plus de prototype à parcourir. La question est de savoir à quel moment
s'arrête cette chaîne. Le cas particulier est en fait la classe Object. Elle a
pour particularité le fait que son prototype n'a pas de constructeur. Elle
possède bien un prototype, comme toute fonction constructeur, c'est pourquoi il
est possible d'utiliser new Object(). Par contre ce prototype n'est issu
d'aucune classe, ce qui fait que le __proto__ de Object.prototype n'existe pas.
C'est comme si l'instruction implicite (vue au début de ce tutoriel) à la
création de la fonction &amp;quot;Object&amp;quot; n'avait pas été exécutée. En effet, cela se
vérifie facilement :
&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe interne&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;== MovieClip ==&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0066CC;&quot;&gt;MovieClip&lt;/span&gt;.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0066CC;&quot;&gt;MovieClip&lt;/span&gt;.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #0066CC;&quot;&gt;__proto__&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe &amp;quot;maison&amp;quot;&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
MaClasse = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;== MaClasse ==&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;MaClasse.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;MaClasse.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #0066CC;&quot;&gt;__proto__&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe Object&amp;lt;br /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;== Object ==&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0066CC;&quot;&gt;Object&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;prototye&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0066CC;&quot;&gt;Object&lt;/span&gt;.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #0066CC;&quot;&gt;__proto__&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/code&gt;
&lt;br /&gt;
&lt;blockquote&gt;
&lt;p&gt;== MovieClip==&lt;br /&gt;
[object Object]&lt;br /&gt;
[object Object]&lt;/p&gt;
&lt;p&gt;== MaClasse ==&lt;br /&gt;
[object Object]&lt;br /&gt;
[object Object]&lt;/p&gt;
&lt;p&gt;== Object ==&lt;br /&gt;
[object Object]&lt;br /&gt;
undefined&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C'est la raison pour laquelle la remontée de la chaîne de prototypes
s'arrête à un moment donné, lorsqu'elle rencontre un __proto__ qui n'existe
pas. Cette constatation nous amène aussi au fait que toutes les classes
héritent forcément de Object, étant donné que leurs prototypes sont soit de
type Object, soit héritent eux-mêmes de Object. C'est d'ailleurs pour ca que
toutes les classes, personnelles ou intégrées à Flash, possèdent une méthode
&amp;quot;toString&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Une fois les prototypes compris, se balader dans les chaînes de prototypes
devient beaucoup plus clair, et l'on arrive ainsi à une compréhension accrue du
fonctionnement de son code, ce qui simplifie évidemment son élaboration ainsi
que son debugage.&lt;br /&gt;
Les prototypes peuvent également poser des problématiques inédites, véritable
gymnastique de l'esprit. Les manipuler peut amener à des fonctionnalités très
pointues, directement au coeur du code, traitant les classes elles-mêmes comme
l'on traite des objets &amp;quot;normaux&amp;quot;.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.lalex.com/post/2004/03/01/ActionScript-%3A-Les-secrets-des-prototypes#comment-form</comments>
      <wfw:comment>http://blog.lalex.com/post/2004/03/01/ActionScript-%3A-Les-secrets-des-prototypes#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.lalex.com/feed/atom/comments/182</wfw:commentRss>
      </item>
    
  <item>
    <title>Quelle place pour Flash dans le développement d'applications online ?</title>
    <link>http://blog.lalex.com/post/2004/01/22/Quelle-place-pour-Flash-dans-le-dveloppement-dapplications-online</link>
    <guid isPermaLink="false">urn:md5:a2e0fcbcaa49a2df1c12d239cd2e8ad6</guid>
    <pubDate>Thu, 22 Jan 2004 09:18:16 +0000</pubDate>
    <dc:creator>-Alexandre LEGOUT aka LAlex-</dc:creator>
        <category>Articles</category>
            
    <description>    &lt;p&gt;Ma première contribution au &lt;a href=&quot;http://emma.media-box.net&quot;&gt;webzine EMMA&lt;/a&gt; de MediaBox est un article sur &lt;a href=&quot;http://emma.media-box.net/article.php?article=18&quot;&gt;la place de Flash dans les applications online&lt;/a&gt;. Je parle ici de Flash en tant qu'outil de développement pour des applicatifs avancés, et de la difficulté qu'à ce format à s'imposer dans le monde de l'entreprise, que ce soit pour des applications Intranet ou des gros sites dynamiques tels que Amazon.&lt;/p&gt;
&lt;p&gt;J'y fais l'analyse non-exhaustive des raisons qui pourraient pousser à l'adopter, et des raisons qui rendent les décisionnaires souvent frileux à utiliser une telle technologie. Doit-on voir du Flash partout ? Pourquoi pas ! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_cool.gif&quot; alt=&quot;8)&quot; class=&quot;smiley&quot; /&gt; Pourquoi n'est-ce pas le cas ? Je vous livre mon explication ... &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.lalex.com/post/2004/01/22/Quelle-place-pour-Flash-dans-le-dveloppement-dapplications-online#comment-form</comments>
      <wfw:comment>http://blog.lalex.com/post/2004/01/22/Quelle-place-pour-Flash-dans-le-dveloppement-dapplications-online#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.lalex.com/feed/atom/comments/169</wfw:commentRss>
      </item>
    
  <item>
    <title>Traduction : article sur le pathfinding A*</title>
    <link>http://blog.lalex.com/post/2003/09/15/Traduction-%3A-article-sur-le-pathfinding-A</link>
    <guid isPermaLink="false">urn:md5:a858a10b273f30205ef5b1c0fc5d6840</guid>
    <pubDate>Mon, 15 Sep 2003 19:17:00 +0000</pubDate>
    <dc:creator>-Alexandre LEGOUT aka LAlex-</dc:creator>
        <category>Articles</category>
            
    <description>    &lt;p&gt;Voici l'article qui m'a fait comprendre le pathfinding ! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Je l'ai traduit en français afin que le plus grand nombre puisse en
profiter. L'auteur se nomme Patrick Lester et l'article original se situe à
l'adresse suivante : &lt;a href=&quot;http://www.policyalmanac.org/games/aStarTutorial.htm&quot;&gt;http://www.policyalmanac.org/games/aStarTutorial.htm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 18px;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color: darkred;&quot;&gt;Pathfinding A* pour les débutants&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Alors qu'il est relativement facile à utiliser une fois que l'on a pris le
coup, l'algorithme A* (prononcer &amp;quot;A star&amp;quot;) peut être difficle à aborder pour
des débutants. Il existe beaucoup d'articles sur le web qui expliquent A*, mais
la plupart sont destinés à ceux qui en comprennent dejà les bases. Celui-ci est
destiné aux vrais débutants du pathfinding.&lt;/p&gt;
&lt;p&gt;Cet article n'est pas spécifique à un langage donc vous devrier facilement
pouvoir l'adapter a n'importe quel langage de programmation.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;Introduction : la zone de
recherche.&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://blog.lalex.com/public/astar/astar1.gif&quot; style=&quot;float: right;&quot; /&gt;Considérons que quelqu'un veut aller d'un point A à un opint
B. Considérons également qu'un mur est situé entre ces deux points. Cette
situation est illustrée par l'image ci-contre, où le point A (départ) est
affiché en vert, le point B (arrivée) est en rouge, et où les cases en bleu
représentent le mur.&lt;/p&gt;
&lt;p&gt;La première chose que vous remarquerez est que la zone de recherche est
divisée en cases. Simplifier la zone de recherche, comme nous l'avons fait ici,
est la première étape en pathfinding. Cette méthode particulière réduit notre
zone de recherche à un simple tableau a deux dimensions. Chaque élément du
tableau représente une case de notre grille, est son statut est notifié comme
étant &amp;quot;traversable&amp;quot; ou &amp;quot;non traversable&amp;quot;. Le chemin va être la succession de
cases à parcourir pour passer de la case A à la case B. Une fois le chemin
trouvé, notre personnage va passer du centre d'une case au centre de la
prochaine case, jusqu'à ce qu'il atteigne sa cible.&lt;/p&gt;
&lt;p&gt;Ces points au centre de chaque case sont appelés &amp;quot;noeuds&amp;quot; (nodes). Quand
vous lisez un texte traitant du pathfinding, vous retrouverez souvent ce terme
de noeuds. Pourquoi ne pas appeler ca simplement une case ? Tout simplement
parce qu'il est possible de diviser une zone de recherche en autre chose qu'une
case &amp;quot;carrée&amp;quot;. Cela peut-être une forme rectangulaire, ou hexagonale, ou en
fait n'importe quelle forme. Ces noeuds peuvent égelement être placés n'importe
ou sur les formes - au centre ou sur les contours, ou n'importe où ailleurs.
Nous utilisons ici ce système tout simplement parce que c'est le plus simple
...&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;Commencer la recherche&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Une fois la zone de recherche simplifiée à un nombre de noeuds facilement
gérable, comme nous l'avons fait avec la grille ci-dessus, la prochaine étape
consiste à effectuer la recherche pour trouver le chemin le plus court. En
pathfinding A*, on commence cette recherche par le point A, puis en vérifiant
les cases adjacentes, et en général en cherchant encore à l'extérieur jusqu'à
ce que la cible soit trouvée.&lt;/p&gt;
&lt;p&gt;Nous commencons notre recherche de la manière suivante :&lt;/p&gt;
&lt;p&gt;Commencons au point de départ et ajoutons le a une &amp;quot;liste ouverte&amp;quot; (open
list) de cases à étudier. La liste ouverte est une sorte de &amp;quot;shopping list&amp;quot;.
Pour l'instant, nous n'avons qu'un seul point à l'intérieur (le point A), mais
il y en aura bientôt plus. Elle contient une liste de cases qui pourraient
éventuellement faire partie de notre chemin, mais pas forcément. En fait, c'est
une liste de pionts que nous devrons vérifier. Regardez maintenant toutes les
cases ateignables (ou &amp;quot;traversables&amp;quot;) adjacentes au point de départ, en
ignorant les cases avec les murs, ou de l'eau, ou toute case qu'on ne peut pas
traverser. Ajoutez les a la liste ouverte également. Pour chacune de ces cases,
enregistrez la case A comme son étant son &amp;quot;parent&amp;quot;. Cette notion de &amp;quot;parent&amp;quot;
est trés importante ensuite pour pouvoir retracer le chemin. Une explication
vous est donnée plus loin.&lt;br /&gt;
Supprimez maintenant le point A de la &amp;quot;liste ouverte&amp;quot;, et ajoutez le à une
&amp;quot;liste fermée&amp;quot; (closed list), qui va contenir les points que nous n'aurons plus
besoin de vérifier.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.lalex.com/public/astar/astar2.gif&quot; align=&quot;right&quot; border=&quot;0&quot; /&gt;A cette
étape, vous devriez avoir quelquechose comme l'image ci-contre. Sur ce schéma,
la carré vert foncé au centre est notre case de départ. Elle est entourée de
bleu clair pour signifier que la case a bien été ajoutée à notre &amp;quot;liste
fermée&amp;quot;. Toutes les cases adjacentes sont maintenant dans la &amp;quot;liste ouverte&amp;quot; de
case à vérifier, et sont entourées de vert clair. Chacune d'elle possède une
&amp;quot;pointeur&amp;quot; vers son parent, qui n'est autre que la case de départ.&lt;/p&gt;
&lt;p&gt;Ensuite, choisissons une case de la &amp;quot;liste ouvert&amp;quot;, et répétons plus ou
moins le raisonnement précédent. Mais quelle case choisir ? Celle avec le coût
F le plus bas.&lt;/p&gt;
&lt;p&gt;Cout d'un chemin.&lt;/p&gt;
&lt;p&gt;La clé servant à déterminer quelle case utiliser parmi celles contenues dans
la &amp;quot;liste ouverte&amp;quot; est l'équation suivante :&lt;br /&gt;
F = G + H&lt;br /&gt;
avec&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;G est le coût de mouvement pour aller de la case A à une case donnée sur la
grille, en suivant le chemin généré jusqu'ici.&lt;/li&gt;
&lt;li&gt;H est le coût de mouvement pour aller d'une case donnée sur la grille
jusqu'au point de destination, le point B. Il est souvent appelé &amp;quot;heuristique&amp;quot;,
ce qui peut-être troublant. La raison pour laquelle on le nomme ainsi est que
ce coût est estimé. En effet, nous ne connaissons pas vraiment la distance
qu'il nous reste à parcourir, car toute sortes d'obstacles peuvent se trouver
sur le parcours (mur, eau, etc..). Un moyen de calculer ce coût est donné dans
ce tutoriel, mais il en existe d'autres que vous pourrez trouver dans d'autres
articles sur le net.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Notre chemin est généré récursivement en parcourant notre &amp;quot;liste ouverte&amp;quot; et
en y choisissant le case ayant le coût F le plus faible. Ce raisonnement sera
abordé un peu plus loin dans cet article, mais regardons d'abord
commentutiliser l'équation que nous venons de voir.&lt;/p&gt;
&lt;p&gt;Comme décris précédemment, G est le coût de mouvement du point de départ
jusqu'à la case donnée en parcourant le chamin généré jusque là. Dans cet
exemple, nous allons assigner un coût de 10 pour chaque déplacement horizontal
ou vertical, et un coût de 14 pour un mouvement en diagonale. Nous utilisons
ces données car la distance nécessaire pour se déplacer est la racine carrée de
2 (ne prenez par peur, restez la ! ;)), ou approximativement 1.414 fois le coût
d'un déplacement vertical ou horizontal. Nous utiliserons 10 et 14 pour des
raisons évidentes de simplification. Le rapport est à peu prés correct, et nous
évitons ainsi les calculs de racines carrées et le nombres à virgule. Mais cela
n'est pas seulement pour que nous n'aimons pas les maths : utiliser des nombres
entiers est aussi bien plus rapide pour l'ordinateur également. Comme vous
allez bientôt le constater, le pathfinding peut être trés lent si vous
n'utilisez pas ce genre d'astuces.&lt;/p&gt;
&lt;p&gt;Etant donné que nous calculont le coût G le long d'un chemin donné, le moyen
de trouver ce coût est de prendre le coût G de son parent, et de lui ajouter 10
ou 14 selon qu'il soit situé en diagonale ou pas par rapport à son parent.
L'interêt de cette méthode deviendra plus clair lorsque nous serons plus loin
qu'à une case du point de départ.&lt;/p&gt;
&lt;p&gt;Le coût H peut être estimé d'un grand nombre de facons. La méthode que nous
utiliserons ici est nommée la méthode &amp;quot;Manhattan&amp;quot;, avec laquelle vous calculez
le nombre de cases verticales et horizontales pour parvenir au point d'arrivée
(en ignorant les mouvements en diagonale). Nous multiplions alors ce total par
10. Cette méthode s'appelle &amp;quot;Manhattan&amp;quot; parce qu'elle revient à calculer le
nombre de patés de maisons d'un endroit à un autre, sans couper à travers un
bloc en diagonale.&lt;/p&gt;
&lt;p&gt;En lisant ceci, il est courant de penser que l'heuristique est simplement
une estimation de la distance restant à parcourir à vol d'oiseau. Or, ce n'est
pas le cas. Nous essayons en fait de calculer la distance restant à parcourir
via le chemin à trouver (qui est généralement plus long). Plus cette estimation
est proche, plus l'algorithme trouvera le chemin facilement (et rapidement). Si
le chemin estimé est sur-évalué, il n'est pas certain de trouver le chemin
optimal. Dans ce cas, l'heuristique est dite &amp;quot;inadmissible&amp;quot;.&lt;/p&gt;
&lt;p&gt;Techniquement, dans cet exemple, la méthode &amp;quot;Manhatan&amp;quot; est inadmissible, car
elle surévalue quelque peu la distance restante. Mais nous l'utiliserons
quand-même, car elle est la plus facile à comprendre dans ce cas là, et qu'il
s'agit d'une surestimation assez légère. Dans les rares cas où le chemin trouvé
n'est pas le plus court, il n'en sera pas trés éloigné. Si vous voulez en
savoir plus, rendez vous &lt;a href=&quot;http://www.policyalmanac.org/games/heuristics.htm&quot;&gt;ici&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.lalex.com/public/astar/astar3.gif&quot; align=&quot;right&quot; border=&quot;0&quot; /&gt;Le coût F est
calculé en ajoutant G et H. Vous pouvez constater le résultat sur le schéma
ci-contre. Les coûts F, G et H sont notés dans chaque case. Comme indiqué, F
est situé en haut à gauche, G en bas à gauche et H en bas à droite.&lt;/p&gt;
&lt;p&gt;Jetons maintenant un coup d'oeil à ces cases. Dans celle qui contient les
lettres, nous avons G=10. C'est parce qu'elle est située à une case du point de
départ, dans une direction horizontale. Les cases en dessous et au dessus de la
case de départ, ainsi que celle située à sa gauche ont toutes le même coût de
10. Les cases en diagonales ont un coût de 14.&lt;/p&gt;
&lt;p&gt;Les coûts H sont calculés en estimant la distance &amp;quot;Manhattan&amp;quot; jusqu'à la
case d'arrivée, en se déplacant horizontallement et verticalement, et en
ignorant le mur qui est sur le chemin. Avec cette méthode, la case située juste
à droite du départ est à trois déplacement horizontaux de l'arrivée, soit un
coût H de 30. La case située juste en dessous est à quatre cases de l'arrivée
(souvenez-vous, on se déplace uniquement horizontalement et verticalement) pour
un coût H de 40. Vous constaterez facilement le calcul des coûts H des autres
cases.&lt;/p&gt;
&lt;p&gt;Le coût F de chaque case est calculé par une simple addition de G et H.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;Continuer la recherche&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Pour continuer la recherche, nous choisissone tout simplement la case ayant
le coût F le plus faible parmi les case de la &amp;quot;liste ouverte&amp;quot;. Puis, avec cette
case nous faisons le processus suivant :&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
&lt;li&gt;Nous la supprimons de la &amp;quot;liste ouverte&amp;quot; et la rajoutons à la &amp;quot;liste
fermée&amp;quot;&lt;/li&gt;
&lt;li&gt;Nous vérifions toutes ses cases adjacentes, en ignorant celles qui font
partie de la &amp;quot;list fermée&amp;quot;, ainsi que celle qu'on ne peut pas traverser, que
nous ajoutons à la &amp;quot;liste ouverte&amp;quot; si elles n'y sont pas déjà. Assignez la case
en cours comme étant le &amp;quot;parent&amp;quot; des cases nouvellement ajoutées.&lt;/li&gt;
&lt;li&gt;Si une des cases adjacentes est déjà dans la &amp;quot;liste ouverte&amp;quot;, vérifiez si
le chemin pour y arriver n'est pas meilleur. En d'autres termes, vérifiez si le
coût G de cette case est inférieure si nous utilisons la case en cours pour y
parvenir. Si ce n'est pas le cas, ne changez rien.&lt;br /&gt;
D'un autre côté, si le coût G du nouveau chemin est inférieur, faites que la
case en cours soit le nouveau parent de cette case adjacente (dans le schéma
précédent, chagez la direction du pointeur pour pointer vers la case en cours).
Pour finir, re-calculez les coût F et G de cette case. Cela semble assez
confus, mais vous le verrez illustré graphiquement ci-dessous.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.lalex.com/public/astar/astar4.gif&quot; align=&quot;right&quot; border=&quot;0&quot; /&gt;Bon, voyons
maintenant comment cela fonctionne. Sur nos 9 cases initiales, nous en avons 8
qui font partie de la &amp;quot;liste ouverte&amp;quot; aprés que la case de départ ait été
envoyée vers la &amp;quot;liste fermée&amp;quot;. De ces 8 cases, celle ayant le coût F le plus
faible est celle qui se situe immédiatement à droite de la case de départ, avec
un coût F de 40. Donc, nous choisissons cette case comme étant la prochaine.
Elle est entourée en bleu dans l'illustration ci-contre.&lt;/p&gt;
&lt;p&gt;Tout d'abord, nous supprimons cette case de la &amp;quot;liste ouverte&amp;quot; pour
l'envoyer dans la &amp;quot;liste fermée&amp;quot; (c'est pourquoi elle est maintenant entourée
en bleu). Puis, nous vérifions ses cases adjacentes. Celle qui est
immédiatement à droite est un mur, donc nous l'ignorons. Celle immédiatement à
gauche est la case de départ. Comme elle fait partie de la &amp;quot;liste fermée&amp;quot;, on
l'ignore également.&lt;/p&gt;
&lt;p&gt;Les quatre autres cases sont deja dans la &amp;quot;liste ouverte&amp;quot;, donc nous devons
vérifier si les chemins qui y vont sont meilleurs en passant par notre case en
cour, en utilisant le coût G comme point de comparaison. Regardons la case
située juste en dessous de notre case actuelle. Son coût G est de 14. Si nous y
allions en passant par notre case en cours, le coût serait de 20 (10 de coût G
de la case, plus 10 de déplacement vertical depuis la case en cours). Un coût G
de 20 est supérieur à 14, donc le chemin en cours n'est pas meilleur. Il suffit
de regarder le schéma pour que cela saute aux yeux : il est plus direct d'eller
sur cette case depuis le départ en se déplacant en diagonale, plutôt qu'en se
déplacant d'abord horizontalement d'une case puis verticalement d'une case.&lt;/p&gt;
&lt;p&gt;Lorsque nous répétons ce processus pour les quatre cases adjacentes deja
dans la &amp;quot;liste ouverte&amp;quot;, nous nous rendons compte qu'aucun chemin n'est
amélioré en passant par la case en cours, donc nous ne changeons rien.
Maintenant que nous avons traité toutes les cases adjacentes, nous en avons
fini avec la case en cours, et nous sommes prêts à passer à la suivante.&lt;/p&gt;
&lt;p&gt;Donc nous parcourons a nouveau notre &amp;quot;liste ouverte&amp;quot;, qui est maintenant
composée de 7 cases, et nous prenons celle qui a le coût F le plus faible. Il
est interessant de constater que dans ce cas, il y a deux cases avec un coût de
54. Dans ce cas, laquelle choisir ? En fait, cela a peu d'importance. Pour des
raisons d'optimisation, il peut être plus rapide de choisir le dernier que vous
avez ajouté à la &amp;quot;liste ouverte&amp;quot;. Cela oriente la recherche en faveur des cases
qui sont trouvées le plus tard au cours de la recherche, quand vous êtes
arrivés plus prés de votre destination. Mais cela n'a réellement pas
d'importance (différentes approches de cette notion peuvent faire que deux
algorithmes A* peuvent trouver des chemins différents de longueurs égales).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.lalex.com/public/astar/astar5.gif&quot; align=&quot;right&quot; border=&quot;0&quot; /&gt;Choisissons
la case située juste en dessous et à droite de la case de départ, comme
illustré dans le schéma ci-contre.&lt;/p&gt;
&lt;p&gt;Cette fois-ci, quand nous vérifions les cases adjacentes, nous voyons que
celle située immédiatement à droite est un mur, donc nous l'ignorons. Nous
faisons la même constatation pour celle située juste au dessus. Nous ignorerons
également celle qui est située en dessous du mur. Pourquoi ? Parce que vous ne
pouvez pas vous y rendre directement depuis la case en cours sans passer au
dessus du coin du mur. Vous avez en fait besoin d'aller vers le bas d'abord,
pour ensuite vous rendre sur cette case (Note : cette règle est optionnelle.
Elle dépend en fait de l'endroit ou sont situés les &amp;quot;noeuds&amp;quot;).&lt;/p&gt;
&lt;p&gt;Ceci nous laisse cing autres cases. Les deux cases situées en dessous de la
case en cours ne sont pas encore dans la &amp;quot;liste ouverte&amp;quot;, donc nous les
ajoutons avec la case en cours comme parent. En ce qui concerne les trois
autres cases, deux sont deja dans la &amp;quot;liste fermée&amp;quot; (la case de départ et celle
située à sa droite, toutes les deux entourées en bleu sur le schéma), donc nous
les ignorons. Et la dernière case, immédiatement à gauche de la case en cours,
est vérifiée pour voir si le coût G est inférieur en passant par la case en
cours. Ce n'est pas le cas, donc nous pouvons vérifier la case suivante dans
notre &amp;quot;liste ouverte&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.lalex.com/public/astar/astar6.gif&quot; align=&quot;right&quot; border=&quot;0&quot; /&gt;Nous allons
répeter ce processus jusqu'à ce que la case d'arrivée soit ajoutée à la &amp;quot;liste
fermée&amp;quot;, ce qui nous donne quelque chose comme le schéma ci-contre.&lt;/p&gt;
&lt;p&gt;Vous contaterez que le parent de la case située deux cases en dessous du
départ a changé par rapport au précédent schéma. Avant, elle avait un coût G de
28, et pointait vers la case situé en haut à droite. Maintenant elle a un score
de 20 et pointe vers la case juste au dessus d'elle. Ceci est arrivé quelque
part au long de notre recherche, alors que le coût G a été vérifié et modifié
pour être plus faible en utilisant un autre chemin - donc le parent a été
changé, et les coûts F et G recalculés. Bien que ce changement paraisse anodin
ici, il existe beaucoup de situations ou cette vérification constante va faire
la différence pour déterminer le meilleur chemin jusqu'à votre destination.&lt;/p&gt;
&lt;p&gt;Maintenant, comment déterminer le chemin lui-même ? Tout simplement en
partant de la case d'arrivée, et en remontant le chemin en sens inverse d'une
case à sa case parent, en suivant les flèches. Cela va vous ramener à votre
chemin de départ, et voila votre chemin ! Cela devrait ressembler à
l'illustration ci-contre. Se déplacer du point A ou point B consiste maintenant
à vous déplacer du centre d'une case au centre de la prochaine case de votre
chemin, jusqu'à ce que vous atteignez votre destination. Simple non ?!?&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;&lt;img src=&quot;http://blog.lalex.com/public/astar/astar7.gif&quot; border=&quot;0&quot; /&gt;&lt;/div&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;Récapitulatif de la méthode
A*&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Maintenant que nous avons effectué la totalité de nos explications, faisons
un petit récapitulatif étape par étape :&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
&lt;li&gt;Ajouter le point de départ à la &amp;quot;liste ouverte&amp;quot;&lt;/li&gt;
&lt;li&gt;Répéter les instructions suivantes :
&lt;ol type=&quot;a&quot;&gt;
&lt;li&gt;Cherche la case ayant le coût F le plus faible dans la &amp;quot;liste ouverte&amp;quot;.
Elle devient la case en cours.&lt;/li&gt;
&lt;li&gt;Passer la case en cours de la &amp;quot;liste ouverte&amp;quot; à la &amp;quot;liste fermée&amp;quot;&lt;/li&gt;
&lt;li&gt;Pour les 8 case adjacentes à la case en cours
&lt;ul&gt;
&lt;li&gt;Si on ne peut pas la traverser, on l'ignore.&lt;/li&gt;
&lt;li&gt;Si elle n'est pas dans la &amp;quot;liste ouverte&amp;quot;, on l'y ajoute. La case en cours
devient le parent de cette case. On calcule les coûts F, G et H de cette
case.&lt;/li&gt;
&lt;li&gt;Si elle est déjà dans la &amp;quot;liste ouverte&amp;quot;, on teste si le chemin passant par
la case en cours est meilleur en comparant les coûts G. Un coût G inférieur
signifie un meilleur chemin. Si c'est le cas, on change le parent de la case
pour devenir la case en cours, en on recalcule les coûts F et G. Si vous
conservez une &amp;quot;liste ouverte&amp;quot; triée par coût F, la liste doit être retriée à ce
moment la.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;On s'arrête quand
&lt;ul&gt;
&lt;li&gt;La case de destination est ajoutée à la &amp;quot;liste fermée&amp;quot;&lt;/li&gt;
&lt;li&gt;Vous ne trouvez pas la case de destination et la &amp;quot;liste ouverte&amp;quot; est
vide.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Enregistrez le chemin. En partant de la case de destination, remontez d'un
case à son parent jusqu'à atteindre la case de départ. Vous avez votre chemin !
&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;smiley&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;color: darkblue;&quot;&gt;&lt;strong&gt;Petit
apparté&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Excusez moi pour ce hors-sujet, mais il est important de noter qu'à de
nombreuses discussions concernant le pathfinding A* sur le web et dans des
forums, vous trouverez parfois certains codes qui sont dit A*, mais ne le sont
pas. Pour utiliser la méthode A*, il faut absolument inclure les notions
abordées précedemment, et plus précisemment la &amp;quot;liste ouverte&amp;quot; et la &amp;quot;liste
fermée&amp;quot;, ainsi que le calcul des coûts F, G et H. Il existe beaucoup
d'algorithmes de pathfinding, mais ces autres méthodes ne sont pas A*, qui est
générallement considéré comme étant le meileur de tous. Bryan Stout aborde
beaucoup d'entre eux dans &lt;a href=&quot;http://www.gamasutra.com/features/19970801/pathfinding.htm&quot;&gt;cet article&lt;/a&gt;,
incluant leurs avantages et inconvénients. Parfois, une alternative est
mailleure dans certaine circonstances, mais réflechissez à ce dans quoi vous
mettez les pieds!&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.lalex.com/post/2003/09/15/Traduction-%3A-article-sur-le-pathfinding-A#comment-form</comments>
      <wfw:comment>http://blog.lalex.com/post/2003/09/15/Traduction-%3A-article-sur-le-pathfinding-A#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.lalex.com/feed/atom/comments/100</wfw:commentRss>
      </item>
    
  <item>
    <title>Flash MX 2004 : d'ActionsScript 1 à ActionScript 2</title>
    <link>http://blog.lalex.com/post/2003/09/12/Flash-MX-2004-%3A-dActionsScript-1-ActionScript-2</link>
    <guid isPermaLink="false">urn:md5:bcf85986142f332d798cd88095fc4608</guid>
    <pubDate>Fri, 12 Sep 2003 16:58:09 +0000</pubDate>
    <dc:creator>-Alexandre LEGOUT aka LAlex-</dc:creator>
        <category>Articles</category>
            
    <description>    &lt;p&gt;Voici un tutoriel toujours écrit pour &lt;a href=&quot;http://www.flash-forum.net/&quot;&gt;Flash Forum&lt;/a&gt; qui décrit comment passer de la POO avec ActionScript 1 (Flash MX) à la POO avec ActionScript 2 (Flash MX 2004)&lt;/p&gt;
&lt;p&gt;Je commence par décrire comment traduire les instructions utilisées en POO avec Flash MX, presque mot à mot, vers une POO faite avec AS2. Viennent ensuite les particularité propres au langage AS2, suivie d'une brève description des habitudes qu'il faudrait prendre pour coder avec Flash MX 2004 ...&lt;/p&gt;
&lt;p&gt;&lt;quote&gt;&lt;span style=&quot;font-size:18px&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color:darkred&quot;&gt;Passer de l'ActionScript 1 à l'ActionScript 2&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Auteur :&lt;/strong&gt; LAlex&lt;br /&gt;
&lt;strong&gt;Mail :&lt;/strong&gt; &lt;a href=&quot;mailto:lalex@flash-forum.net&quot;&gt;lalex@flash-forum.net&lt;/a&gt;	&lt;br /&gt;
&lt;strong&gt;URL :&lt;/strong&gt; &lt;a href=&quot;http://www.flash-forum.net&quot;&gt;http://www.flash-forum.net&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Date de création :&lt;/strong&gt; 20/09/2003&lt;br /&gt;
&lt;strong&gt;Version :&lt;/strong&gt; Flash MX 2004&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:14px&quot;&gt;&lt;strong&gt;Présentation&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; Tous les programmeurs POO en Flash MX ne sont pas forcément habitués à des languages objets tels Java ou C++. Dans sa nouvelle version MX 2004, Macromedia introduit ActionScript 2, qui a pour but, entre autre, de ralier à sa cause les programmeurs utilisant des langages &quot;standards&quot;, en utilisant une syntaxe trés proches de celle dont ils ont l'habitude. Pour les autres, voici comment passer en douceur à l'ActionScript 2.0.&lt;br /&gt;
img:coupe&lt;br /&gt;
&lt;span style=&quot;font-size:16px&quot;&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;1. Différences des concepts&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Si vous vous interessé à ce qui se passe dans le monde de l'ActionScript (nous utiliserons l'abbréviation &quot;AS&quot; dans le tutoriel) vous avez peut-être deja lu ou entendu que l'AS de Flash MX permet de faire de la POO basé sur les prototypes (prototype based). A l'inverse, AS2 propose de faire de la POO basée sur les classes (class based). Voyons quels sont ces deux principes:&lt;ul&gt;&lt;br /&gt;
&lt;strong&gt;&lt;li&gt; POO avec les prototypes :&lt;/strong&gt; Pour créer une classe, on crée en fait une fonction qui sera la fonction contructeur de la classe. Ce n'est pour l'instant rien d'autre qu'une fonction. C'est le fait de l'utiliser avec l'opérateur 'new' qui en fait une classe.&lt;br /&gt;
 Pour rajouter une méthode à un objet, on va alors créer des fonctions dans son prototype. Lorsque l'on va appeler une méthode de l'objet, cet appel va vérifier si la méthode existe dans l'objet. Si ce n'est pas le cas, elle va regarder si elle existe dans le prototype du constructeur (puis dans le prototype du prototype, etc...) : c'est ce que l'on appelle la &quot;chaîne de prototype&quot;. C'est comme cela qu'est gérée le fait que plusieurs objets puissent avoir la même méthode. En effet, si tous les objets ont utilisés le même constructeur, le prototype du constructeur sera le même pour tous ces objets. Pour faire de l'héritage, on rajoute tout simplement un prototype à l'endroit voulu dans la chaine de prototype. Il existe d'autres utilisations avancées des prototypes, mais nous ne somme pas la pour ca ...&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;&lt;li&gt; &lt;strong&gt;POO avec les classes :&lt;/strong&gt; La POO avec les classes exclu totalement la notion de prototypes. Les classes sont déclarées en tant que telles : c'est à dire que les classes ne sont pas des fonctions, mais bien des classes à part entière. C'est également dans la déclaration de la classe que nous allons créer un constructeur, les méthodes, les propriétés, etc... Une fois tout cela effectué, la classe peut être instanciée de la même manière, en utilisant l'instruction 'new'. La POO basée sur les classes simplifie également l'héritage, et propose de possibilités supplémentaires que nous verrons plus en détail une peu plus loin dans ce tutoriel.&lt;/ul&gt;img:coupe&lt;br /&gt;
&lt;span style=&quot;font-size:16px&quot;&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;2. Organisation du code en AS2&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Chaque classe créé avec AS2 doit se trouver dans un fichier .as qui porte le même nom que la classe. Vous ne pouvez pas déclarer plusieurs classes dans un même fichier .as et si le nom du fichier est différent de celui de la classe, la classe sera tout simplement &lt;strong&gt;ignorée&lt;/strong&gt; (et donc impossible à instancier).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Flash MX 2004 offre plusieurs moyens d'accéder aux classes situées dans les .as&lt;ol type=&quot;1&quot;&gt;&lt;br /&gt;
&lt;li&gt; Les fichiers .as sont situés dans le même répertoire que le fichier .fla au moment de la compilation.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt; Les fichiers sont situés dans des sous-répertoires de l'emplacement du fichier .fla et il vous faudra utiliser la commande &lt;em&gt;import&lt;/em&gt; dans votre animation pour y accéder. Pour ceux qui connaissent, cela s'aparent au import de Java et au using de C# ... les répertoires deviennent une simulation des &lt;strong&gt;packages&lt;/strong&gt;.&lt;br /&gt;
&lt;li&gt; Les fichiers .as sont dans des repertoires qui ont été rajoutés dans les paramètres de publication d'AS2 : Menu Fichier &gt;&gt; Paramètres de publication ... &gt;&gt; Onglet [Flash] &gt;&gt; Bouton [Paramètres...]. Ces répertoires peuvent également être utilisés comme point de départ pour les instructions &lt;em&gt;import&lt;/em&gt;.&lt;br /&gt;&lt;/li&gt;
&lt;/ol&gt;img:coupe&lt;br /&gt;
&lt;span style=&quot;font-size:16px&quot;&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;3. Portage du code de AS1 vers AS2&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Les &quot;traductions&quot; de code qui vous sont présentées dans cette partie se limitent à offrir exactement les même fonctionnalités en AS1 que dans leur version AS2. Nous aborderons les spécificités de l'AS2 dans les parties suivantes.&lt;br /&gt;
&lt;ol type=&quot;a&quot;&gt;&lt;strong&gt;&lt;li&gt;Déclaration d'une classe&lt;/strong&gt;&lt;br /&gt;
&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Créons une classe en AS1 que l'on va nommer &lt;em&gt;Individu&lt;/em&gt;. Nous allons la créer dans _global, afin qu'elle soit accessible de partout. Conformément à ce que nous explique fred dans son tutoriel, nous allons la déclarer comme suit :&lt;code&gt;_global.Individu = function (nom, prenom, date) {&lt;br /&gt;
   this._nom = nom;&lt;br /&gt;
   this._pre = prenom;&lt;br /&gt;
   this._date = date;&lt;br /&gt;
}&lt;/code&gt;Avec ce code, pour créer un individu, nous allons devoir lui passer un nom, un prénom et une date de naissance. Comme nous en avons l'habitude, le constructeur va s'occuper de créer les propriétés de l'objet.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Pour créer cette même classe en AS2, nous allons utiliser l'instruction 'class' dans un fichier nommé 'Individu.as', et créer son constructeur à l'interieur de la déclaration de classe. Voici ce que cela donne :&lt;code&gt;class Individu {&lt;br /&gt;
   var _nom;&lt;br /&gt;
   var _pre;&lt;br /&gt;
   var _date;&lt;/p&gt;
   &lt;p&gt;function Individu(nom, prenom, date) {&lt;br /&gt;
      _nom = nom;&lt;br /&gt;
      _pre = prenom;&lt;br /&gt;
      _date = date;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/code&gt;Vous remarquerez qu'en AS2, c'est dans la définition de la classe que l'on spécifie quelles sont ses propriétés à l'aide de l'instruction var. La fonction constructeur est une fonction qui porte le même nom que la classe, et elle se content d'assigner les valeurs aux propriétés (mais ne les crée pas). Si l'on n'avait pas déclaré les propriétés, un message d'erreur se serait affiché au moment de la compilation.&lt;br /&gt;
Vous remarquerez également que nous n'avons pas utilisé le sacro-saint &lt;strong&gt;ciblage&lt;/strong&gt;. En effet, il est rarement utilisé dans les langages &quot;classiques&quot;, mais peut l'être lorsqu'il y a ambiguité sur la provenance de la variable. Le &lt;em&gt;this&lt;/em&gt; existe donc toujours, mais est moins utilisé.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/li&gt;&lt;li&gt;Les méthodes&lt;/strong&gt;&lt;br /&gt;
&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Aprés avoir créé notre classe Individu en AS1, nous allons vouloir créer ses méthodes. Pour cela, comme expliqué dans la description de la POO &quot;prototype based&quot;, nous allons rajouter une fonction au prototype du constructeur aprés la création du constructeur :&lt;code&gt;// Creation du constructeur&lt;br /&gt;
_global.Individu = function (nom, prenom, date) {&lt;br /&gt;
   this._nom = nom;&lt;br /&gt;
   this._pre = prenom;&lt;br /&gt;
   this._date = date;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;// Creation de la methode&lt;br /&gt;
Individu.prototype.afficher = function() {&lt;br /&gt;
   trace(&amp;quot;L'individu s'appelle &amp;quot; + this._pre + &amp;quot; &amp;quot; + this._nom + &amp;quot; et est né(e) le &amp;quot; + this._age + &amp;quot; ans.&amp;quot;);&lt;br /&gt;
}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Voyons maintenant comment créer cette méthode dans le cadre d'un déclaration de classe en AS2. Cette méthode va étre écrite &lt;strong&gt;à l'intérieur&lt;/strong&gt; de la déclaration de classe :&lt;code&gt;class Individu {&lt;br /&gt;
   var _nom;&lt;br /&gt;
   var _pre;&lt;br /&gt;
   var _date;&lt;/p&gt;
   &lt;p&gt;// Fonction constructeur&lt;br /&gt;
   function Individu(nom, prenom, date) {&lt;br /&gt;
      _nom = nom;&lt;br /&gt;
      _pre = prenom;&lt;br /&gt;
      _date = date;&lt;br /&gt;
   }&lt;/p&gt;
   &lt;p&gt;// Methode afficher&lt;br /&gt;
   function afficher() {&lt;br /&gt;
      trace(&amp;quot;L'individu s'appelle &amp;quot; + _pre + &amp;quot; &amp;quot; + _nom + &amp;quot; et est né(e) le &amp;quot; + _date + &amp;quot; ans.&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;li&gt;Le addProperty et son remplacant&lt;/strong&gt;&lt;br /&gt;
&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Dans les langages objets standards, les accés aux propriétés se font généralement uniquement au moyen des méthodes. &lt;strong&gt;addProperty&lt;/strong&gt; est une spécificité de Flash, qui permet plus de confort pour accéder aux propriétés d'une classe. Nous pourrions ici créer une propriété &quot;virtuelle&quot;, qui donnerait le sexe de l'individu. Il faut donc créer une méthode qui va retourner le sexe de l'individu. Considérons que pour une raison qui nous est propre, nous voulons stocker le sexe sous la forme d'un chiffre (1 pour les hommes, 2 pour les femmes), mais nous voulons y accéder avec des lettres (M pour les hommes et F pour les femmes). Il nous suffit alors de créer une propriété virtuelle &quot;sexe&quot; :&lt;code&gt;// Creation du constructeur&lt;br /&gt;
_global.Individu = function (nom, prenom, date) {&lt;br /&gt;
   this._nom = nom;&lt;br /&gt;
   this._pre = prenom;&lt;br /&gt;
   this._date = date;&lt;br /&gt;
   this._numSexe = 0;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;// Methode qui retourne le sexe de l'individu&lt;br /&gt;
Individu.prototype.getAlphaSexe = function() {&lt;br /&gt;
   switch(this._numSexe) {&lt;br /&gt;
      case 1 :&lt;br /&gt;
         return &amp;quot;M&amp;quot;;&lt;br /&gt;
      case 2 :&lt;br /&gt;
         return &amp;quot;F&amp;quot;;&lt;br /&gt;
      default :&lt;br /&gt;
         return &amp;quot;Inconnu&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;// Methode qui définit le sexe de l'individu&lt;br /&gt;
Individu.prototype.setAlphaSexe = function(lettre) {&lt;br /&gt;
   switch(lettre.toUpperCase()) {&lt;br /&gt;
      case &amp;quot;M&amp;quot; :&lt;br /&gt;
         this._numSexe = 1;&lt;br /&gt;
         break;&lt;br /&gt;
      case &amp;quot;F&amp;quot; :&lt;br /&gt;
         this._numSexe = 2;&lt;br /&gt;
         break;&lt;br /&gt;
      default :&lt;br /&gt;
         this._numSexe = 0;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;// Ajout de la propriété 'sexe'&lt;br /&gt;
with(Individu.prototype) {&lt;br /&gt;
   addProperty(&amp;quot;sexe&amp;quot;,getAlphaSexe,setAlphaSexe);&lt;br /&gt;
}&lt;/code&gt;Nous avons une propriété &quot;virtuelle&quot; nommée 'sexe', qui va contenir soit &quot;M&quot;, soit &quot;F&quot;, soit &quot;Inconnu&quot; ... alors que notre objet stocke le sexe de l'individu sous la forme 0, 1 ou 2 ...&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Avec AS2, nous allons pouvoir créer des méthodes qui seront considérées directement comme les méthodes get et set d'une propriété &quot;virtuelle&quot;. Il suffit de rajouter le mot-clé 'get' ou 'set' avant le nom de la méthode :&lt;code&gt;class Individu {&lt;br /&gt;
   var _nom;&lt;br /&gt;
   var _pre;&lt;br /&gt;
   var _date;&lt;br /&gt;
   var _sexe=0;&lt;/p&gt;
   &lt;p&gt;// Fonction constructeur&lt;br /&gt;
   function Individu(nom, prenom, date) {&lt;br /&gt;
      _nom = nom;&lt;br /&gt;
      _pre = prenom;&lt;br /&gt;
      _date = date;&lt;br /&gt;
   }&lt;/p&gt;
   &lt;p&gt;// Methode qui retourne le sexe&lt;br /&gt;
   function get sexe() {&lt;br /&gt;
      switch(_numSexe) {&lt;br /&gt;
         case 1 :&lt;br /&gt;
            return &amp;quot;M&amp;quot;;&lt;br /&gt;
         case 2 :&lt;br /&gt;
            return &amp;quot;F&amp;quot;;&lt;br /&gt;
         default :&lt;br /&gt;
            return &amp;quot;Inconnu&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;/p&gt;
   &lt;p&gt;// Methode qui définit le sexe&lt;br /&gt;
   function set sexe(lettre) {&lt;br /&gt;
      switch(lettre.toUpperCase()) {&lt;br /&gt;
         case &amp;quot;M&amp;quot; :&lt;br /&gt;
            _numSexe = 1;&lt;br /&gt;
            break;&lt;br /&gt;
         case &amp;quot;F&amp;quot; :&lt;br /&gt;
            _numSexe = 2;&lt;br /&gt;
            break;&lt;br /&gt;
         default :&lt;br /&gt;
            _numSexe = 0;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/code&gt;Et voila, nous avons effectué exactement la même chose que le code précédent en AS1, c'est à dire que nous pourrons accéder à monIndividu.sexe en utilisant &quot;M&quot; et &quot;F&quot;, sauf que le addProperty n'a plus aucune utilité !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/li&gt;&lt;li&gt; L'héritage&lt;/strong&gt;&lt;br /&gt;
&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; En AS1, l'héritage est assez compliqué à mettre en oeuvre, car soit basé sur la méthode de Macromedia qui est assez discutable en terme d'optimisation et de logique (mais que nous allons utiliser ici par soucis de clarté), soit basé sur du code plus complexe qui exploite la chaîne de prototypes. De plus, étant donné que l'héritage se fait aprés la création du constructeur, les chances de se perdre dans le code sont assez importantes. Nous allons voir ici que l'héritage en AS2 est devenu simplissime.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; En AS1, pour créer une classe Membre (avec login et mot de passe), qui va hériter de la classe Individu, nous allons écrire un code qui va ressembler à ca :&lt;code&gt;// Constucteur de la classe Individu&lt;br /&gt;
_global.Individu = function(nom, prenom, date) {&lt;br /&gt;
   this._nom = nom;&lt;br /&gt;
   this._pre = prenom;&lt;br /&gt;
   this._date = date;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;// Constructeur de la classe Membre&lt;br /&gt;
_global.Membre = function(nom, prenom, date, login, pass) {&lt;br /&gt;
   // On appelle le constructeur de la classe mere&lt;br /&gt;
   super(nom, prenom, date);&lt;br /&gt;
   this._login = login;&lt;br /&gt;
   this._pass = pass;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;// On fait heriter Membre de Individu&lt;br /&gt;
Membre.prototype = new Individu();&lt;/code&gt;Les instances de la classe Membre héritent ainsi des propriétés/méthodes de la classe Individu, plus celles propres à la classe Membre.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; En AS2, l'héritage se fait le plus simplement du monde en utilisant aprés le nom de la classe l'instruction 'extends' suivi de la classe mère. N'oubliez pas que les deux classes sont dans deux fichiers différents !!!&lt;code&gt;// ===== Individu.as =====&lt;/p&gt;
&lt;p&gt;// Declaration de la classe Individu&lt;br /&gt;
class Individu {&lt;br /&gt;
   var _nom;&lt;br /&gt;
   var _pre;&lt;br /&gt;
   var _date;&lt;/p&gt;
   &lt;p&gt;// Fonction constructeur&lt;br /&gt;
   function Individu(nom, prenom, date) {&lt;br /&gt;
      _nom = nom;&lt;br /&gt;
      _pre = prenom;&lt;br /&gt;
      _date = date;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;// ===== Membre.as =====&lt;br /&gt;
class Membre extends Individu {&lt;br /&gt;
   var _login;&lt;br /&gt;
   var _pass;&lt;/p&gt;
   &lt;p&gt;function Membre(nom, prenom, date, login, pass) {&lt;br /&gt;
      super(nom, prenom, date);&lt;br /&gt;
      _login = login;&lt;br /&gt;
      _pass = pass;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/code&gt;Et voila, difficile de faire plus simple !!! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_cool.gif&quot; alt=&quot;8)&quot; class=&quot;smiley&quot; /&gt;&lt;br /&gt;
&lt;/ol&gt;img:coupe&lt;br /&gt;
&lt;span style=&quot;font-size:16px&quot;&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;4. De nouvelles habitudes avec AS2&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; ActionScript 2 introduit des nouveautés qui n'étaient pas accessibles avec AS1, ou alors cela necessitait du code souvent lourd et trés complexe. Ces fonctionnalités deviennent quasi-obligatoires à partir du moment où l'on veut développer un code clair et rigoureux, et se doivent donc d'être utilisées dorénavant. Les exemples donnés uniquement à titre indicatif dans le paragraphe précédent ne les intégrant pas, il ne doit pas être utilisé tel quel. Voici les nouveaux concepts importants d'AS2 :&lt;ol type=&quot;a&quot;&gt;&lt;strong&gt;&lt;li&gt;Le typage &quot;fort&quot;&lt;/strong&gt;&lt;br /&gt;
 &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Le typage fort consiste à donner un type à une variable, et à lui interdire de contenir un type différent que celui qui lui a été imposé. Précédemment, il était tout à fait possible d'assigner un nombre dans une variable, puis à la ligne suivante de lui assigner une chaîne de caractères. Ce qui fait que lire un code oublié, ou fait par quelqu'un d'autre devient assez difficile s'il ne contient pas les typages ...&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Concrétement, AS2 permet de typer les variables, les paramètres des méthodes, et la valeur de retour des méthodes. C Le typage se fait en mettant deux points ( : ) aprés la déclaration de la variable, suivi de la classe qui indique le type de la variable. Pour les valeurs retournées par les méthodes, les deux points se mettent aprés la parenthèse de fermeture des arguments. Reprenons la classe Individu créée précédemment :&lt;code&gt;class Individu {&lt;br /&gt;
   // La déclaration des propriétés se fait avec le typage&lt;br /&gt;
   var _nom : String ;&lt;br /&gt;
   var _pre : String;&lt;br /&gt;
   var _date : String;&lt;br /&gt;
   var _numSexe : Number = 0;&lt;/p&gt;
   &lt;p&gt;// Constructeur avec typage des arguments&lt;br /&gt;
   function Individu(nom:String, prenom:String, date:String) {&lt;br /&gt;
      _nom = nom;&lt;br /&gt;
      _pre = prenom;&lt;br /&gt;
      _date = date;&lt;br /&gt;
   }&lt;/p&gt;
   &lt;p&gt;// Methode qui renvoie le sexe avec typage de la valeur de retour&lt;br /&gt;
   function get sexe():String {&lt;br /&gt;
      switch(_numSexe) {&lt;br /&gt;
         case 1 :&lt;br /&gt;
            return &amp;quot;M&amp;quot;;&lt;br /&gt;
         case 2 :&lt;br /&gt;
            return &amp;quot;F&amp;quot;;&lt;br /&gt;
         default :&lt;br /&gt;
            return &amp;quot;Inconnu&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;/p&gt;
   &lt;p&gt;// Le reste du code suit la meme logique ...&lt;/p&gt;
&lt;p&gt;}&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;&lt;/li&gt;&lt;li&gt;Les propriétés et méthodes publiques et privées&lt;/strong&gt;&lt;br /&gt;
 &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Les propriétés et méthodes d'une classe n'ont pas toutes besoins d'être accédées depuis l'extérieur de l'objet. Cela peut parfois être dangeureux d'accéder directement à une propriété, car certaines instructions peuvent ne pas être executées. AS2 offre la possibilité d'empecher l'accés de l'extérieur à certaines propriétés ou méthodes. Ainsi, seules les méthodes de l'objet peuvent accéder à ces dernières.&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_exclam.gif&quot; alt=&quot;:!:&quot; class=&quot;smiley&quot; /&gt; Ce concept est trés important, car c'est lui qui garantit l'encapsulation de vos données, ainsi que leur intégrité, surtout lors de développements en travail collaboratif, ou chacun peut-être amené à utiliser les classes d'un autre.&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Concrétement, toute propriété/méthode qui ne spécifie pas son &quot;accessibilité&quot; est considérée implicitement comme étant publique. Il est quand même préférable d'éviter ce qui est implicite, est de spécifier clairement ce qui est public et ce qui est privé, excepté pour le constructeur qui est toujours public. Pour cela, on utilise les mots clés 'public' ou 'private'avant la déclaration de la porpriété ou de la méthode. Reprenons notre classe Individu :&lt;code&gt;class Individu {&lt;br /&gt;
   // nom, prenom et date sont accessibles&lt;br /&gt;
   public var _nom : String;&lt;br /&gt;
   public var _pre : String;&lt;br /&gt;
   public var _date : String;&lt;/p&gt;
   &lt;p&gt;// le sexe en numerique ne peut pas être accédé de l'exterieur&lt;br /&gt;
   // On utilisera plutot les methodes get et set ...&lt;br /&gt;
   private var _numSexe : Number;&lt;/p&gt;
   &lt;p&gt;// Pas besoin de déclaration explicite pour le constructeur&lt;br /&gt;
   function Individu(nom:String, prenom:String, date:String) {&lt;br /&gt;
      _nom = nom;&lt;br /&gt;
      _pre = prenom;&lt;br /&gt;
      _date = date;&lt;br /&gt;
   }&lt;/p&gt;
   &lt;p&gt;// On peut aussi créer des méthodes privées&lt;br /&gt;
   private function maMethodePrivee():Number {&lt;br /&gt;
      // Cette méthode ne peut être utilisée que par une autre&lt;br /&gt;
      // méthode du même objet&lt;br /&gt;
      // ....&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;li&gt; Les propriétés et méthodes statiques&lt;/strong&gt;&lt;br /&gt;
 &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; Les propriétés et méthodes statiques sont partagées par toutes les instances d'un même classe. Il n'est même pas nécessaire d'avoir une instance de cette classe pour y accéder. On utilise alors la syntaxe nomDeLaClasse.nomDeLaProp ...&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Les méthodes/propriétés statiques sont déclarées au moyen du mot-clé static, situé aprés la déclaration public/private, et avant l'instruction var/function ... Si la déclaration d'un propriété statique est accompagné d'une assignation de valeur, cette assignation n'est executée qu'une fois, au moment de la déclaration de la classe (et non pas à son instanciation).&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Une utilisation fréquente des propriétés statiques peut être de compter le nombre d'individus :&lt;code&gt;class Individu {&lt;br /&gt;
   // Propriétés contenant le nombre total d'individus&lt;br /&gt;
   // Elle est mise à zéro la première fois&lt;br /&gt;
   public static nbIndividu:Number = 0;&lt;/p&gt;
   &lt;p&gt;// Propriétés non statiques&lt;br /&gt;
   public var _nom : String;&lt;br /&gt;
   public var _pre : String;&lt;br /&gt;
   public var _date : String;&lt;br /&gt;
   private var _numSexe : Number;&lt;/p&gt;
   &lt;p&gt;// Constructeur de la classe&lt;br /&gt;
   function Individu(nom:String, prenom:String, date:String) {&lt;br /&gt;
      _nom = nom;&lt;br /&gt;
      _pre = prenom;&lt;br /&gt;
      _date = date;&lt;br /&gt;
      // A la création d'un individu, on augmente la propriété statique de 1&lt;br /&gt;
      nbIndividu++;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
On pourra alors accéder à cette propriété soit en appelant &lt;em&gt;nbIndividus&lt;/em&gt; depuis l'intérieur d'un méthode (comme cela est fait dans le constructeur, soit en tapant :&lt;code&gt;trace(&amp;quot;Nombre d'individus créés : &amp;quot; + Individu.nbIndividus);&lt;/code&gt;Dans ce cas précis, le problème est que nous ne pouvons pas réduire le nombre d'individus quand un individu est supprimé, et cela parce qu'il n'est pas possible de créer un &lt;strong&gt;destructeur&lt;/strong&gt; en AS2 ...&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;&lt;/li&gt;&lt;li&gt;Les interfaces&lt;/strong&gt;&lt;br /&gt;
 &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; Comme expliqué dans le tutoriel sur les concepts de la POO, les interface sont un peu similaires à des classes, sauf que l'on ne peut pas créer d'instance d'un interface, et que les méthoeds ne contiennent pas de code. Elle sont en fait un &quot;contrat&quot;, que les classes qui en découlent devront impérativement remplir. Les avantanges des interfaces sont importants lorsqu'il s'agit de travailler en équipe, ou constituent tout simplement une aide à la compilation, afin d'être sur que certaines classes ont été correctement implémentées. Si dans une classe dérivée d'une interface, il manque une méthode de l'interface, le compilateur va signaler une erreur. De la même manière, si la méthode de la classe et celle de l'interface n'ont pas la même signature (nombre et type des arguments + type du retour), le compilateur va également signaler une erreur ...&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Un autre aspect des interfaces est que l'on peut créer une classe à partir de plusieurs interfaces. Cela permet de s'assurer que la classe va bien avoir les fonctionnalités qui sont décrites dans les interfaces ...&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; On ne peut pas tout faire dans une interface AS2 :&lt;ul&gt;&lt;br /&gt;
&lt;li&gt; On ne peut pas déclarer de propriétés&lt;br /&gt;&lt;/li&gt;
&lt;li&gt; On ne peut déclarer que des méthodes publiques&lt;br /&gt;
&lt;li&gt; On ne peut déclarer de méthodes statiques&lt;br /&gt;&lt;/li&gt;
&lt;li&gt; Une interface ne contient pas de constructeur&lt;br /&gt;
&lt;li&gt; Une interface ne peut pas implémenter une autre interface&lt;br /&gt;&lt;/li&gt;
&lt;li&gt; Une interface ne peut pas hériter d'une classe&lt;/ul&gt;&lt;br /&gt;
 &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Pour déclarer une interface, on utilise la même syntaxe que pour les classes, sauf que l'on utilise le mot clé interface au lieu de class. Pour dériver une classe d'un interface, on utilise l'instruction implements aprés l'instruction d'héritage. Ensuite, on donne la liste des interfaces implémentées par la classe, separées par des virgules. Concrétement, voici un exemple de deux interfaces (toujours chacune dans un fichier .as différent) et d'un classe qui les implémente. On veut que l'individu soit un humain (il doit donc savoir parler et marcher par exemple), et l'on veut aussi qu'il soit un coureur (il doit donc savoir courir) :&lt;code&gt;// ===== Humain.as ====&lt;br /&gt;
interface Humain {&lt;br /&gt;
   public marcher(nbPas:Number);&lt;br /&gt;
   public parler(sujet:String):String;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;// ===== Coureur.as =====&lt;br /&gt;
interface Coureur {&lt;br /&gt;
   public courir(distance:Number);&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;// ===== Individu.as =====&lt;br /&gt;
class Individu implements Humain, Coureur {&lt;br /&gt;
   // Declaration des propriétés&lt;br /&gt;
   var _nom:String;&lt;br /&gt;
   var _pre:String;&lt;br /&gt;
   var _date:String&lt;/p&gt;
   &lt;p&gt;// Constructeur de la classe&lt;br /&gt;
   function Individu (nom:String, prenom:String, date:String) {&lt;br /&gt;
      // Code du constructeur&lt;br /&gt;
   }&lt;/p&gt;
   &lt;p&gt;// On écrit le code des méthodes décrites par les interfaces&lt;br /&gt;
   // Interface Humain&lt;br /&gt;
   public function marcher(nbPas:Number) {&lt;br /&gt;
      // Instructions pour faire marcher l'individu&lt;br /&gt;
   }&lt;/p&gt;
   &lt;p&gt;public function parler(sujet:String):String {&lt;br /&gt;
      // Instructions pour faire parler l'individu&lt;br /&gt;
      // sur un sujet donné. La phrase qu'il doit prononcer&lt;br /&gt;
      // est retournée par la méthode&lt;br /&gt;
   }&lt;/p&gt;
   &lt;p&gt;// Interface Coureur&lt;br /&gt;
   public function courir(distance:Number) {&lt;br /&gt;
      // Instruction pour faire courir l'individu&lt;br /&gt;
      // sur une distance donnée&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/code&gt;Dans ce cas précis, si l'on avait pas créé les méthodes marcher, parler et courir, ou si l'on avait créé des méthodes qui possédaient une signature différente de celles données dans les interfaces, le compilateur aurait signalé une erreur.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;li&gt;Les classes &quot;dynamiques&quot;&lt;/strong&gt;&lt;br /&gt;
 &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Comme cela a été dit dans la partie sur les déclarations de classes, il faut déclarer les propriétés d'une classe. Seulement, il peut arriver que l'on ai besoin de rajouter une propriété dans un objet, sans qu'elle ai forcément été déclarée avec la classe. Il faut alors autoriser ce type d'action au moment de la déclaration de la classe, au moyen du mot clé dynamic, situé devant le mot clé class.&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Voici un exemple de script qui génère une erreur, et le même script avec une classe dynamique qui ne génère pas d'erreur :&lt;code&gt;// Le constructeur va provoquer une erreur de compilation&lt;br /&gt;
class Individu {&lt;br /&gt;
   var _nom:String;&lt;br /&gt;
   var _pre:String;&lt;br /&gt;
   var _age:Number;&lt;/p&gt;
   &lt;p&gt;function Individu(nom:String, prenom:String, age:Number) {&lt;br /&gt;
      _nom = nom;&lt;br /&gt;
      _pre = prenom;&lt;br /&gt;
      _age = age;&lt;/p&gt;
      &lt;p&gt;// La propriété _statut n'a pas été déclarée&lt;br /&gt;
      // La compilation va retourner une erreur&lt;br /&gt;
      if (age &amp;lt; 18) {&lt;br /&gt;
         _statut = &amp;quot;mineur&amp;quot;;&lt;br /&gt;
      } else {&lt;br /&gt;
         _statut = &amp;quot;majeur&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;// La classe etant dynamique, le contructeur ne provoque pas d'erreur&lt;br /&gt;
dynamic class Individu {&lt;br /&gt;
   var _nom:String;&lt;br /&gt;
   var _pre:String;&lt;br /&gt;
   var _age:Number;&lt;/p&gt;
   &lt;p&gt;function Individu(nom:String, prenom:String, age:Number) {&lt;br /&gt;
      _nom = nom;&lt;br /&gt;
      _pre = prenom;&lt;br /&gt;
      _age = age;&lt;/p&gt;
      &lt;p&gt;// La propriété _statut n'a pas été déclarée&lt;br /&gt;
      // mais la classe est dynamique, donc pas d'erreur&lt;br /&gt;
      if (age &amp;lt; 18) {&lt;br /&gt;
         _statut = &amp;quot;mineur&amp;quot;;&lt;br /&gt;
      } else {&lt;br /&gt;
         _statut = &amp;quot;majeur&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;/code&gt;Les propriétés ainsi créées &quot;a la volée&quot; sont automatiquement publiques.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;
img:coupe&lt;br /&gt;
&lt;span style=&quot;font-size:16px&quot;&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;5. Conclusion&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
 &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Comme vous l'avez sûrement constaté, ActionScript 2 apporte non seulement une lisibilité et une organisation bien plus grande de votre code et en facilité grandement la réutilisation.&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Mais en plus de cela, ses possibilités résolument proche des langages objets standards tels que Java ou C# vous permettent aussi de créer un code plus robuste, qui s'il est bien fait, limite énormément les possibilités d'erreur à l'utilisation des classes que vous avez crées : une fois une classe créée et débuguée en AS2, vous pouvez la réutiliser à volonté, sans vous poser la question de savoir ou se situe l'erreur : elle est dans l'utilisation des classes, et non pas dans le code des classes ...&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; La facilité d'utilisation de l'héritage est un des gros points forts de l'AS2. Pensez-y avant de modifier une classe que vous avez déjà développé : étendez la plutôt au moyen d'une autre classe qui en hérite ...&lt;/p&gt;
&lt;p&gt;img:coupe img:remarque &lt;strong&gt;msg:tut&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:16px&quot;&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;FAQ&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
Cette FAQ sera mise à jour au fur et à mesure des questions sur le forum&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Que sont devenus mes prototypes ? Puis-je encore les utiliser ?&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;Oui ... et non&lt;/em&gt;. Les prototypes tels qu'ils sont utilisés couramment (rajouter des fonctionnalités à une classe deja existante) sont toujours disponibles, car AS2 est compatibles avec les objets créés en AS1, ainsi qu'avec les prototypes. Seulement, la nouvelle manière de programmer introduite par AS2 devrait plus vous pousser à faire de l'héritage, c'est-à-dire créer vos propres classes à partir des classes existantes pour y ajouter vos propres fonctionnalités, plutôt que de rajouter vos fonctionnalités à la classe existante. Si ce n'est pas évident pour les classes &quot;visuelles&quot; (MovieClip, TextField, etc...), ca l'est beaucoup plus pour les autres...&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dois-je recoder toutes mes classes faites avec AS1 ?&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;Non, mais c'est conseillé&lt;/em&gt;. En effet, comme dit plus haut, les classes AS1 sont compatibles avec les classes AS2. Seulement, la lisibilité du code risque d'en pâtir fortement. Autant uniformiser votre code le plus possible.&lt;br /&gt;
&lt;li&gt;&lt;strong&gt;Ne serait-ce pas plus pratique de ne faire que des classes dynamiques ?&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;Absolument pas&lt;/em&gt;. Le but de la déclaration des propriétés est d'être sûr de ne pas surcharger un objet qui n'en a pas besoin. Ne faire que des classes dynamiques reviendrait à refaire de l'AS1, sans aucun contrôle sur les classes.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comment faire pour pouvoir passer n'importe quel type d'objet à une méthode avec le typage fort ?&lt;/strong&gt;&lt;br /&gt;
Il suffit de faire le typage avec Object. En fait, le typage vérifie si l'argument passé est bien du type demandé &lt;strong&gt;ou s'il hérite de ce type&lt;/strong&gt;.&lt;br /&gt;
&lt;/ul&gt;&lt;/quote&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.lalex.com/post/2003/09/12/Flash-MX-2004-%3A-dActionsScript-1-ActionScript-2#comment-form</comments>
      <wfw:comment>http://blog.lalex.com/post/2003/09/12/Flash-MX-2004-%3A-dActionsScript-1-ActionScript-2#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.lalex.com/feed/atom/comments/94</wfw:commentRss>
      </item>
    
  <item>
    <title>Interceptions d'erreurs avec Flash MX 2004</title>
    <link>http://blog.lalex.com/post/2003/09/12/Interceptions-derreurs-avec-Flash-MX-2004</link>
    <guid isPermaLink="false">urn:md5:c51e6822c6cef017ae74c5fd5184ff46</guid>
    <pubDate>Fri, 12 Sep 2003 16:14:55 +0000</pubDate>
    <dc:creator>-Alexandre LEGOUT aka LAlex-</dc:creator>
        <category>Articles</category>
            
    <description>    &lt;p&gt;Toujours pour &lt;a href=&quot;http://www.flash-forum.net/&quot;&gt;Flash Forum&lt;/a&gt;, j'ai rédigé un tutoriel sur la manière d'intercepter les erreurs et de créer ses propres erreurs avec le nouveau Flash MX 2004&lt;/p&gt;
&lt;p&gt;On constate alors que les instructions pour emettre ou intercepter une erreur envoient en fait des instances de la classe &lt;em&gt;Error&lt;/em&gt; ou d'une classe qui en hérite. Mais en fait, il n'existe aucune contrainte en ce qui concerne le type d'objet envoyé ou receptionné par ces instructions. On peut alors apparenter ce système avec la programmation évenementielle. De la a y voir d'autres applications, il n'y a qu'un pas ...&lt;/p&gt;
&lt;p&gt;&lt;quote&gt;&lt;span style=&quot;font-size:18px&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color:darkred&quot;&gt;Interception d'erreurs dans Flash MX 2004&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Auteur :&lt;/strong&gt; LAlex&lt;br /&gt;
&lt;strong&gt;Mail :&lt;/strong&gt; &lt;a href=&quot;mailto:lalex@flash-forum.net&quot;&gt;lalex@flash-forum.net&lt;/a&gt;	&lt;br /&gt;
&lt;strong&gt;URL :&lt;/strong&gt; &lt;a href=&quot;http://www.flash-forum.net&quot;&gt;http://www.flash-forum.net&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Date de création :&lt;/strong&gt; 20/09/2003&lt;br /&gt;
&lt;strong&gt;Version :&lt;/strong&gt; Flash MX 2004&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:14px&quot;&gt;&lt;strong&gt;Présentation&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
 &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; ActionScript 2.0 nous permet maintenant d'intercepter une erreur qui aurait pu se produire durant une portion de code, voire même de créer nos propres erreurs, et de réagir différemment selon le type d'erreur. Nous allons ici voir comment s'en servir.&lt;/p&gt;
&lt;p&gt;img:coupe&lt;br /&gt;
&lt;span style=&quot;font-size:16px&quot;&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;1. Intercepter une erreur&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Les instructions pour intercepter une erreur sont try, catch et finally. Ces instructions sont utilisées avec des groupes de codes entre accolades { et }, comme on le fait avec les boucles ou les fonctions : &lt;ul&gt;&lt;li&gt;&lt;strong&gt;try&lt;/strong&gt; permet de commencer un portion de code dans laquelle on va pouvoir intercepter une erreur.&lt;br /&gt;&lt;/li&gt;
 &lt;li&gt;&lt;strong&gt;catch&lt;/strong&gt; commence une portion de code qui va être executée si une erreur est interceptée dans la portion &lt;em&gt;try&lt;/em&gt; qui la précède. &lt;em&gt;catch&lt;/em&gt; fonctionne un peu comme un evenement, c'est-à-dire qu'elle prend un argument qui est de type &lt;em&gt;Error&lt;/em&gt;.&lt;br /&gt;
 &lt;li&gt;&lt;strong&gt;finally&lt;/strong&gt; commence une portion de code qui sera executée quoi qu'il arrive, qu'une erreur soit interceptée ou pas, même si la portion try possède un return, alros que normalement toutes les instructions appellées aprés avoir effectué un return ne sont pas executées.&lt;/li&gt;&lt;/ul&gt; &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Un bloc &lt;em&gt;try&lt;/em&gt; doit être suivi de au moins un bloc &lt;em&gt;catch&lt;/em&gt; ou un bloc &lt;em&gt;finally&lt;/em&gt;.&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; La classe &lt;strong&gt;&lt;em&gt;Error&lt;/em&gt;&lt;/strong&gt; contient un constructeur, deux propriétés et une méthode:&lt;ul&gt;&lt;li&gt;Error( [message] ) : le &lt;strong&gt;constructeur&lt;/strong&gt; prend en paramètre (optionnel) le message d'erreur.&lt;br /&gt;&lt;/li&gt;
 &lt;li&gt;Error.message : spécifie le message d'erreur, le plus souvent destiné à être affiché.&lt;br /&gt;
 &lt;li&gt;Error.name : Le nom de l'erreur. Ce nom peut servir d'identifiant&lt;br /&gt;&lt;/li&gt;
 &lt;li&gt;Error.toString() : Methode qui retourne une représentation de l'erreur sous forme de chaîne de caractères.&lt;/ul&gt; &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Voyons un exemple classique d'interception d'erreur dans le cadre d'un entretien d'embauche :&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// On commence a surveiller les erreurs&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;try&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;candidat = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; Individu&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;DURAND&amp;quot;&lt;/span&gt;,&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Pierre&amp;quot;&lt;/span&gt;,&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;18/06/1987&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;candidat.&lt;span style=&quot;color: #006600;&quot;&gt;getPermisDeConduire&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;candidat.&lt;span style=&quot;color: #006600;&quot;&gt;getCurriculum&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Les autres instructions a effectuer&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// pour l'entretien&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;catch&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;catchedError : &lt;span style=&quot;color: #0066CC;&quot;&gt;Error&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Si une erreur se produit, elle est tranmise à catch&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// dans le parametre catchedError&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;catchedError.&lt;span style=&quot;color: #0066CC;&quot;&gt;toString&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;candidat.&lt;span style=&quot;color: #006600;&quot;&gt;allerALaPorte&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;finally&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Quoi qu'il arrive, on supprime le candidat&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// a la fin de l'entretien&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;delete&lt;/span&gt; postulant;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;Ici, quand on demande son permis de conduire au candidat, comme il est mineur il n'en a pas, et déclenche donc une erreur. Cette erreur est envoyé comme paramètre à l'instruction &lt;em&gt;catch&lt;/em&gt;.
img:coupe
&lt;span style=&quot;font-size:16px&quot;&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;2. Provoquer une erreur&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;
 &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Il est fréquent que dans la méthode d'une de nos classes, on puisse dire au code qui utilise cette classe que quelque chose s'est mal passé. Nous allons donc &quot;diffuser une erreur&quot;, au moyen de l'instruction &lt;strong&gt;throw&lt;/strong&gt;. Cette instruction &quot;emet&quot; une erreur qui lui est fournie juste aprés.
 &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Si une instruction &lt;em&gt;throw&lt;/em&gt; n'est pas interceptée par un &lt;em&gt;catch&lt;/em&gt;, elle se contente d'afficher l'erreur dans la fenêtre de sortie (comme un &lt;em&gt;trace&lt;/em&gt; en fait).
 &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Voyons comment nous pouvons emmettre une erreur personnalisée lorsqu'un candidat n'est pas majeur :&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// On crée une fonction qui va vérifier si le candidat est majeur&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// S'il ne l'est pas, on emet une erreur avec un message personalisé&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; verifierMajorite&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;c:Individu&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;c.&lt;span style=&quot;color: #006600;&quot;&gt;age&lt;/span&gt; &amp;lt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;18&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0066CC;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;Error&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Ce candidat n'est pas majeur !&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// On déclare notre candidat&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; candidat:Individu;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// On commence a surveiller les erreurs&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;try&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;candidat = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; Individu&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;DURAND&amp;quot;&lt;/span&gt;,&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Pierre&amp;quot;&lt;/span&gt;,&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;18/06/1987&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;verifierMajorite&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;candidat&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// La suite de l'entretien&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;catch&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;catchedError : &lt;span style=&quot;color: #0066CC;&quot;&gt;Error&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// S'il y a erreur, on affiche le message&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;catchedError.&lt;span style=&quot;color: #0066CC;&quot;&gt;message&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;
img:coupe
&lt;span style=&quot;font-size:16px&quot;&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;3. Réagir selon le type d'erreur&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;
 &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Les instruction try ... catch permettent également de réagir différemment selon le type d'erreur qui survient. Cela est possible grâce aux possibilités de typage fort d'ActionScript 2, en créant plusieurs blocs d'instructions catch qui vont attendre chacun un type d'erreur différent. Cela va nécessiter également de créer des classes qui héritent de la classe Error, et vont posséder leurs propres spécificités.
 &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Nous allons ici créer plusieurs classes d'erreurs. Une sera utilisée si le candidat n'st pas majeur, l'autre si le candidat n'a pas d'expérience. Toutes ces classes vont hériter de la classe Error. Les classes sont bien entendus dans des fichiers .as différents. Pour plus d'infos sur les classes AS2 et l'héritage, voir le tuto &lt;em&gt;[tuto de AS1 à AS2]&lt;/em&gt;&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// ===== ErreurTropJeune.as ====&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; ErreurTropJeune &lt;span style=&quot;color: #0066CC;&quot;&gt;extends&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;Error&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;message&lt;/span&gt;:&lt;span style=&quot;color: #0066CC;&quot;&gt;String&lt;/span&gt; = &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Ce candidat est trop jeune&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// ===== ErreurTropNovice.as =====&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; ErreurTropNovice &lt;span style=&quot;color: #0066CC;&quot;&gt;extends&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;Error&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;message&lt;/span&gt;:&lt;span style=&quot;color: #0066CC;&quot;&gt;String&lt;/span&gt; = &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Ce candidat n'a pas assez d'experience&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// ===== Animation principale =====&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Function qui verifie si le candidat est majeur&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Si ce n'est pas le cas, diffuse l'erreur personalisée&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; verifierMajorite&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;c:Individu&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;c.&lt;span style=&quot;color: #006600;&quot;&gt;age&lt;/span&gt; &amp;lt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;18&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0066CC;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; ErreurTropJeune&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Function qui vérifie si le candidat est suffisemment expérimenté&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Si ce n'est pas le cas, diffuse l'erreur personnalisée&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; verifierExperience&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;c:Individu&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;c.&lt;span style=&quot;color: #006600;&quot;&gt;experience&lt;/span&gt; &amp;lt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0066CC;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; ErreurTropNovice&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// On déclare notre candidat&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; candidat:Individu;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// On commence a surveiller les erreurs&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #0066CC;&quot;&gt;try&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;candidat = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; Individu&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;DURAND&amp;quot;&lt;/span&gt;,&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Pierre&amp;quot;&lt;/span&gt;,&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;18/06/1987&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;verifierMajorite&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;candidat&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;verifierExperience&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;candidat&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// La suite de l'entretien&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;catch&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;catchedError : ErreurTropJeune&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// S'il est trop jeune, on lui fait quitter le bureau&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;candidat.&lt;span style=&quot;color: #006600;&quot;&gt;allerVersLaPorte&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;catch&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;catchedError : ErreurTropNovice&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// S'il manque d'expérience, on le forme&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;candidat.&lt;span style=&quot;color: #006600;&quot;&gt;allerEnFormation&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;finally&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Quoi qu'il arrive, on arrete l'entretien&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;delete&lt;/span&gt; candidat;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
img:coupe&lt;br /&gt;
&lt;span style=&quot;font-size:16px&quot;&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;4. Conclusion&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Aprés avoir vu de quoi il en retourne, à quoi sert la gestion des erreurs ? Tout simplement à savoir quand quelque chose ne va pas ... On pourrais faire une vague comparaison avec le programmation évenementielle, sauf que normalement ca ne se déclenche que quand quelque chose ne va pas ... On peut ainsi intercepter les erreurs qui interviennent dans une classe que l'on ne connaît pas, ou un composant compilé, sur lequel on ne peut pas intervenir au niveau du code source.&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; En poussant la chose un peu plus loin, on constate que l'instruction &lt;em&gt;throw&lt;/em&gt; peut envoyer autre chose que des messages d'erreurs, et qu'en utilisant le typage avec l'instruction &lt;em&gt;catch&lt;/em&gt;, on peut recevoir n'importe quel type d'objet. A partir de la, il est facile de trouver des utilisations diverses, qui n'ont même rien à voir avec une interception d'erreur ... &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;img:coupe&lt;br /&gt;
img:remarque &lt;strong&gt;msg:tut&lt;/strong&gt;&lt;/quote&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.lalex.com/post/2003/09/12/Interceptions-derreurs-avec-Flash-MX-2004#comment-form</comments>
      <wfw:comment>http://blog.lalex.com/post/2003/09/12/Interceptions-derreurs-avec-Flash-MX-2004#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.lalex.com/feed/atom/comments/93</wfw:commentRss>
      </item>
    
  <item>
    <title>Article sur les bases de la POO</title>
    <link>http://blog.lalex.com/post/2003/09/01/Article-sur-les-bases-de-la-POO</link>
    <guid isPermaLink="false">urn:md5:0ebe989911dc3ea90deb9d447e10efb1</guid>
    <pubDate>Mon, 01 Sep 2003 12:08:46 +0000</pubDate>
    <dc:creator>-Alexandre LEGOUT aka LAlex-</dc:creator>
        <category>Articles</category>
            
    <description>    &lt;p&gt;Voici de l'article que j'ai rédigé pour &lt;a href=&quot;http://www.flash-forum.net/&quot;&gt;Flash Forum&lt;/a&gt; concernant les concepts de base de la Programmation Orientée Objet, mis à la portée des programmeurs intermédiaires qui veulent se mettre à la POO.&lt;/p&gt;
&lt;p&gt;Cet article aborde le POO d'un point de vue générique, sans aucune implémentation dédiée à un langage particulier. Bien évidemment, les lecteurs principaux seront des programmeurs Flash, qui pourront mettre ces concepts en application avec ActionScript.&lt;/p&gt;
&lt;p&gt;&lt;quote&gt;&lt;span style=&quot;font-size:18px&quot;&gt;&lt;strong&gt;&lt;span style=&quot;color:darkred&quot;&gt;La programmation Orientée Objet (POO)&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Auteur :&lt;/strong&gt; LAlex&lt;br /&gt;
&lt;strong&gt;Mail :&lt;/strong&gt; &lt;a href=&quot;mailto:lalex@flash-forum.net&quot;&gt;lalex@flash-forum.net&lt;/a&gt;	&lt;br /&gt;
&lt;strong&gt;URL :&lt;/strong&gt; &lt;a href=&quot;http://www.flash-forum.net&quot;&gt;http://www.flash-forum.net&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Date de création :&lt;/strong&gt; 31/07/2003&lt;br /&gt;
&lt;strong&gt;Version :&lt;/strong&gt; Flash 5 / MX&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:14px&quot;&gt;&lt;strong&gt;Présentation&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; De plus en plus dans le cadre de la programmation en Flash, on entend parler de POO, soit la Programmation Orientée Objet. Pour beaucoup de débutants ou de non programmeurs, ce terme est assez abstrait. Ce tutoriel se propose de vous décrire le pourquoi de la programmation objet, ainsi que ses bases et règles qui lui sont propres.&lt;br /&gt;
 &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; Ce tutoriel comporte uniquement les bases théoriques de la POO, et ne contient pas de code. Des mises en pratiques seront faites dans d'autres tutoriaux, afin de clarifier chaque aspect distinct de la POO.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size:16px&quot;&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;1. Principe de la POO&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Le but de la programmation Objet est de se rapprocher le plus possible d'une représentation de la réalité en programmation, en considérant que tout objet peut être classé dans une catégorie qui a ses caractéristiques et ses possibilités propres. En effet, tout objet qui nous entoure peut être &quot;classé&quot; dans une categorie qui fait elle-même partie d'autres catégories.&lt;br /&gt;
&lt;ul&gt;&lt;img src=&quot;http://blog.lalex.com/post/2003/09/01/&lt;a href=&quot;http://www.flash-forum.net/imgtut/poo/categories.gif&quot;&gt;http://www.flash-forum.net/imgtut/poo/categories.gif&lt;/a&gt;&quot; border=&quot;0&quot; align=&quot;center&quot;/&gt;&lt;/ul&gt;&lt;br /&gt;
Dans l'exemple précédent, votre mobile fait partie de la catégorie &quot;Téléphone portable&quot;, qui elle-même fait partie de la catégorie &quot;Téléphone&quot;, faisant partie de la catégorie &quot;Outil de communication téléphonique&quot;, faisant partie de la catégorie &quot;Outils de communication&quot;, etc.... Tandis qu'un fax est &quot;Outil de communication téléphonique&quot;, mais pas un &quot;Téléphone&quot; et encore moins un &quot;Téléphone portable&quot;.&lt;/p&gt;
&lt;p&gt;img:coupe&lt;br /&gt;
&lt;span style=&quot;font-size:16px&quot;&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;2. Vocabulaire&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;br /&gt;
&lt;li&gt;&lt;strong&gt;Classe&lt;/strong&gt; : On appellera &quot;classe&quot; ce qui est nommé plus haut comme étant une &quot;catégorie&quot;. Une classe est en fait la description des possibilités offertes par un objet qui va appartenir à cette catégorie. Dans l'exemple précédent, on pourra considérer qu'il existe une classe &quot;Mobile&quot;.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Instance&lt;/strong&gt; : On appellera &quot;instance&quot; tout objet créé à partir d'une &quot;classe&quot;. Par exemple, mon téléphone portable est une instance de la classe &quot;Mobile&quot;. Un objet est &lt;strong&gt;toujours&lt;/strong&gt; l'instance d'une classe.&lt;br /&gt;
&lt;li&gt;&lt;strong&gt;Attribut&lt;/strong&gt; : On appellera &quot;attribut&quot; toute valeur qui s'attache à décrire l'objet. Par exemple, si mon téléphone est bleu, on peut considéré que son attribut 'couleur' a pour valeur 'bleu'.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Méthode&lt;/strong&gt; : On appellera &quot;méthode&quot; toute série d'instructions qui permettent d'agir sur l'objet, ou de faire agir l'objet lui même. Par exemple, on peut considérer que pour allumer mon téléphone, je fais appel à la méthode 'allumerTelephone'.&lt;br /&gt;
&lt;li&gt;&lt;strong&gt;Propriété&lt;/strong&gt; : D'un point de vue purement sémantique, les propriétés d'un objet sont l'ensemble de ses attributs et méthodes. Un abus de langage quasi-systématique consiste à appeler &quot;propriétés&quot; uniquements les attributs de l'objet. Pour plus de simplicité, nous utiliserons cet abus de langage dans le reste du tutoriel.:oops:&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interface&lt;/strong&gt; : Une interface est un peu comme une classe, sauf que l'on ne peut pas créer d'objet à partir d'une interface, et qu'elle ne contient pas de code &quot;à executer&quot;. Elle sera utilisée comme base pour créer des classes. Elle s'attache à décrire quelles vont être les actions qu'une classe va effectuer, et l'on devra écrire le code qui va permettre d'effectuer ces actions dans la classe. Créer une classe à partir d'un interface est aussi appelé &quot;implémenter une interface&quot;.&lt;/ul&gt;&lt;br /&gt;
img:coupe&lt;br /&gt;
&lt;span style=&quot;font-size:16px&quot;&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;3. Notions de bases&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;br /&gt;
&lt;li&gt;&lt;span style=&quot;font-size:14px&quot;&gt;&lt;strong&gt; L'encapsulation&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
 &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; L'encapsulation correspond à appliquer le principe de la &quot;boîte noire&quot; aux objets que l'on crée. Cela consiste à demander à un objet d'effectuer une action, sans se préoccuper de &lt;strong&gt;comment&lt;/strong&gt; il l'effectue. Elle permet également de faire des contrôles de sécurité, et de ne pas effectuer les actions demandées si une condition particulière n'est pas respectée. Par exemple, pour allumer notre téléphone portable, on se contente d'appuyer sur la touche [Power] : peu nous importe ensuite de savoir quelle est la  procédure interne suivie par le téléphone pour s'allumer... on désire juste savoir quand le téléphone est prêt à être utilisé.&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Pour une action à effectuer, il va falloir déterminer quels vont être les paramètres en entrée, quels vont être les paramètres en sortie, et quels vont être les actions effectuées sur l'objet lui-même, pour ensuite les mettre à disposition de l'utilisateur. Pour notre méthode 'allumerTelephone' :&lt;ul&gt;&lt;/li&gt;&lt;li&gt;le paramètre d'entrée est l'appui sur la touche [Power].&lt;br /&gt;
 &lt;li&gt;les actions que l'objet effectue sur lui-même sont &lt;ul&gt;&lt;/li&gt;&lt;li&gt;allumer l'écran &lt;li&gt;charger le répertoire&lt;/li&gt; &lt;li&gt;charger la configuration &lt;li&gt;charger le menu&lt;/li&gt;&lt;li&gt;etc...&lt;/ul&gt;&lt;li&gt;le paramètre de sortie est que le téléphone est prêt (cela peut être invisible, ou un bip, ou autre chose)&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;&lt;li&gt;&lt;span style=&quot;font-size:14px&quot;&gt;&lt;strong&gt; Le polymorphisme&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
De manière générale, il existe trois types de polymorphisme :&lt;ul&gt;&lt;/li&gt;&lt;li&gt; Le polymorphisme &quot;&lt;strong&gt;paramétrique&lt;/strong&gt;&quot; : il est également appelé &quot;&lt;strong&gt;généricité&lt;/strong&gt;&quot;. Cela consiste à effectuer des actions différentes selon le nombre et le type de ses paramètres (le nombre et le type des paramètres est appelé '&lt;em&gt;signature&lt;/em&gt;'). Sur mon téléphone portable (dans la plupart des portables d'ailleurs), si je tape un numéro de téléphone complet, et que j'appelle la méthode 'appelerDestinataire', il va composer le numéro. Si par contre, je rentre '1#' puis que j'appuie sur 'appelerDestinataire', il va chercher le premier numéro dans mon répertoire, puis le composer. Donc, la réaction de la méthode 'appeler' est différente (bien que similaire) selon le paramètre qui lui est donné.&lt;br /&gt;
&lt;li&gt; Le polymorphisme de &quot;&lt;strong&gt;surcharge&lt;/strong&gt;&quot; (ou &quot;&lt;strong&gt;ad hoc&lt;/strong&gt;&quot; ou &quot;&lt;strong&gt;overloading&lt;/strong&gt;&quot; en anglais) : cela consiste à avoir la même méthode avec la même signature pour des objets de type analogue, voire complétement différents. Si mon téléphone est de marque 'X', il possède une méthode 'appelerDestinataire' et un micro pour parler. Un interphone d'immeuble possède aussi la méthode 'appelerDestinataire' et un micro. Je ne me préoccupe donc pas du type d'objet dont je me sers, il me suffit d'utiliser la méthode 'appelerDestinataire' et d'utiliser le micro pour parler.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt; Le polymorphisme &quot;&lt;strong&gt;d'héritage&lt;/strong&gt;&quot; (ou &quot;&lt;strong&gt;overriding&lt;/strong&gt;&quot; en anglais). Ce polymorphisme est issu (comme son nom l'indique ;)) de l'héritage. Cela consiste à faire hériter plusieurs classes d'une même classe 'mère', et de redéfinir une méthode pour chaque classe. Par exemple, les téléphones de différentes marques n'ont pas la même structure interne. Un téléphone de la marque 'X' va par exemple afficher un petit logo quand on utilise 'appelerDestinataire', tandis qu'un autre va allumer l'écran. Chaque contructeur a donc créé sa propre classe &quot;MobileX&quot; ou &quot;MobileY&quot; héritée de la classe &quot;Mobile&quot;, puis réécris par dessus la méthode 'appelerDestinataire' pour y integrer ses propres spécificités.&lt;br /&gt;
&lt;span style=&quot;font-size:9px&quot;&gt;NB : La notion d'héritage est abordée plus loin dans ce tutoriel.&lt;/span&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;
img:coupe&lt;br /&gt;
&lt;span style=&quot;font-size:16px&quot;&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;4. Les relations entre objets&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;br /&gt;
&lt;li&gt;&lt;span style=&quot;font-size:14px&quot;&gt;&lt;strong&gt; L'héritage&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; L'héritage est une relation entre objets de type &lt;strong&gt;&quot;est un&quot;&lt;/strong&gt;. Elle représente le fait, pour une classe, d'être une sous-partie d'une autre classe. C'est le même principe que notre exemple : le téléphone portable &quot;est un&quot; téléphone, et le téléphone &quot;est un&quot; outil de communication téléphonique.&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Une &quot;sous-classe&quot; (également appelée &quot;classe fille&quot;) hérite des possibilités et des propriétés de sa &quot;super-classe&quot; (également appelée &quot;classe mère&quot;). Il peut arriver que la &quot;classe fille&quot; puisse effectuer des actions supplémentaires ou comporter des propriétés supplémentaires. Il peut également arriver que pour effectuer une même action que sa &quot;classe mère&quot;, une &quot;classe fille&quot; ait besoin d'exécuter des instructions supplémentaires. On va alors redéfinir une méthode de cette classe qui va executer ses instructions propres, plsu éventuellement les instructions de la &quot;classe mère&quot;. Par exemple, la classe &quot;Mobile&quot; hérite de la classe &quot;Telephone&quot;, et récupère donc les porpriétés 'touche0', 'touche1', 'touche2', etc... mais possède également en plus une touche 'on/off'.&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Dans d'autres langages, il existe la possibilité de faire de l'héritage multiple, mais pas dans Flash (du moins jusqu'à la version MX). Cela consiste tout simplement à hériter de plusieurs classes : une orange &quot;est un&quot; fruit, mais une orange &quot;est une&quot; sphère aussi. Elle a donc les propriétés d'un fruit (couleur, prix au kilo ...) et celles d'un sphère (rayon). L'héritage multiple suscite un débat important dans la communauté des développeurs. Un language comme C++ permet de créer des classes à partir de plusieurs classes (comme décrit ci-dessus), mais les classes de nouveaux langages comme JAVA ou C# permettent uniquement de faire de l'héritage multiple à partir de plusieurs interfaces, mais ne peuvent hériter que d'une seule classe, cela évitant des conflits de &quot;code&quot; entre deux méthodes ayant le même nom.&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size:14px&quot;&gt;&lt;strong&gt; La délégation&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; La délégation est une relation de type &lt;strong&gt;&quot;a un&quot;&lt;/strong&gt; entre deux objets. Elle intervient lorsque deux objets collaborent entre eux. Ce type de relation se décompose en trois parties :&lt;ul&gt;&lt;br /&gt;
&lt;li&gt;&lt;strong&gt;L'association&lt;/strong&gt; : elle consiste à une simple relation de collaboration entre deux objets. Chaque objet existe de manière totalement indépendante, et n'a pas forcément besoin de l'autre pour &quot;vivre&quot;. La relation entre un téléphone portable et son kit main-libre est une relation d'association.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L'agrégation&lt;/strong&gt; : elle se distingue de l'association par le fait qu'un objet est une partie de l'autre. Ainsi, un bouton sur un téléphone portable a une relation d'agrégation avec le téléphone. Si une certaine touche n'est pas présente, le téléphone peut néanmoins fonctionner, en paliant ce manque par des combinaisons d'autres touches.&lt;br /&gt;
&lt;li&gt;&lt;strong&gt;La composition&lt;/strong&gt; : elle est une sous-partie de la relation d'agrégation. Elle représente une relation étroite entre les deux objets : l'objet &quot;père&quot; ne peut fonctionner sans l'objet &quot;fils&quot;. L'objet &quot;batterie&quot; ou &quot;micro&quot; d'un téléphone portable ont une relation de composition avec le téléphone, car le téléphone ne peut pas fonctionner sans.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;
&lt;span style=&quot;font-size:9px&quot;&gt;NB : Dans le doute du type de relation à utiliser, il vaut mieux utiliser l'association&lt;/span&gt;&lt;br /&gt;
&lt;/ul&gt;&lt;br /&gt;
img:coupe&lt;br /&gt;
&lt;span style=&quot;font-size:16px&quot;&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;5. Petite mise en pratique&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; Nous allons ici essayer de mettre en pratique ces quelques notions par un exemple simple, qui diffère de notre téléphone portable qui n'a plus beaucoup de batteries tellement nous l'avons utilisé. &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;smiley&quot; /&gt; Nous utiliserons un &quot;pseudo-langage&quot; à priori possible à comprendre par le plus grand nombre dont voici les quelques conventions :&lt;ul&gt;&lt;br /&gt;
&lt;li&gt; le terme &quot;classe&quot; signifie que l'on crée une classe. &lt;em&gt;'classe MaClasse { ... }'&lt;/em&gt; signifie &quot;je crée une classe nommée MaClasse dont les instructions sont entre les accolades&quot;.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt; Pour dire qu'un objet est d'une certaine classe, nous noterons &lt;em&gt;'monObjet : MaClasse'&lt;/em&gt;, ce qui voudra dire &quot;monObjet est une instance de MaClasse&quot;&lt;br /&gt;
&lt;li&gt; Les méthodes sont declarées sous la forme &lt;em&gt;'monObjet.maMethode( parametre1, parametre2)'&lt;/em&gt;, ce qui veut dire &quot;je crée la méthode maMethode de l'objet monObjet qui va prendre les paramètres parametre1 et parametre2&quot;. Des parenthèses vides signifient que la méthode ne prend aucun paramètre.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt; L'affectation d'une valeur à une propriété se fait sous la forme &lt;em&gt;'maPropriete = maValeur'&lt;/em&gt;. Cela se traduit par &quot;Je donne à maPropriete la valeur maValeur&quot;.&lt;br /&gt;
&lt;li&gt; L'appel à une méthode se fait sous la forme &lt;em&gt;'monObjet.maMethode(param1, param2)'&lt;/em&gt;, ce qui se traduit par &quot;J'appelle la méthode maMethode de monObjet avec les paramètres param1 et param2&quot;.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt; Les lignes commencant par &lt;em&gt;'//'&lt;/em&gt; sont des lignes de commentaires, et n'interviennent pas dans l'exécution du code.&lt;/ul&gt; &lt;br /&gt;
 &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Le but est de créer un ensemble de classes destinées à décrire une voiture de marque 'MediaBox'.&lt;ul&gt;&lt;br /&gt;
 &lt;li&gt;Tout d'abord, commençons par créer une classe &lt;em&gt;'Vehicule'&lt;/em&gt;. Nous allons considérer qu'un véhicule comporte un moteur et des roues toutes identiques. Dans la classe véhicule, nous allons créer une propriété &lt;em&gt;'modeleDeRoue'&lt;/em&gt;, qui constituera le modèle des roues du véhicule. En effet, considérant que toutes les roues sont identiques, il ne sert à rien de créer plusieurs roues qui seront exactement les mêmes ... &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;br /&gt;
Vous me direz : &quot;Pourquoi pas un volant ?&quot;. Tout simplement parce que le volant est quelque chose de spécifique aux voitures, camions etc... Alors qu'une moto est un véhicule, mais n'a pas de volant. Nous pourrions considérer qu'un bateau est un véhicule, mais par soucis de simplification, nous allons ne pas en tenir compte ... &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;br /&gt;
En fait, la question à se poser lors de la création d'une classe est : &lt;strong&gt;&quot;Toutes les instances de cette classe ont-elles cette propriété ?&quot;&lt;/strong&gt;, ou &lt;strong&gt;&quot;Toutes les instances de cette classe peuvent-elles effectuer cette action ?&quot;&lt;/strong&gt;.&lt;br /&gt;
 Voici donc une classe &lt;em&gt;'Vehicule'&lt;/em&gt; :&lt;code class=&quot;actionscript&quot;&gt;classe Vehicule &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Proprietes&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;moteurDuVehicule : Moteur&lt;br /&gt;
&amp;nbsp; &amp;nbsp;modeleDeRoue : Roue&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Methodes&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;allumerMoteur &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt; clef &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;eteindreMoteur &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Nous allons ensuite créer une classe &lt;em&gt;'Voiture'&lt;/em&gt;, qui &quot;est un&quot; véhicule. Elle va donc hériter de la classe 'Vehicule'. En plus des possibilités d'un véhicule, la voiture possède un volant et un nombre de roues défini. Nous allons donc rajouter ce volant à la classe Voiture . Ce volant offrant la possibilité de tourner, nous allons donc créer une méthode &lt;em&gt;'tourner'&lt;/em&gt; qui va prendre en paramètre la direction dans laquelle on veut tourner.&lt;code class=&quot;actionscript&quot;&gt;classe Voiture herite de Vehicule &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Proprietes&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;volant : Volant&lt;br /&gt;
&amp;nbsp; &amp;nbsp;nombreDeRoues : Nombre&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Initialisation des proprietes&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;nombreDeRoues = &lt;span style=&quot;color: #cc66cc;&quot;&gt;4&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Methodes&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;tourner&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt; direction &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;
Vous remarquerez sûrement que l'on ne déclare pas de roue ni de moteur à cette voiture. Elle n'en a pas besoin, car héritant de la classe &lt;em&gt;'Vehicule'&lt;/em&gt;, elle hérite automatiquement des ses propriétés et méthodes. Donc, sur une instance de la classe &lt;em&gt;'Voiture'&lt;/em&gt;, nous allons pouvoir appeler les méthodes &lt;em&gt;'allumerMoteur' &lt;/em&gt;et &lt;em&gt;'eteindreMoteur'&lt;/em&gt;...
&lt;li&gt; Voila enfin le moment de créer notre classe proprement dite : la Voiture MediaBox !!! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_cool.gif&quot; alt=&quot;8)&quot; class=&quot;smiley&quot; /&gt;
L'équipe de MediaBox n'étant pas avare de ses efforts, elle vous offre en exclusivité la possibilité de voler !!! &lt;span style=&quot;font-size:9px&quot;&gt;(qui a dit Taxi 2 ?!? .......  J'ai les noms, je vous préviens !!!:twisted:)&lt;/span&gt;.
Il va donc falloir lui rajouter des ailes, et lui permettre de plier/déplier les ailes, et de décoller (pour l'atterrissage, vous vous débrouillerez) :&lt;code class=&quot;actionscript&quot;&gt;classe VoitureMediaBox herite de Voiture &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Proprietes&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;ailesDeLaVoiture : Aile&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Methodes&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;deplierLesAiles &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;plierLesAiles &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;decoller &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;
Vous noterez ici un des avantages énormes de la POO, c'est que la méthode &lt;em&gt;'plierLesAiles'&lt;/em&gt; peut vérifier si l'on est en vol ou pas avant de les replier effectivement. Si c'est le cas, elle ne repliera pas les ailes et pourra retourner une notification sur le fait qu'elle ne l'ait pas fait, voire donner la raison pour laquelle elle ne l'a pas fait. A l'utilisation d'une VoitureMediaBox, vous ne vous poserez pas ce genre de question, étant donné que l'objet le gère tout seul !
De la même manière que pour la classe &lt;em&gt;'Voiture'&lt;/em&gt;, nous n'avons pas à nous soucier des méthodes et propriétés qui ne font pas partie des spécificités de notre 'VoitureMediaBox'.
&lt;/li&gt;&lt;li&gt;Voici maintenant le moment d'acheter une voiture MediaBox. Pour cela, nous allons créer une instance de la classe &lt;em&gt;'VoitureMediaBox'&lt;/em&gt;, puis l'utiliser pour faire un petit tour du monde :&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Mon objet 'maVoitureMB' devient une instance de 'VoitureMediaBox'&lt;/span&gt;&lt;br /&gt;
maVoitureMB : VoitureMediaBox&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Je demarre ma voiture, je déplie les ailes et je la fais décoller&lt;/span&gt;&lt;br /&gt;
maVoitureMB.&lt;span style=&quot;color: #006600;&quot;&gt;demarrerMoteur&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;123456&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
maVoitureMB.&lt;span style=&quot;color: #006600;&quot;&gt;deplierLesAiles&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
maVoitureMB.&lt;span style=&quot;color: #006600;&quot;&gt;decoller&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/code&gt;&lt;/ul&gt;&lt;br /&gt;
img:coupe&lt;br /&gt;
&lt;span style=&quot;font-size:16px&quot;&gt;&lt;span style=&quot;color:darkblue&quot;&gt;&lt;strong&gt;6. Conclusion&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; Vous aurez certainement compris pourquoi la programmation Orientée Objet est utilisée maintenant par la quasi-totalité des langages actuels. Elle offre une souplesse et surtout une possibilité de réutilisation très importante. Elle permet de n'écrire qu'une seule fois le même code, et de réutiliser facilement son propre code ou un code provenant d'un autre programmeur. C'est donc un choix évident pour les équipes de développement qui travaillent ensemble. De par sa forte relation avec la représentation de la réalité, la POO est aussi plus naturelle à l'utilisation.&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Il ne reste donc plus qu'à lui trouver des inconvénients, mais je n'en vois qu'un : les codes en POO sont plus lents, car les instructions unitaires sont appelées après un passage par de multiples couches, qui prennent évidemment plus de temps qu'un appel direct à l'instruction.&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Lors du travail en équipe sur une même application, il faut faire une confiance aveugle à la personne qui a développé les classes que vous utilisez !!! En effet, si une erreur s'est glissée dans l'une de ces classes, elle peut arriver à un dysfonctionnement complet de l'application. En Flash, les accès à la mémoire de l'ordinateur étant correctement protégés, les gênes provoquées sont relativement minimes ...&lt;/p&gt;
 &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Un autre &quot;inconvénient&quot; qui n'en est pas un, est que développer en POO nécessite une phase d'analyse bien plus importante, car si elle est bâclée, elle peut nécessiter une réécriture de tout votre code en plein milieu du développement, ou pénaliser les développeurs qui vont utiliser vos classes.&lt;/p&gt;
  &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_exclam.gif&quot; alt=&quot;:!:&quot; class=&quot;smiley&quot; /&gt; Si vous voulez vous y mettre tout de suite, une tutoriel de fred sur la création d'une classe simple est disponible : &lt;a href=&quot;http://www.flash-forum.net/viewtopic.php?t=14295&quot;&gt;http://www.flash-forum.net/viewtopic.php?t=14295&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;img:coupe&lt;br /&gt;
 img:remarque msg:tut&lt;/quote&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.lalex.com/post/2003/09/01/Article-sur-les-bases-de-la-POO#comment-form</comments>
      <wfw:comment>http://blog.lalex.com/post/2003/09/01/Article-sur-les-bases-de-la-POO#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.lalex.com/feed/atom/comments/87</wfw:commentRss>
      </item>
    
  <item>
    <title>Exposé sur les conventions de présentation du code ActionScript</title>
    <link>http://blog.lalex.com/post/2003/08/08/Expos-sur-les-conventions-de-prsentation-du-code-ActionScript</link>
    <guid isPermaLink="false">urn:md5:b47cbdfadfd6f58280b22ce8ca17fd54</guid>
    <pubDate>Fri, 08 Aug 2003 18:25:41 +0000</pubDate>
    <dc:creator>-Alexandre LEGOUT aka LAlex-</dc:creator>
        <category>Articles</category>
            
    <description>    &lt;p&gt;Voici de l'article que j'ai rédigé pour &lt;a href=&quot;http://www.flash-forum.net/&quot;&gt;Flash Forum&lt;/a&gt; concernant certaines conventions utilisées par les programmeurs pour rendre leur code lisible.&lt;/p&gt;
&lt;p&gt;Je me suis inspiré pour ca tout d'abord de mon expérience de programmeur, puis du simplebon sens, et ensuite de conseils avisé d'autres programmeurs sur de petits oublis. Cet article donne donc la plupart des conseils nécessaires pour produire un code clair, et donc facile à maintenir.&lt;br /&gt;
Car on ne le dira jamais assez, le premier bénéficiaire d'un code propre, c'est bien le programmeur lui-même !!!&lt;/p&gt;
&lt;p&gt;&lt;quote&gt;&lt;a name=&quot;begintuto&quot;&gt;&lt;/a&gt;&lt;span style=&quot;font-size:18px&quot;&gt;&lt;strong&gt;Les conventions de présentation du code&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Auteur :&lt;/strong&gt; LAlex&lt;br /&gt;
&lt;strong&gt;Mail :&lt;/strong&gt; &lt;a href=&quot;mailto:lalex@flash-forum.net&quot;&gt;lalex@flash-forum.net&lt;/a&gt;	&lt;br /&gt;
&lt;strong&gt;URL :&lt;/strong&gt; &lt;a href=&quot;http://www.flash-forum.net&quot;&gt;http://www.flash-forum.net&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Date de création :&lt;/strong&gt; 31/07/2003&lt;br /&gt;
&lt;strong&gt;Version :&lt;/strong&gt; Flash 5 / MX&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;span style=&quot;font-size:14px&quot;&gt;&lt;strong&gt;Présentation&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;&quot;Un bon code est un code que l'on peut comprendre sans connaître le langage utilisé ...&quot;&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; Le but de ce tutoriel est de vous présenter des conventions de codage à utiliser avec ActionScript. Elles sont utilisées dans leur plus grande partie par les programmeurs du monde entier, sur la plupart des langages informatiques. Ces conventions n'ont rien d'obligatoires, elles permettent seulement de vous faciliter la relecture de votre code, et de permettre à n'importe quel autre programmeur ActionScript (ou autre) de le comprendre facilement. Voici les différents points à prendre en compte :&lt;ol type=&quot;1&quot;&gt;&lt;li&gt;Les conventions de nommage des variables&lt;/li&gt;&lt;li&gt;Les conventions de nommage des classes&lt;li&gt;Les conventions de nommage des méthodes&lt;/li&gt;&lt;li&gt;Les conventions d'indentation du code&lt;li&gt;Les conventions de ciblage des variables&lt;/li&gt;&lt;li&gt;Les conventions de commentaires&lt;li&gt;Conseils supplémentaires&lt;/li&gt;&lt;li&gt;Les considérations sur le poids des animations&lt;li&gt;Conclusion&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;Annexe A : Les mots réservés&lt;/li&gt;&lt;li&gt;Annexe B : Les mots déconseillés&lt;/ul&gt;&lt;br /&gt;
&lt;a name=&quot;varname&quot;&gt;&lt;/a&gt;&lt;span style=&quot;font-size:18px&quot;&gt;1. Les conventions de nommage des variables&lt;/span&gt;&lt;/p&gt;
  &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_exclam.gif&quot; alt=&quot;:!:&quot; class=&quot;smiley&quot; /&gt;&lt;strong&gt;ATTENTION&lt;/strong&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_exclam.gif&quot; alt=&quot;:!:&quot; class=&quot;smiley&quot; /&gt; N'UTILISEZ JAMAIS D'ACCENTS DANS VOS NOMS DE VARIABLES !&lt;/p&gt;
  &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Les noms de variables commencent par une &lt;strong&gt;minuscule&lt;/strong&gt;. Les différents &quot;mots&quot; qui composent le nom de cette variables commencent eux par une majuscule. L'underscore ( '_' ) est parfois utilisé comme séparateur de &quot;mots&quot;, mais rend les noms de variables plus longs. Cette pratique est maintenant assez rare : &lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Variable correctement ncaommée&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; numeroDeDossard = &lt;span style=&quot;color: #cc66cc;&quot;&gt;10&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Variable bien nommée, mais peu pratique&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; numero_de_dossard = &lt;span style=&quot;color: #cc66cc;&quot;&gt;10&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// (!) Variable mal nommée&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; numerodedossard = &lt;span style=&quot;color: #cc66cc;&quot;&gt;10&lt;/span&gt;;&lt;/code&gt;
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Choisissez des noms de variables explicites, qui décrivent le rôle de la variable :&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;//Variable correctement nommée&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; jourDeLaSemaine = &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Lundi&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// (!) Variable mal nommée&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; toto = &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Lundi&amp;quot;&lt;/span&gt;&lt;/code&gt;
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Excluez les noms tels que '&lt;em&gt;toto&lt;/em&gt;', '&lt;em&gt;tata&lt;/em&gt;', '&lt;em&gt;titi&lt;/em&gt;'. Les noms de variables en une seule lettre sont à exclure également (sauf 'x' et 'y' pour des coordonnées...). Une entorce à cette règle est souvent pratiquée pour les boucles '&lt;em&gt;for&lt;/em&gt;'. Beaucoup de programmeurs utilisent les noms de variable '&lt;em&gt;i&lt;/em&gt;', '&lt;em&gt;j&lt;/em&gt;' etc... pour leurs compteurs de boucle : &lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #b1b100;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; i=&lt;span style=&quot;color: #cc66cc;&quot;&gt;0&lt;/span&gt; ; i&amp;lt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;10&lt;/span&gt; ; i++&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Compteur de boucle : &amp;quot;&lt;/span&gt; + i&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Dans la plupart des langages traditionnels, chaque variable doit avoir été déclarée avec son type. Pour pouvoir identifier le type de ces variables, les programmeurs font commencer les noms de variables par une abréviation du type. Ainsi, les variables numériques commencent par '&lt;em&gt;int&lt;/em&gt;', les tableaux par '&lt;em&gt;ar&lt;/em&gt;', les chaînes de caractères par '&lt;em&gt;str&lt;/em&gt;', les booléens par '&lt;em&gt;b&lt;/em&gt;' etc... Le typage dans Flash n'étant pas un &quot;typage fort&quot;, peu de codeurs ActionScript utilisent cette convention.&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; intNumeroDeDossard = &lt;span style=&quot;color: #cc66cc;&quot;&gt;10&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; arJoursDeLaSemaine = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;Array&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Lun&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Mar&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Mer&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Jeu&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Ven&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Sam&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Dim&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; dteAujourdhui = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;Date&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;var&lt;/span&gt; bEstArrive = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;true&lt;/span&gt;;&lt;/code&gt;
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Certains usages veulent aussi que les membres d'une classe soient préfixés avec m_ ... Cela permet de différencier, dans la méthode d'une classe, l'accés aux propriétés de l'objet et l'accés aux variables passées en paramètres ou aux variables locales. Tout comme la précédente, cette convention est peu utilisée en Flash, ou fait place à un underscore tout seul au début de la propriété (comme '&lt;em&gt;_x&lt;/em&gt;' et '&lt;em&gt;_y&lt;/em&gt;' dans la classe MovieClip).&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;_global&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;Course&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;nbCoureurs&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;m_arCoureurs&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;Array&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;nbCoureurs&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;
&lt;a name=&quot;classname&quot;&gt;&lt;/a&gt;&lt;span style=&quot;font-size:18px&quot;&gt;2. Les conventions de nommage des classes&lt;/span&gt;
    &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_exclam.gif&quot; alt=&quot;:!:&quot; class=&quot;smiley&quot; /&gt;&lt;strong&gt;ATTENTION&lt;/strong&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_exclam.gif&quot; alt=&quot;:!:&quot; class=&quot;smiley&quot; /&gt; N'UTILISEZ JAMAIS D'ACCENTS DANS VOS NOMS DE CLASSES !
&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Les mêmes règles que les noms de variables s'appliquent pour les noms de classes, sauf que les noms de classes commencent par une &lt;strong&gt;majuscule&lt;/strong&gt;.
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Certains programmeurs (comme fred : cf &lt;a href=&quot;http://www.flash-forum.net/viewtopic.php?t=14295&quot;&gt;tuto de création des classes&lt;/a&gt;) commencent systématiquement les noms de classes avec un 'C' majuscule. Quel que soit le choix que vous faites, les deux solutions sont lisibles et comprises par les programmeurs.&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Classe correctement nommée&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;_global&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;Course&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;nbCoureurs&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;arCoureurs&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066CC;&quot;&gt;Array&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;nbCoureurs&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// (!) Classe mal nommée&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;_global&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;coureur&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;age&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;ageCoureur&lt;/span&gt; = age;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;
&lt;a name=&quot;methname&quot;&gt;&lt;/a&gt;&lt;span style=&quot;font-size:18px&quot;&gt;3. Les conventions de nommage des méthodes&lt;/span&gt;
    &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_exclam.gif&quot; alt=&quot;:!:&quot; class=&quot;smiley&quot; /&gt;&lt;strong&gt;ATTENTION&lt;/strong&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_exclam.gif&quot; alt=&quot;:!:&quot; class=&quot;smiley&quot; /&gt; N'UTILISEZ JAMAIS D'ACCENTS DANS VOS NOMS DE METHODES !
&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Les noms de méthodes commencent par des &lt;strong&gt;minuscules&lt;/strong&gt; (en fait, les méthodes ne sont que des variables de type '&lt;em&gt;Function&lt;/em&gt;'). De la même manière, donnez un nom explicite à vos méthodes dans le création de vos classes. Le nom de la méthode doit expliquer ce qu'elle fait. Les conventions de nommage des variables s'appliquent pour les arguments.
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Utilisez des verbes à l'infinitif pour décrire les actions. Utilisez les verbes 'pouvoir', 'avoir' ou 'être' à la troisième personne du singulier et au présent pour les méthodes retournant des valeurs booléennes :&lt;code class=&quot;actionscript&quot;&gt;Coureur.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;verifierDopage&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt; ... &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
Coureur.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;peutBoire&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt; ... &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
Coureur.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;aFaim&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt; ... &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
Coureur.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;estMajeur&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt; ... &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;
&lt;a name=&quot;vartarget&quot;&gt;&lt;/a&gt;&lt;span style=&quot;font-size:18px&quot;&gt;4. Les conventions de ciblage des variables&lt;/span&gt;
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; Cette convention est issue directement de Flash, et ne concerne que rarement d'autres languages.
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; En Flash, essayez de systématiquement cibler vos variables. Il est conseillé de cibler même les variables globales (avec '&lt;em&gt;_global&lt;/em&gt;'), ou les propriétés d'un objet (avec '&lt;em&gt;this&lt;/em&gt;'). Le ciblage implicite de Flash peut être bien pratique, mais un programmeur qui va regarder votre code, n'a que le ciblage pour savoir d'où vient votre variable. Il saura alors que les variable ciblées sur '&lt;em&gt;this&lt;/em&gt;' sont des propriétés (ou variables de l'objet en cours), que les variables ciblées sur '&lt;em&gt;_global&lt;/em&gt;' sont des variables globales, et que les autre sont des variables locales.
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Les seuls cas ou le ciblage n'est pas recommandé sont :&lt;ul&gt;&lt;li&gt;pour les variables locales, déclarées avec var, ou les arguments d'une fonction car de toutes façons, on ne peut pas les cibler facilement.&lt;/li&gt;
		&lt;li&gt;pour les classes. Dans la plupart des cas, les classes sont déclarées dans '&lt;em&gt;_global&lt;/em&gt;'. En effet, l'opérateur '&lt;em&gt;new&lt;/em&gt;' utilisée permet de repérer facilement le fait qu'il s'agisse d'une classe : ne pas utiliser le _global ne nuit donc pas à la compréhension du code.&lt;/ul&gt;
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; N'utilisez que du ciblage relatif, c'est a dire qui part de l'endroit ou vous êtes. Proscrivez dans la mesure du possible les '&lt;em&gt;_level&lt;/em&gt;' et '&lt;em&gt;_root&lt;/em&gt;'. Utiliser ces deux ciblages revient à se bloquer toute possibilité de ré-utiliser votre code à un autre endroit que celui pour lequel vous l'avez prévu au départ (ce qui fini la plupart du temps par arriver).
&lt;a name=&quot;identcode&quot;&gt;&lt;/a&gt;&lt;span style=&quot;font-size:18px&quot;&gt;5. Les convention d'indentation du code&lt;/span&gt;
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; L'indentation est le fait d'introduire des décalages au début des lignes (tabulations). L'éditeur ActionScript de Flash effectue l'identation tout seul, et comporte même un outil qui permet de la faire automatiquement (en partie). Si vous n'utilisez pas cet outil, ou si vous utilisez d'autres éditeurs (comme UltraEdit par exemple), ou plus simplement si vous utilisez Flash5, il existe quelque règles.
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Les blocs de code entre des accolades '{' et '}' sont décalées d'un cran :&lt;code class=&quot;actionscript&quot;&gt;Coureur.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;recupererCategorie&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;ageCoureur&lt;/span&gt; &amp;gt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;45&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Vétéran&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span style=&quot;color: #b1b100;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Senior&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Certains programmeurs mettent un retour à la ligne avant les accolades d'ouverture '{'. C'est un choix personnel de chacun, car certains trouvent cela plus lisible, d'autres non. :&lt;code class=&quot;actionscript&quot;&gt;Coureur.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;recupererCategorie&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;ageCoureur&lt;/span&gt; &amp;gt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;45&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Vétéran&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #b1b100;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Senior&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Pour l'instruction particulière '&lt;em&gt;switch&lt;/em&gt;', effectuez aussi un décalage pour les instructions situées aprés un '&lt;em&gt;case&lt;/em&gt;'. Mettez également un seul '&lt;em&gt;case&lt;/em&gt;' par ligne :&lt;code class=&quot;actionscript&quot;&gt;Course.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;peutParticiper&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;coureur&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;coureur.&lt;span style=&quot;color: #006600;&quot;&gt;recupererCategorie&lt;/span&gt; == &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Vétéran&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;switch&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;difficulte&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #b1b100;&quot;&gt;case&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;facile&amp;quot;&lt;/span&gt; :&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #b1b100;&quot;&gt;case&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;normal&amp;quot;&lt;/span&gt; :&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #b1b100;&quot;&gt;case&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;difficile&amp;quot;&lt;/span&gt; :&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;default&lt;/span&gt; : &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span style=&quot;color: #b1b100;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;
&lt;a name=&quot;comments&quot;&gt;&lt;/a&gt;&lt;span style=&quot;font-size:18px&quot;&gt;6. Les conventions de commentaires&lt;/span&gt;
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; Les commentaires sont une des bases les plus importantes pour la compréhension d'un code. Bien qu'un code proprement écrit soit plus facile à comprendre, chaque programmeur garde sa propre logique, qui n'est pas forcément celle des autres. Pour qu'un code soit compréhensible, il faut donc l'expliquer. Pour écrire un commentaire sur une ligne, utilisez le &quot;double slash&quot; ( '//' ) et pour commenter un bloc de texte, encadrez le par '/*' et '*/' :&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Ceci est une ligne de commentaire&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/* Ceci est un bloc de commentaire&lt;br /&gt;
Il peut comporter plusieurs lignes */&lt;/span&gt;&lt;/code&gt;
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; En POO, certaines normes existent concernant les classes et méthodes :&lt;ul&gt;&lt;li&gt;Pour les classes, dans le commentaire précédant la déclaration, spécifiez : &lt;ul&gt;&lt;/li&gt;&lt;li&gt;Le nom de la classe&lt;li&gt;Ce qu'elle contient, et ce à quoi elle sert&lt;/li&gt;&lt;li&gt;Son(ses) auteur(s)&lt;li&gt;Les remarques et spécifités à savoir sur la classe&lt;/li&gt;&lt;/ul&gt;
&lt;li&gt;Pour les méthodes, vous devez donner :&lt;ul&gt;&lt;/li&gt;&lt;li&gt;L'action qu'elle effectue&lt;li&gt;Ce qu'elle retourne, et de quelle type est la valeur de retour&lt;/li&gt;&lt;li&gt;Chacun de ses paramètres, avec &lt;ul&gt;&lt;li&gt;Son type&lt;/li&gt;&lt;li&gt;Son nom&lt;li&gt;Sa description&lt;/li&gt;&lt;li&gt;S'il est facultatif ou non (si rien n'est spécifié, il est considéré comme obligatoire)&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/*****************************&lt;br /&gt;
* classe : Course&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *&lt;br /&gt;
******************************&lt;br /&gt;
* Auteur : LAlex&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*&lt;br /&gt;
*&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *&lt;br /&gt;
* Contient une course et&amp;nbsp; &amp;nbsp; &amp;nbsp;*&lt;br /&gt;
* les méthodes pour la gérer *&lt;br /&gt;
*&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *&lt;br /&gt;
* Attention : ne marche que&amp;nbsp; *&lt;br /&gt;
* pour les courses a pied.&amp;nbsp; &amp;nbsp;*&lt;br /&gt;
******************************/&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/*****************************&lt;br /&gt;
* Contructeur Course&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*&lt;br /&gt;
******************************&lt;br /&gt;
* Constructeur de la classe&amp;nbsp; *&lt;br /&gt;
* Course&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*&lt;br /&gt;
*&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *&lt;br /&gt;
* - retour : aucun&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*&lt;br /&gt;
*&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *&lt;br /&gt;
* Paramètres:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*&lt;br /&gt;
* - nbKilometres : numerique *&lt;br /&gt;
*&amp;nbsp; &amp;nbsp;longueur de la course&amp;nbsp; &amp;nbsp; *&lt;br /&gt;
*****************************/&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;_global&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;Course&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;nbKilometres&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;distance&lt;/span&gt; = nbKilometres;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_exclam.gif&quot; alt=&quot;:!:&quot; class=&quot;smiley&quot; /&gt;&lt;strong&gt;ATTENTION&lt;/strong&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_exclam.gif&quot; alt=&quot;:!:&quot; class=&quot;smiley&quot; /&gt; Le constructeur d'une classe est aussi une méthode, il faut donc le commenter en conséquence !
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Evitez de commenter chaque ligne, ou les lignes trop élémentaires. Commentez une action, même si elle comporte plusieurs instructions. Ne faites pas pour autant un roman pour expliquer le 20 prochaines instructions. Un commentaire sur 3 ou 4 instructions qui vont LOGIQUEMENT ensemble est suffisant.&lt;code class=&quot;actionscript&quot;&gt;Coureur.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;verifierVitesse&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Si le coureur est trop lent, on l'élimine&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;vitesseMoyenne&lt;/span&gt; &amp;lt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;eliminer&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Sinon, si il va trop vite, on fait un test anti-dopage&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// et on l'élimine s'il est positif&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span style=&quot;color: #b1b100;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;vitesseMoyenne&lt;/span&gt; &amp;gt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;60&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;verifierDopage&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;eliminer&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_exclam.gif&quot; alt=&quot;:!:&quot; class=&quot;smiley&quot; /&gt; Le commentaire doit dire ce que ne dit pas le code : parlez de l'action que vous faites, pas des variables que vous manipulez.&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Bien commenté&lt;/span&gt;&lt;br /&gt;
Course.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;modifierLongueur&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;longueur&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Modifie la longueur de la course avec la valeur passée en paramètre&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;longueurCourse&lt;/span&gt; += longueur;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// (!) Mal commenté&lt;/span&gt;&lt;br /&gt;
Course.&lt;span style=&quot;color: #0066CC;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;modifierLongueur&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;longueur&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// Rajoute 'longueur' à 'this.longueurCourse' =&amp;gt; Sans blagues ?!?&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;longueurCourse&lt;/span&gt; += longueur;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Aérez un maximum votre code. N'hésitez pas à placer des lignes vides entre des blocs d'instructions différents, même s'il ne comportent pas d'accolades. Par exemple, un retour à la ligne juste avant un commentaire permettra de le différencier du code qui est situé juste avant.
&lt;a name=&quot;advice&quot;&gt;&lt;/a&gt;&lt;span style=&quot;font-size:18px&quot;&gt;7. Conseils supplémentaires&lt;/span&gt;
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; Rassemblez les fonctionnalités analogues au même endroit. Ne déclarez pas une classe à un endroit pour créer ses méthodes à un autre endroit.
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; Utilisez toujours la même langue dans votre code. Si une classe s'appelle '&lt;em&gt;Coureur&lt;/em&gt;', ne faite pas une méthode qui s'appelle '&lt;em&gt;canRunNaked&lt;/em&gt;'... et inversement. Bien entendu, si vous voulez diffuser votre code sur des sites non-francophones, l'anglais reste la meilleure solution! &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; Evitez de mettre plusieurs instuctions séparées par des points-virgules sur une seule ligne.
  &lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_idea.gif&quot; alt=&quot;:idea:&quot; class=&quot;smiley&quot; /&gt; Evitez les écritures condensées :&lt;code class=&quot;actionscript&quot;&gt;&lt;span style=&quot;color: #0066CC;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;ageCoureur&lt;/span&gt; &amp;gt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;75&lt;/span&gt; ? &lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Trop Vieux&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; : &lt;span style=&quot;color: #0066CC;&quot;&gt;trace&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;OK&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
maVariable1 = maVariable2 = maVariable3;&lt;/code&gt;&lt;br /&gt;
&lt;a name=&quot;sizeof&quot;&gt;&lt;/a&gt;&lt;span style=&quot;font-size:18px&quot;&gt;8. Considérations sur le poids des animations&lt;/span&gt;&lt;/p&gt;
  &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Les conventions précédentes ne prennent pas en considération un problème mineur de Flash, qui est le fait que Flash conserve les noms de variables. Donc un nom de variables long va prendre plus de place (en terme de poids du fichier) qu'un nom de variable d'une ou deux lettres.&lt;/p&gt;
  &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; La meilleure chose à faire si l'on veut optimiser au maximum est de faire un code avec des noms de variable &quot;conventionnés&quot;, puis de le dupliquer et d'utiliser à bon escient le Chercher/Remplacer pour modifier les noms de variables (Attention : une mauvaise utilisation du Chercher/Remplacer peut détruire tout votre code).&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;endtuto&quot;&gt;&lt;/a&gt;&lt;span style=&quot;font-size:18px&quot;&gt;9. Conclusion&lt;/span&gt;&lt;/p&gt;
  &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Comme je vous l'ai précisé au début de ce tutoriel, aucune de ces conventions n'est indispensable au bon fonctionnement de votre code, mais vous constaterez vite, si vous les utilisez, que cela constitue un gain de temps non négligeable, tant pour vous que pour ceux qui voudront lire votre code (par exemple les membres de Flash Forum qui veulent répondre à une de vos question ;))&lt;/p&gt;
&lt;p&gt;&lt;quote&gt;&lt;a name=&quot;anxa&quot;&gt;&lt;/a&gt;&lt;span style=&quot;font-size:16px&quot;&gt;&lt;strong&gt;Annexe A : Les mots réservés&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Certains mots utilisés en interne par Flash ne peuvent pas être utilisés comme noms de variables, classes ou méthodes :&lt;ul&gt;&lt;li&gt;add&lt;/li&gt; &lt;li&gt;and&lt;br /&gt;
&lt;li&gt;break&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;case&lt;br /&gt;
&lt;li&gt;continue&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;default&lt;br /&gt;
&lt;li&gt;delete&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;do&lt;br /&gt;
&lt;li&gt;else&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;for&lt;br /&gt;
&lt;li&gt;function&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;if&lt;br /&gt;
&lt;li&gt;in&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;instanceof&lt;br /&gt;
&lt;li&gt;new&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;on&lt;br /&gt;
&lt;li&gt;return&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;super&lt;br /&gt;
&lt;li&gt;var&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;void&lt;br /&gt;
&lt;li&gt;with&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;
&lt;a name=&quot;anxb&quot;&gt;&lt;/a&gt;&lt;span style=&quot;font-size:16px&quot;&gt;&lt;strong&gt;Annexe B : Les mots déconseillés&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;p&gt;&lt;img src=&quot;http://common.lalex.com/themes/devblog/smilies/icon_arrow.gif&quot; alt=&quot;:arrow:&quot; class=&quot;smiley&quot; /&gt; Certains mots font partie intégrante de la norme ECMA-262 (&lt;a href=&quot;http://www.ecma-international.org/publications/files/ecma-st/Ecma-262.pdf&quot;&gt;PDF&lt;/a&gt; : ~700Ko), norme dont Flash tend à se rapprocher. Pour une plus grande probabilité de compatibilité avec les versions à venir, il vous est déconseillé d'utiliser les termes suivants pour nommer des variables, classes ou méthodes :&lt;ul&gt;&lt;li&gt;abstract&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;boolean&lt;br /&gt;
&lt;li&gt;byte&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;catch&lt;br /&gt;
&lt;li&gt;char&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;class&lt;br /&gt;
&lt;li&gt;const&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;debugger&lt;br /&gt;
&lt;li&gt;catch&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;double&lt;br /&gt;
&lt;li&gt;enum&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;export&lt;br /&gt;
&lt;li&gt;extends&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;final&lt;br /&gt;
&lt;li&gt;finally&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;float&lt;br /&gt;
&lt;li&gt;goto&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;implements&lt;br /&gt;
&lt;li&gt;int&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;interface&lt;br /&gt;
&lt;li&gt;long&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;native&lt;br /&gt;
&lt;li&gt;package&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;private&lt;br /&gt;
&lt;li&gt;protected&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;public&lt;br /&gt;
&lt;li&gt;short&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;static&lt;br /&gt;
&lt;li&gt;synchronized&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;throws&lt;br /&gt;
&lt;li&gt;transitient&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;try&lt;br /&gt;
&lt;li&gt;volatile&lt;/li&gt;&lt;/ul&gt;&lt;/quote&gt;&lt;/quote&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.lalex.com/post/2003/08/08/Expos-sur-les-conventions-de-prsentation-du-code-ActionScript#comment-form</comments>
      <wfw:comment>http://blog.lalex.com/post/2003/08/08/Expos-sur-les-conventions-de-prsentation-du-code-ActionScript#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.lalex.com/feed/atom/comments/68</wfw:commentRss>
      </item>
    
</channel>
</rss>
