La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Introduction à la programmation orientée objet Module 1:Position du problème Michel Poriaux HEPH Condorcet.

Présentations similaires


Présentation au sujet: "Introduction à la programmation orientée objet Module 1:Position du problème Michel Poriaux HEPH Condorcet."— Transcription de la présentation:

1 Introduction à la programmation orientée objet Module 1:Position du problème Michel Poriaux HEPH Condorcet

2 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

3 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

4 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

5 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

6 Extension du problème : l’espace x y z distance Michel Poriaux HEPH Condorcet

7 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

8 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

9 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

10 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

11 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


Télécharger ppt "Introduction à la programmation orientée objet Module 1:Position du problème Michel Poriaux HEPH Condorcet."

Présentations similaires


Annonces Google