Introduction à la programmation orientée objet Module 1:Position du problème Michel Poriaux HEPH Condorcet
Objectifs Position du problème : un jeu basé sur la saga « Star Wars » Une ébauche de résolution en C Les limites de la programmation procédurale Les promesses de la programmation orientée objet Michel Poriaux HEPH Condorcet
Un jeu basé sur la saga « Star Wars » x y distance Point b.(xb,yb) Point a.(xa,ya) Dark Vador Han Solo f=10 / distance Michel Poriaux HEPH Condorcet
Une ébauche de programme C typedef struct { char nom[20]; int x,y; int etat; } Personnage; float distance(Personnage pa,Personnage pb) { float d = sqrt(pow(pa.x-pb.x,2)+pow(pa.y-pb.y,2)); return d; } int main(int argc, char** argv) { Personnage p1,p2; float d,f; strcpy(p1.nom,"Solo"); p1.x=7; p1.y=15; p1.etat=30; //p1.etat=-10 //code accepté !, un coup bas de l'empire ???? strcpy(p2.nom,"Vador"); p2.x=5; p2.y=10; p2.etat=100; d=distance(p1,p2); printf("distance = %.1f m\n",d); f=10/d; p1.etat=p1.etat-(int)f; p2.etat=p2.etat-(int)f; printf("etat de %s est de %d\n",p1.nom,p1.etat); printf("etat de %s est de %d\n",p2.nom,p2.etat); return 0; } Notre code n’est pas protégé, on peut donner aux champs des structures des valeurs incohérentes. Michel Poriaux HEPH Condorcet
Partage du code //fichier starwars.h v1 typedef struct { char nom[20]; int x,y; int etat; } Personnage; #include "starwars.h" float distance(Personnage pa,Personnage pb) { float d = sqrt(pow(pa.x-pb.x,2)+pow(pa.y-pb.y,2)); return d; } int main(int argc, char** argv) { Personnage p1,p2; float d,f; strcpy(p1.nom,"Solo"); p1.x=10; p1.y=20; //p1.etat=30; //on doit changer son code ! p1.sante=30; strcpy(p2.nom,"Vador"); p2.x=5; p2.y=10; //p2.etat=100; //idem p2.sante=100; d=distance(p1,p2); printf("distance = %.1f m\n",d); … } //fichier starwars.h v2 typedef struct { char nom[20]; int x,y; int sante; } Personnage; Notre code est très sensible aux modifications de code provenant des autres éléments de l’application Michel Poriaux HEPH Condorcet
Extension du problème : l’espace x y z distance Michel Poriaux HEPH Condorcet
Un programme C « étendu » //fichier math.h typedef struct { char nom[20]; int x,y; int sante; } Personnage; typedef struct { char nom[20]; int x,y,z; int sante; } Vaisseau; #include "starwars.h" float distance(Personnage pa,Personnage pb) { float d = sqrt(pow(pa.x-pb.x,2)+pow(pa.y-pb.y,2)); return d; } //même nom de fonction interdit en c, seulement accepté en C++ float distanceV(Vaisseau va,Vaisseau vb){ float d = sqrt(pow(va.x-vb.x,2)+ pow(va.y-vb.y,2)+ pow(va.z-vb.z,2)); return d; } int main(int argc, char** argv) { Personnage p1,p2; Vaisseau v1,v2; float d; strcpy(p1.nom,"Solo"); p1.x=10; p1.y=20; p1.sante=30; strcpy(p2.nom,"Vador"); p2.x=5; p2.y=10; p2.sante=100; strcpy(v1.nom,"Millenium"); v1.x=1000; v1.y=2000; v1.z=1000; v1.sante=100; strcpy(v2.nom,"Croiseur"); v2.x=1500; v2.y=2500; v2.z=2000; v2.sante=1000; d=distance(p1,p2); printf("la distance entre %s et %s est de %.1f m\n",p1.nom,p2.nom,d); // d=distance(v1,v2)); //code refusé d=distanceV(v1,v2); printf("la distance entre %s et %s est de %.1f m",v1.nom,v2.nom,d); return 0; } Notre code n’est pas réutilisable pour des éléments plus complexes mais de même nature Michel Poriaux HEPH Condorcet
Pour aller plus loin … #include "starwars.h" float distance(Personnage *pa,Personnage *pb) { float d = sqrt(pow(pa->x-pb->x,2)+pow(pa->y-pb->y,2)); return d; } float distanceV(Vaisseau *va,Vaisseau *vb) { //même nom de fonction interdit en c, seulement accepté en C++ float d = sqrt(pow(va->x-vb->x,2)+pow(va->y-vb->y,2)+pow(va->z- vb->z,2)); return d; } void creationP(Personnage *p,char nom[],int x,int y,int sante){ strcpy(p->nom,nom); p->x=x; p->y=y; p->sante=sante; } void creationV(Vaisseau *v,char nom[],int x,int y,int z,int sante){ strcpy(v->nom,nom); v->x=x; v->y=y; v->z=z; v->sante=sante; } void setSante(Personnage *p, int s){ p->sante=s; } int getSante(Personnage *p){ return p->sante; } int main(int argc, char** argv) { Personnage p1,p2; Vaisseau v1,v2; float f,d; int s1,s2; creationP(&p1,"Solo",7,15,30); creationP(&p2,"Vador",5,10,100); creationV(&v1,"Millenium",1000,2000,1000,100); creationV(&v2,"Croiseur",1500,2500,2000,1000); d=distance(&p1,&p2); printf("la distance entre %s et %s est de %.1f m\n",p1.nom,p2.nom,d); f=10/d; s1=getSante(&p1)-(int)f; setSante(&p1,s1); s2=getSante(&p2)-(int)f; setSante(&p2,s2); printf("la santé de %s est de %d\n",p1.nom,getSante(&p1)); printf("la force de %s est de %d\n",p2.nom,getSante(&p2)); d=distanceV(&v1,&v2); printf("la distance entre %s et %s est de %.1f m", v1.nom,v2.nom,d); return 0; } Michel Poriaux HEPH Condorcet
Vers l’infini et au-delà … //fichier personnage.h typedef struct { char nom[20]; int x,y; int sante; } Personnage; void creationP(Personnage *p,char nom[],int x,int y,int sante){ strcpy(p->nom,nom); p->x=x; p->y=y; p->sante=sante; } void setSante(Personnage *p, int s){ p->sante=s; } int getSante(Personnage *p){ return p->sante; } //fichier vaisseau.h typedef struct { char nom[20]; int x,y,z; int sante; } Vaisseau; void creationV(Vaisseau *v,char nom[],int x,int y,int z,int sante){ strcpy(v->nom,nom); v->x=x; v->y=y; v->z=z; v->sante=sante; } void setSanteV(Vaisseau *v, int s){ v->sante=s; } int getSanteV(Vaisseau *v){ return v->sante; } Michel Poriaux HEPH Condorcet
Vers l’infini et au-delà … #include "personnage.h" #include "vaisseau.h" using namespace std; float distance(Personnage *pa,Personnage *pb) { float d = sqrt(pow(pa->x-pb->x,2)+pow(pa->y-pb->y,2)); return d; } float distanceV(Vaisseau *va,Vaisseau *vb) { //même nom de fonction interdit en c, seulement accepté en C++ float d = sqrt(pow(va->x-vb->x,2)+pow(va->y-vb- >y,2)+pow(va->z-vb->z,2)); return d; } int main(int argc, char** argv) { Personnage p1,p2; Vaisseau v1,v2; float f,d; int s1,s2; creationP(&p1,"Solo",7,15,30); creationP(&p2,"Vador",5,10,100); creationV(&v1,"Millenium",1000,2000,1000,100); creationV(&v2,"Croiseur",1500,2500,2000,1000); d=distance(&p1,&p2); printf("la distance entre %s et %s est de %.1f m\n",p1.nom,p2.nom,d); f=10/d; s1=getSante(&p1)-(int)f; setSante(&p1,s1); s2=getSante(&p2)-(int)f; setSante(&p2,s2); printf("la santé de %s est de %d\n",p1.nom,getSante(&p1)); printf("la force de %s est de %d\n",p2.nom,getSante(&p2)); d=distanceV(&v1,&v2); printf("la distance entre %s et %s est de %.1f m",v1.nom,v2.nom,d); return 0; } Michel Poriaux HEPH Condorcet
En conclusion La programmation procédurale est limitée par les éléments suivants : Impossibilité de contrôler les informations enregistrées lors d’un usage des structures de données par l’application principale. Sensibilité du code aux modifications des ressources utilisées(extérieures ou intérieures). Impossibilité de réutiliser le code produit pour des structures plus complexes. Impossibilité d’écrire des fonctions générales valables pour différentes structures de données. Solution La programmation orientée objet : Contrôle des données et masquage du détail de leur implémentation par le mécanisme de l’encapsulation. Réutilisation des structures existantes par le mécanisme de l’héritage. Utilisation de fonctions générales valables pour différents types de structure par le mécanisme du polymorphisme. Michel Poriaux HEPH Condorcet