26 juillet 2004

API Java pour PHP5

Des p'tits gars biens futés ont lancés l'idée de re-créer l'API de Java pour PHP5, en se servant de la similarité évidente entre les deux syntaxes. Non content d'avoir eu la grande idée, ils l'ont mise en pratique et l'équipe de japha met dors et déjà à disposition le package japha 2.0.0 pour PHP 5.0.0.

L'interêt de ce type de programme est que l'API de Java est déjà trés largement éprouvée, et qu'elle peut maintenant être utilisée dans PHP, lui apportant ainsi sa robustesse et surtout sa propreté OO ! 8)

Merci Nexen pour l'info ! ^^

21 juillet 2004

Hébergeur(s) PHP5 : OVH sur les rangs

OVH a été parmi les premiers hébergeurs français (à ma connaissance) à proposer de tester PHP5 avec la version PHP5 beta1. Aujourd'hui, les offres Plan Pack proposent la version finale de PHP 5.0.0 via l'extension .php5 !

Si vos connaissez d'autres hébergeurs qui ont déjà sauté le pas, n'hésitez pas à les donner dans les commentaires ! ;)

Typage fort avec ':Object' à éviter

En me balladant sur le blog de Simon Wacker et Martin Heidegger, développeurs de la librairie as2lib, je suis tombé sur un billet trés interessant nommé :Object is evil. On y apprend que pour les utilisateurs des interfaces, une variables typées avec une interface sera rejetée par le compilateur si on essaie de l'attribuer avec une variable typée avec Object.

L'exemple fourni est assez saisissant :var a:MyInterface = new MyImplementation();
var b:Object = a;
// Erreur a la compilation

La conclusion est simple, n'utilisez pas de typage fort pour un objet de type générique ! ;)

20 juillet 2004

FlashPaper 2 : enfin une version standalone

Macromedia a souvent fait des erreurs commerciales. Parmi celles-ci, en voici une de réparée : FlashPaper est disponible seul dans sa version 2. Auparavant disponible uniquement avec Contribute 2, cette application permet de générer une espèce de lecteur PDF au format SWF. En plus de cette trés bonne idée, évidemment conservée dans cette version, FlashPaper 2 se propose également de générer du PDF lui-même.:o

La guerre qui les oppose à Adobe va donc s'étendre à ce terrain. Bien que le format PDF en lui-même ne puisse pas être remis en cause, avoir un générateur de PDF pas cher (79€ HT) qui en plus a les avantages du format SWF, voici un logiciel qui semble réellement trés interessant ! Bien que certaines options avancées de Adobe Acrobat soient certainement indisponibles, les fonctionnalités semblent largement suffisantes pour les besoins de base, qui consistent à créer des documents lisibles par le plus grand nombre ! 8)

Normalement, ca m'évitera de pester contre la lenteur de Acrobat Reader à s'ouvrir ! :D

Connexion inter-domaines : un assouplissement depuis la r19

Un lecteur de TweenPix a relevé dans un commentaire un aspect interessant introdui dans l'avant-dernière release du Flash Player (r19), qui autorise dorénavant à charger le fameux fichier crossdomain.xml directement via un serveur de socket, et non pas comme avant obligatoirement via une connexion HTTP sur le port 80.

MyMyoux relève donc l'utilisation de l'instruction System.security.loadPolicyFile, qui permet de préciser à quel endroit charger ce fameux fichier "AllowDomain". Il permet ainsi de préciser une autre URL HTTP, ou un serveur de socket en utilisant le "protocole" xmlsocket://". Il emet une requête de type Socket XML et envoie simplement <policy-file-request/>
Il suffit alors de configurer le serveur pour qu'à la reception de cette instruction, il renvoie le contenu classique d'un fichier crossdomain.xml ... 8)

Anniversaire de LAlex devblog : première !

Pour ses un an, LAlex devblog s'est offert un peu de repos, bien qu'il fut forcé par un crétin qui s'est amusé à attaquer le serveur, et entretenu par le premier hébergeur de France, qui met 3 jours à rétablir un service qu'il a lui-même arreté (l'attaque prenait trop de bande passante) ... :\

Toujours est-il que ce blog, c'est 172 tickets, et surtout ma plus grande source de fierté, 1441 commentaires, c'est à dire vous ! 8)

