« Programmation objet et géométrie/CaRScripts et nombres complexes » : différence entre les versions

Contenu supprimé Contenu ajouté
Ligne 122 :
=== Prototypage ===
 
Tout ceci fonctionne très bien, de façon dynamique et interactive. Mais la gestion de la mémoire n'est pas optimisée parce que, chaque fois qu'on crée un nouveau nombre complexe par ''new complexe(a,b)'', les méthodes de l'objet ''complexe'' sont stockées avec la nouvelle [[w:instanceInstance (programmation)|instance]] de celui-ci, ce qui, lorsqu'on crée un grand nombre de complexes, encombre inutilement la mémoire de JavaScript, surtout si on n'utilise pas toutes ces méthodes!
 
Pour remédier à ce (petit) problème, on peut définir les méthodes une fois pour toutes, dans la [[w:classe|Classe (informatique)]] ''complexe'', les méthodes, qui seront alors héritées par l'objet au moment de son instanciation (ou création). Seulement voilà: JavaScript ne possède pas de classes... Alors on fait avec ce qu'on a, c'est-à-dire avec un [[w:prototype|Programmation orientée prototype]]. Maintenant l'objet ''complexe'' est toujours défini mais seulement avec ses trois propriétés ''reelle'', ''imaginaire'' et ''image''. Les méthodes sont toutes définies dans la prototype du nombre complexe (qui est d'ailleurs un objet: L'objet ''complexe'' est aussi une méthode de l'objet ''prototype''!) comme on le voit ci-dessous:
 
<source lang="javascript">
function complexe(p){//p est un point
this.reelle = X(p);
this.imaginaire = Y(p);
this.image=p;
}
//l'objet complexe n'a maintenant que trois propriétés et pas de méthode
 
 
 
 
//début de la liste des méthodes, prototypées:
complexe.prototype.module =function(){
return Math.sqrt(this.reelle*this.reelle+this.imaginaire*this.imaginaire);
}
 
complexe.prototype.argument = function(){
return Math.atan2(this.imaginaire,this.reelle);
}
complexe.prototype.affixeCS = function(){
return (this.reelle>=0) ? (this.reelle+"+"+this.imaginaire+"i") : (this.reelle+""+this.imaginaire+"i");// a+bi pour CaRScript
}
 
complexe.prototype.affixeCM = function(){
return "(%x("+this.image+")%%+y("+this.image+")%i)" // a+bi pour CaRMetal
}
complexe.prototype.dessine = function(){
SetHide(this.image,false); //CaRMetal affiche le point
SetAlias(this,this+" "+this.affixeCM);
SetShowName(this,true); //CaRMetal affiche le nom du point suivi de son affixe
}
//fin de la liste des méthodes
 
 
 
 
function complexe_somme(a,b){//a et b sont des complexes
return new complexe(Point("x(" + a.image + ")+x(" + b.image + ")","y(" + a.image + ")+y(" + b.image+ ")"))
}
 
 
 
var z1 = new complexe(Point(3,2));z1.dessine();
var z2 = new complexe(Point(-2,1));z2.dessine();
var zsomme=complexe_somme(z1,z2);zsomme.dessine();</source>
 
=Exercices=