Je suis content d'avoir pu avancer et échanger grace à vos remarques. J'ai fait la connaissance de nombreuses personnes ici ou ailleurs grace à ce site, élargissant ainsi mes horizons. Pour n'en citer que quelques uns, petit clin d'oeil à Thimotée Groleau (qui prépare son mariage, courage ;)), Francis Bourre (pour moi, la référence chez les codeurs francophones), Stéfane Funaro, confrère canadien, et les communautés que j'ai appris à mieux connaitre même si je n'y suis pas trés actif, comme les subversifs NoDrugNoBug, ou FlashXPress et Flash France. Je ne veux pas oublier MediaBox évidemment, mais c'est pas pareil, je les connaissais déjà ! :P

J'espère être encore là l'année prochaine pour souffler la deuxième bougie, tout en gardant le même objectif : promouvoir les technologies Flash et PHP comme de vrais outils professionnels (et non pas de jouets pour programmeurs débutants, réservés au bricoleur du web) au travers d'articles et de codes issus de mes expériences plus ou moins réussies. :)

Encore une fois merci à vous tous ! ^^

14 juillet 2004

PHP 5 est enfin la !!!

Chantez et dansez, le tant attendu PHP 5 est enfin disponible !!! Il est donc maintenant possible de coder avec san arrière pensée ! 8)

La dernière question qui se pose est de savoir comment va se dérouler la transition. En effet, pour des problèmes de compatibilité ascendante avec l'ancienne version, notamment avec la programmation POO, l'adoption de cette nouvelle mouture risque de ne pas se faire sans douleur. Alors quel choix vont être fait par les hébergeurs ? Garder la compatibilité et ainsi se couper de la nouvelle notation ? Ou forcer l'adoption de la nouvelle notation, et ainsi obliger à transformer tout son code ? :o

A priori, il y a de grandes chances que l'on passe par une phase de transition avec une extension .php5, avec les .php qui restent en PHP4 ... Quoi qu'il arrive, c'est toujours ca de pris : l'avenir du langage est maintenant entre les mains des hébergeurs ... :)

13 juillet 2004

lalex.transitions

Un titre en p'tit clin d'oeil à mon corrélégionaire petepx pour annoncer que je change moi aussi d'horizon. A moins d'un imprévu imprévisible (sequestration par mon patron actuel, tremblement de terre, IDE Flash sans bugs, ou autres évenements hautement improbables :=)), je vais rejoindre au mois de Septembre l'équipe de l'agence qu'on ne présente plus : Les Chinois à Paris. Je quitte donc ma Côte d'Azur natale pour céder aux sirènes de la capitale.

J'aimerais par cette occasion remercier trés sincèrement :

  • mEga : ben c'est lui qui m'a dégoté l'annonce, et m'a gentimment hébergé le jour où je suis monté pour mon entretien !!! :)
  • Foxy, qui m'avait trouvé un poste en or. Bon, ca ne s'est pas fait, mais ce sera pour la prochaine fois. J'en profite pour t'exprimer toute mon admiration pour la qualité de tes réalisations, et ma joie d'avoir fait ta connaissance ! 8)
  • Mama de FlashXpress : ben aussi un taf qui n'a pas abouti, mais positivement enchanté d'avoir pu échanger quelques mails ! Pour les compliments, voir ligne du dessus, c'est pareil ! :=)
  • Et les autres qui m'ont très gentimment envoyé des annonces qu'ils avaient repérés pour moi. Ca m'a vraiment beaucoup touché à chaque fois !!! :$

8 juillet 2004

Pratiques de programmation PHP : Introduction

Une fois la colère passée, je me suis mis en tête de faire une série de posts concernant ce que je considère comme des bonnes pratiques en programmation PHP/MySQL, histoire de ne pas me poser en tant que "raciste envers les débutants".:P Ca peut aider si l'on débute, ou tout simplement donner des trucs auxquels on n'a pas forcément pensé. Bon, évidemment, ca restera mes pratiques, celles que j'utilise au quotidien, mais je pense avoir déjà pas mal vadrouillé dans les méandres du codage PHP pour pouvoir donner mon humble avis, d'autant que de nombreuses astuces découlent plus du bon sens que de l'apprentissage. Cela aura également l'avantage de pouvoir être complété et/ou rectifié par vos commentaires : pourquoi pas faire une compilation à la fin de la série ? 8)

Si certaines sont instaurées depuis un bon nombre d'années par les différentes normes qui se sont naturellement installées dans les communautés de développement, d'autres sont aussi venues par la pratique. Un peu comme pour les Design Pattern, il s'agit là de solutions génériques élaborées pour répondre à un problème spécifique.

J'aborderai dans cette rubrique différents aspects de la conception de sites web dynamiques, de la conception de la base de données à l'organisation du code et des différents fichiers, en passant par des trucs et astuces de lisiblité ou de performances, et la POO.

Une rubrique ActionScript pourrait également faire son apparition ensuite. De nombreux points communs existent entre les différents langages de programmation, et donc certaines pratiques sont utilisés partout. Mais la première série restera axée sur le PHP.

Wait and see. ;)

5 juillet 2004

TOAD existe aussi pour mySQL

TOAD est l'outil de prédilection des développeurs utilisant une base de données Oracle. En effet, le nom du logiciel est constitué par les initiales de Tool for Oracle Application Developer. Edité par Quest Software, peu de gens savent qu'il existe néanmoins une version gratuite et complète, qui n'a pour seul inconvénient que d'expirer tous les 30 jours, nécessitant son re-téléchargement à chaque fois. :o

Bref, en retéléchargeant ma version mensuelle, j'ai constaté la mise à jour du site de la version freeware, et j'ai remarqué ce lien en plus trés interessant : TOAD for MySQL (existe aussi pour SQL Server). Voici donc toute la puissance du logiciel pour MySQL. :)

Au programme, un phpMyAdmin en application Windows, avec plein d'outils bien pratique, comme un analyseur de requêtes pour faire de l'optimisation, une accés à la structure et aux données d'une base, la gestion des transactions, etc ... Bref, un outil que je vous recommande chaudement si vous travaillez avec mySQL ! 8)

30 juin 2004

Marre des codeurs à la petite semaine !!!

Je suis actuellement en train de reprendre un code PHP déjà développé pour un site d'agences de voyage. Cet immonde amas de n'importe quoi, développé par un sous-débutant pour quatre mois de mon salaire est un pur scandale !!! :x

Je suis vraiment horrifié par ce que certains, qui ont le culot de s'auto-proclamer programmeur, n'hésitent pas à vendre ! Me voilà obligé de reprendre à peu prés tout, y compris le schéma de base de données totalement absurde, ce qui veut bien évidemment dire que je dois effectuer la reprise des données, recoder toute l'administration et le site, bref je refais tout : ca me prendra moins de temps que de mettre les doigts dans "ça" ! :\

Quelques petits exemples simplifiés pour que vous compreniez bien. Si ca peut prêter à rire, c'est pour ne pas pleurer. Trois arguments sont passés en URL, et la requête a effectuer est bien entendu différente selon les valeurs de ces variables :/**
ATTENTION !
Ce qui suit est une TRES mauvaise pratique en programmation
*/

$arg1 = $_GET["arg1"];
$arg2 = $_GET["arg2"];
$arg3 = $_GET["arg3"];
// Attention, on s'accroche, ca va secouer
if ($arg1 == 0 && $arg2 == 0 && $arg3 == 0) {
   $sql = "SELECT * FROM table";
}
if ($arg1 == 0 && $arg2 == 0 && $arg3 != 0) {
   $sql = "SELECT * FROM table WHERE arg3 = $arg3";
}
if ($arg1 == 0 && $arg2 != 0 && $arg3 == 0) {
   $sql = "SELECT * FROM table WHERE arg2 = $arg2";
}
if ($arg1 != 0 && $arg2 == 0 && $arg3 == 0) {
   $sql = "SELECT * FROM table WHERE arg1 = $arg1";
}
if ($arg1 == 0 && $arg2 != 0 && $arg3 != 0) {
   $sql = "SELECT * FROM table WHERE arg2 = $arg2 AND arg3 = $arg3";
}
if ($arg1 != 0 && $arg2 == 0 && $arg3 != 0) {
   $sql = "SELECT * FROM table WHERE arg1 = $arg1 AND arg3 = $arg3";
}
if ($arg1 != 0 && $arg2 != 0 && $arg3 == 0) {
   $sql = "SELECT * FROM table WHERE arg1 = $arg1 AND arg2 = $arg2";
}
if ($arg1 != 0 && $arg2 != 0 && $arg3 != 0) {
   $sql = "SELECT * FROM table WHERE arg1 = $arg1AND arg2 = $arg2 AND arg3 = $arg3";
}
Je vous avoue que j'ai bien passer 10 minutes à cligner des yeux tellement cela m'a paru surréaliste !!! 8O Je ne vais pas m'étaler sur les bouts de codes Dreamweaver, les jointures sur des champs textes, les valeurs en dur dans le code, l'ergonomie absolument catastrophique, etc... Et moi, je dois maintenir ca !!! Je suis vraiment dans une colère indescriptible !

Attention, je ne dénigre pas les débutants, il faut malgré tout être conscient de ses possibilités: on ne va pas aux jeux olympiques quand on court le 100 mêtres en 25 secondes !!!

Le pire est que cet handicapé du code à signé son code, avec nom et URL, et son site est celui d'une "vraie" société, qui donc s'affiche en tant que professionnel du développement ! Quand je vois ce que font certains et qu'ils arrivent à en vivre, j'ai vraiment beaucoup de peine. :( Je suis dans un tel état de nerfs que je suis à deux doigts de publier l'URL de cet abruti... :x

Si j'avais un bon réseau de relations, je me dis que j'aurais facilement pu être riche en tant qu'indépendant en effectuant du travail de qualité ! Quand j'avais 15 ans, quelqu'un m'a dit cette phrase qui a marqué ma manière de travailler :La différence entre un travail bien fait et un travail mal fait ? Aucune, sauf que le travail mal fait, il faut le refaire ! :=)
Aaaaaaaah ... ca fait du bien de se lâcher un peu ! :P Et encore, je me suis dispensé de toutes les insultes que m'insipre ce garçon ! :=)

28 juin 2004

Classe MultiLoader : impossible d'interrompre un chargement de fichier distant

En revenant un peu au développement AS, je me rends compte du nombre de fonctionnalités que j'ai développé plusieurs fois, et travaille donc actuellement à me créer un ensemble de classes utilitaires qui m'éviteront de perdre du temps sur des développements répétitif, comme le fait tout programmeur un minimum organisé ! :$ Par manque de temps et de projets nécessitant un investissement suffisant, je ne l'ai pas fait avant, et je m'y mets donc sérieusement ! 8)

Je travaille actuellement sur une classe de preload, un peu à la manière de MovieClipLoader, mais me permettant de charger un ensemble de fichiers de différents types les uns aprés les autres avec les différents évènements correspondant. Ces fichiers pourraient être des SWF externes, des sons, des fichiers XML, voire des vidéos (si c'est faisable, je n'ai encore jamais eu l'utilité de la vidéo dans Flash). Le fait de ne pas les charger simultanément vient tout simplement d'une préoccupation d'optimisation de la bande passante et de priorisation des téléchargements.
Il s'agit donc pour moi de stocker l'ensemble des fichiers à charger, et de lancer une méthode de ma classe. Le problème est que j'aurais aimé pouvoir commencer par récupérer le cumul des tailles de mes fichiers. J'ai d'abord pensé à créer des LoadVars sur chaque fichier, et à les interrompre une fois la taille récupérée, sans charger la totalité du fichier.

Or il semble que la suppression d'un objet LoadVars (ou XML, et je soupconne les autres types "loadables") ne met pas fin au téléchargement. En effet, la méthode onLoad se lance malgré le fait que j'ai utilisé delete sur l'objet de type LoadVars qui m'a servi à récupérer la taille du fichier ... :(this.tst = new LoadVars();
this.tst.onLoad = function() {
        trace("OK");
}
this.tst.load("<a href="http://www.lalex.com/monfichier.jpg">http://www.lalex.com/monfichier.jpg</a>");
this.onEnterFrame = function() {
        var tt = this.tst.getBytesTotal();
        trace(tt);
        if (tt != undefined) {
                delete this.tst;
                delete this.onEnterFrame;
        }
}

La sortie donne undefined
undefined
undefined
undefined
28449
OK <= aprés quelques secondes

Aprés un parcours des archives de FlashCoders, il semble qu'aucune solution n'a été trouvée. :( Apparemment, Flash crée automatiquement une référence vers l'objet, qui devient une référence anonyme si on le supprime, et empêche donc le garbage collector (ou ramasse-miettes en français :P) de faire son office ...

Si jamais entre temps, quelqu'un avait trouvé une solution à cet épineux problême, je serais ravi de l'apprendre ! :=)

Pour revenir à ma classe, je prévois également, une fois la solution "à la queue-leu-leu" implémentée, de faire un système de pools de téléchargement, qui permettrait de télécharger un nombre défini de fichiers simultanément. Par exemple, on pourrait ainsi décider de ne pas charger plus de 3 fichiers à la fois. Ainsi, 3 fichiers se téléchargeraient, et le premier à avoir fini laisserait sa place au suivant, etc... Je prévois aussi de faire un système de téléchargement par catégorie (d'abord le XML, puis les clips, puis les sons, etc...)

Je mettrai bientôt la classe à disposition ici même ... ;)

24 juin 2004

SuperColor : Gestion des effets de couleur en AS2







Pour les besoins d'un développement, j'ai eu besoin de faire une transition de type "fondu vers le blanc", qui donne un effet des plus esthétiques. Je me suis servi pour cela d'une classe qui hérite de color, et implémente des méthodes permettant de manipuler la luminosité, et d'autres paramètres liés à la couleur d'un clip. J'ai utilisé pour cela l'ensemble de fonctions développées par Robert PENNER, qu'il expose dans son livre, mais en AS1.

J'ai donc repris ses fonctions pour les intégrer dans une classe AS2, qui contient également des propriétés "virtuelles" créées avec des getter/setter. Cela permet d'utiliser facilement les Tween dessus, et donc de créer des interpolations de luminosité trés facilement. Cliquez sur l'image pour voir un petit exemple. 8)

Le code de l'animation que vous voyez est on ne peux plus simple :// Importation des classes
import com.lalex.movieclip.SuperColor;
import mx.transitions.Tween;
import mx.transitions.easing.Regular;
// Objet SuperColor
var myCol:SuperColor = new SuperColor(image);
// Objet Tween
var myTw:Tween = new Tween(myCol, "_brightOffset", Regular.easeInOut, 0, 255, 2, true);
myTw.stop();
// Evenements du Tween
var twEvent:Object = new Object();
myTw.addListener(twEvent);
var onMF = function(tw:Tween) {
        tw.yoyo();
        this.onMotionFinished = function(tw:Tween) {
                tw.yoyo();
                tw.stop();
                this.onMotionFinished = onMF;
        }
}
twEvent.onMotionFinished = onMF;
// Evenements sur l'image
image.onRelease = function() {
        myTw.start();
}
image.onRollOver = function() {
        click._visible = false;
}

::Télécharger SuperColor.zip::

15 juin 2004

Multi-threading en PHP : vers une solution ? (MAJ)

PHP a beau être un langage qui n'a pas à rougir de la comparaison avec les "gros" langages tels que Java, il lui manque néamoins quelques fonctionnalités avancées qui simplifieraient la vie du codeur, et éventuellement pourraient améliorer les performances de manières significative.

Parmi ces fonctionallités "manquantes", le multi-threading est probablement la plus importante à mon sens. Sur les plateforme de type UNIX, il est possible de dupliquer un processus grace à l'utilisation de l'extension PCNTL et son instruction pcntl_fork(), mais pas de créer plusieurs threads. Pour information, le thread est la plus petite entité en terme d'instruction processeurs. Les différents threads d'un processus sont répartis en terme de traitement par le processeur afin de simuler leurs executions simultanées.

Vraisemblablement, le problème a déjà commencé à être abordé par des codeurs du PHP Group, et ce depuis un bon moment. PHP5 ne gérant pas nativement le multi-threading, il s'agit donc d'une extension PECL. Pour rappel, PECL est un sytème d'extensions la plupart du temps codées en C/C++, et compilées à la manière des extensions "natives" de PHP (MySQL, Oracle, Sockets : celles que l'on active dans le php.ini). On trouve ainsi dans la liste de ces extensions de quoi gérer le format zip, ou se connecter à un serveur POP3...
Pour les experts en C/C++ qui veulent éventuellement y toucher, ou développer leurs propres extensions natives, vous trouverez sur le site de PECL les instructions nécessaires à un tel codage.

Attention à ne pas confondre ces possibilités d'extension avec les extensions PEAR, qui elles sont codées en PHP. Pour les flasheurs, ca correspond à la différence entre les classes fournies avec Flash, codées en AS, et les classes "intrinsic", natives au Player Flash. En PHP, il est possible d'en rajouter étant donné que tout se passe sur le serveur ! 8)

Pour revenir à nos moutons, on trouve dans le repository CVS du PHP Group, une extension en cours de développement nommée php_threads ... que l'on retrouve dans les extensions PECL des Snapshots PHP que ce soit pour la branche stable (4.3.x) ou la branche instable (5.0.x), compilée sous forme de dll pour Windows. N'étant pas expert de l'utilisation des threads, je ne me suis pas encore risqué à l'utiliser, mais pour ceux qui s'y connaissent déjà, voici les fonctions que l'on retrouve dans la source en C de l'extension :

  • thread_start
  • thread_include
  • thread_set
  • thread_get
  • thread_mutex_init
  • thread_mutex_destroy
  • thread_lock
  • thread_lock_try
  • thread_unlock

Affaire à suivre donc ! ;)

MAJ : J'ai trouvé sur le web une autre initiative pour l'implémentation des Threads en PHP, dont la syntaxe me plait beaucoup plus. Elle est faite pour coller complètement à la syntaxe Java, avec une approche Objet. Il suffit pour créer un thread de dériver la classe Thread justement ... Les sources sont disponibles au téléchargement, mais aucune version compilée à priori, ni aucune page dédiée, ou doc. A voir l'exemple, c'est quand-même beaucoup plus convivial qu'un ensemble de fonctions. N'étant qu'un début d'essai de prémice, ce module a de grandes chances d'être hautement instable (lire le README). A utiliser avec précautions donc ! :)

A voir les sources, l'API du Zend Engine semble vraiment assez accessible, et pour un développeur trés calé, il ne devrait pas être si difficile que ca de finir le travail entamé je pense (faudrait que je me remette au C/C++ moi :P). Il n'y a pas de volontaires ? Ce serait le bonheur de pouvoir avoir une implémentation stable des threads ... ^^

8 juin 2004

PHP5 : entrainez-vous sur la RC3 !

La nouvelle (et normalement dernière) Release de PHP avant la version finale est aujourd'hui disponible sur le site officiel de PHP : http://www.php.net/. Peu de changements, et donc on en vient logiquement à se dire qu'on est vraiment trés près d'un version finalisée ! 8)

En attendant de voir cette version trés attendue sur votre hébergeur préféré, vous pouvez toujours commencer à vous familiariser avec PHP5 en participant au Zend PHP5 Contest, concours de programmation destiné à mettre en avant les nouvelles possibilités offertes par cette mouture de PHP. A la clef, des lots assez sympathiques, comme un Ordinateur portable, ou des mini iPod si vous participez en équipe ! Vous pouvez choisir de développer un des sujets proposés, ou bien choisir votre propre thème.

Personnellement, j'ai déjà mon projet en tête, et je commence à modéliser un peu le moteur que je m'apprête à développer ! Un indice : nom de code "Pomme" ;)

4 juin 2004

Recherche de boulot, pour développer en Actionscript et/ou PHP

Ceux qui me connaissent la savent déjà, mais je cherche activement du travail actuellement ! Pour la peine, je vous gratifie d'une grosse banner pour que tout le monde soit bien au courant !!! :=)

En fait, le but est de trouver un emploi dans une société qui sait être sérieuse sans être trop bureaucratique ou terne, voire triste. Je pars du principe qu'une bonne ambiance de travail décuple la productivité dans un entreprise ... en tout cas, moi je marche beaucoup comme ça ! :) Je signale par la même occasion que je ne suis pas bardé de diplômes, mais que malgré cela mes compétences peuvent prendre part à de nombreux projets, même parmi les plus ambitieux ! ;)

Flash et PHP sont pour moi une passion, ou plutôt la programmation en environnement web (je suis prêt à apprendre toute nouvelle techno), donc j'ai décidé de quitter mon boulot alimentaire pour enfin vivre un peu dés que je rencontrerai une opportunité intéressante.

Donc voilà, si l'un d'entre vous entend parler d'un job intéressant, qu'il n'hésite pas à transmettre mon CV, ou à me contacter à l'adresse lalex@lalex.com. Et merci d'avance ! ^^

2 juin 2004

Timothée Groleau ouvre (enfin) son blog

Timothée Groleau, auteur de plusieurs articles trés interessants sur le comportement de Flash, notamment l'excellent Scope chain and memory waste, vient d'ouvrir son blog, disponible à l'adresse suivante : http://timotheegroleau.com/blog ... Une nouvelle ressource qui promet d'être des plus interessantes !!! 8)

Longue vie à ce blog ! :)

1 juin 2004

Interfaces et classes virtuelles

Plongé actuellement dans le passionant ouvrage qu'est Design patterns. Catalogue des modèles de conception réutilisables (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. :)

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.

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 ! ;)

Définitions

Signature d'un fonction/méthode : Il s'agit de la "structure" 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.

Méthode abstraite (ou virtuelle) : 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.

Classe abstraite : 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.
Pour l'Actionscript 2, Francis Bourre propose un pattern destiné à émuler les classes abstraites : http://www.tweenpix.net/archives/000316.html

Interface : 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.

Différence entre classe abstraite et interface

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 "est un". 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 "super type", dont d'autres types concrets pourront dériver.

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.

// Classe abstraite de véhicule a moteur
// Le replissage du reservoir possède une implémentation
// Par défaut
abstract class Vehicle {
   private var $_maxFuel;
   private var $_currentFuel;
   // Méthode concrète
   protected function fill($quantite) {
      // Code pour remplir le réservoir
   }
   // Methode abstraite
   // Les sous-classes devront l'implémenter
   abstract public function start();
}
// Voiture
// Heritant de VahiculeAMoteur, on est obligé d'implémenter démarrer
// Si on ne le fait pas, une erreur va survenir
class Car extends Vehicle {
   // Surcharge de la méthode abstraite
   public function start() {
      // Code pour démarrer la voiture
   }
}
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 "possède les fonctionnalités de". D'ailleurs, les interfaces ont souvent des noms synonymes de "capable de" (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&drop, une interface pourra définir quelles sont les méthodes qui serviront à la manipuler pour cette tâche précise. // Interface définissant le comportement d'un objet
// que l'on peut déplacer à la souris
// Toute classe implémentant cette interface devra
// implémenter deux méthodes startDrag et stopDrag
interface IDragable {
   public function startDrag():Void;
   public function stopDrag():Void;
}
// Un curseur sur une jauge doit pouvoir
// être déplacé à la souris
class Cursor implements IDragable {
   public function startDrag() {
      // Code de début de déplacement
   }
   public function stopDrag() {
      // Code de fin de déplacement
   }
}
Utilisation 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 "type hint" de PHP5). En effet, plus qu'un "carcan" 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 "affichable" ! 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 : // Interface de déplacement
interface IMovable {
   // Positionnement de l'objet
   public function moveToCoord(x:Number, y:Number);
   // Déplacement de l'objet
   public function moveByOffset(dx:Number, dy:Number);
}
// Classe d'une carte géographique
class Map implements IMovable {
   // Clip correspondant à l'affichage de la carte
   private var _targetMC:MovieClip;
   // Methode de positionnement
   public function moveToCoord(x:Number, y:Number) {
      this._targetMC._x = x;
      this._targetMC._y = y;
   }
   // Methode de déplacement
   public function moveByOffset(dx:Number, dy:Number) {
      this._targetMC._x += dx;
      this._targetMC._y += dy;
   }
}
// Scroller
class Scroller {
   function moveObject(obj:IMovable) {
      obj.moveByOffset(10,50);
   }
}

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.

Conclusion

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.

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 !

28 mai 2004

UClient : l'API Actionscript de Unity 2

Pour le développement de mon serveur PHP, je suis en train de décortiquer l'API Client du trés célèbre Unity 2 de Colin Moock, utilisé avec brio par Francis Bourre, qui nous fait profiter de ses expériences sur son blog. Voir le fonctionnement externe du client me permet de faire un serveur cohérent dans son utilisation, que ce soit en terme de communication entre les clients, mais aussi en terme d'organisation de l'arborescence des espaces de noms et différentes salles d'un serveur.

Ce post est juste destiné à inciter tout le monde, utilisateur ou non de Unity 2, à aller faire un tour du coté de la documentation de l'API UClient. En terme de conception, c'est tout à fait brillant !!! 8) L'encapsulation des fonctionnalité est étudiée au millimètre, ce qui permet une utilisation simplissime de l'API. Donc, un grand bravo à Colin Moock, même si je n'apprend à personne que ce gars là est trés fort !!! :P

25 mai 2004

Les blogs des copains : PHP, Flash, Standards

Depuis peu, les blogs prolifèrent parmi les modérateurs de MediaBox. Ouverts depuis plus ou moins longtemps, je profite de ce ticket pour leur souhaiter à tous bonne chance, et pour rattraper mon retard pour ceux que je n'ai pas annoncés ! :$

- page 7 de 15 -