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

1 Objectifs de ce cours (I21) Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Résumé du cours précédent.

Présentations similaires


Présentation au sujet: "1 Objectifs de ce cours (I21) Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Résumé du cours précédent."— Transcription de la présentation:

1

2 1 Objectifs de ce cours (I21) Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Résumé du cours précédent

3 2 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde -= private += public $ = static classe JeuDominos // Variable dinstance -jeu:Domino[] // Méthodes dinstance +createJeuNormal():void +jeuDominosToString():String +size():int // Cons. dun jeu vide +JeuDominos() classe Pioche // Variable dinstance -laPioche:Domino[] // Méthodes dinstance +piocheToString():String +add(Domino d):void +add(Domino[] setDominos):void +isEmpty():boolean +size():int +piocheUnDomino():Domino // Cons. de pioche vide +Pioche() classe DonneJoueur // Variable dinstance -laDonne:Domino[] // Méthodes dinstance +donneToString():String +add(Domino d):void +add(Domino[] setDominos):void +isEmpty():boolean +size():int +extractDomino(int rg):Domino +extractDomino(Domino d):Domino +joueUnDomino(Pioche pioche, LigneDeJeu ldj):boolean +getDominoMaxValueToPlay(LigneDeJeu ldj):Domino // Cons. de donne vide +DonneJoueur() // Variable dinstance -ldj:Domino[] // Méthodes dinstance +ligneDeJeuToString():String +addToRight(Domino d):boolean +addToLeft(Domino d):boolean... // Cons. de ligne vide +LigneDeJeu() classe LigneDeJeu

4 3 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde (A) CLASSE ENCAPSULANT UN TABLEAU DOBJETS Résumé Nous avons vu : comment concevoir des classes qui encapsulent des tableaux dobjets (i.e. définir quelles méthodes dinstance nous seront utiles voire indispensables pour être en mesure de manipuler leurs objets le plus simplement possible depuis extérieur) comment écrire ces classes (i.e. faire des choix dimplémentation ; par exemple, construction à vide en utilisant null) comment faire interagir les objets par une utilisation correcte de la délégation (i.e. doter les bons objets des bonnes méthodes en prenant soin de relayer les traitements à réaliser jusquaux objets qui savent le mieux les faire) comment assurer la protection de létat interne des objets depuis lextérieur (i.e. interdire la visibilité directe des variables dinstance des objets en les déclarant private)

5 4 Objectifs de ce cours (I21) Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Maintenant !

6 5 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde (B) CLASSES GÉNÉRIQUES À SPÉCIALISER Nous avons vu des classes qui encapsulent des tableaux dobjets mais, on constate : que ces classes sont complexes à écrire (i.e. principalement par rapport à la gestion dynamique des tableaux qui nécessite des ré-instanciations des tableaux et des recopies de leurs éléments) que plusieurs méthodes identiques doivent être réécrites pour chaque classe (par exemple, cest le cas des méthodes dajout, de suppression ou insertion déléments) Ces problèmes revenant souvent dans les programmes, les langages de programmations fournissent des types ou des librairies standards permettant de manipuler dynami- quement des ensembles déléments sans avoir à soccuper des aspects statiques. En Java, on dispose notamment de classes génériques prêtes à être spécialisées.

7 6 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde (B) CLASSES GÉNÉRIQUES À SPÉCIALISER : ArrayList La classe générique ArrayList Exemples de spécialisation de la classe générique : ArrayList représente, dès lors, la classe des listes de dominos ArrayList représente, dès lors, la classe des listes de livres ArrayList représente, dès lors, la classe des listes dentiers si on veut les instancier, on peut utiliser un constructeur par défaut : new ArrayList ( )instancie une liste de dominos vide new ArrayList ( )instancie une liste de livres vide new ArrayList ( )instancie une liste dentiers vide si on voulait les instancier tout en conservant leurs références, on pourrait faire : ArrayList listeDominos = new ArrayList ( ) ArrayList listeLivres = new ArrayList ( ) ArrayList listeEntiers = new ArrayList ( ) ArrayList doit être spécialisée à laide dun nom de classe dobjets (ATTENTION: ArrayList est interdit car int est un type primitif non objet)

8 7 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde (B) CLASSES GÉNÉRIQUES À SPÉCIALISER : ArrayList encapsule un ensemble dobjets : la classe ArrayList encapsule un tableau dobjets et en gère les aspects dynamiques induits par lajout, linsertion ou la suppression déléments dispose de nombreuses méthodes dinstance publiques : par rapport à lensemblesize(), isEmpty() par rapport à la lecture dans lensembleget(...), contains(...) par rapport à lécriture dans lensemble add(...), clear(), remove(...), set(...) optimisation en temps constant (soit O(1)) : obtention de la taille, test si vide, obtention dun élément, remplacement dun élément optimisation en temps linéaire (soit O(n)) mais en temps constant amorti (soit O(1)) : ajout, insertion, suppression (http://fr.wikipedia.org/wiki/Analyse_amortie) Une fois la classe générique spécialisée, on dispose dune véritable classe qui : De plus, les méthodes ont été implémentées pour sexécuter en un temps optimal : considère un ordre naturel sur lensemble : celui défini par les indices des éléments du tableau encapsulé

9 8 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde (B) CLASSES GÉNÉRIQUES À SPÉCIALISER : ArrayList elle prévoit à lavance une possible augmentation du nombre déléments : - elle gère le nombre déléments valides ainsi quune réserve demplacements libres - lorsque la réserve est vide, elle la reconstruit - finalement, elle maintient un tableau qui nest que rarement complètement rempli Comment la classe ArrayList gère-t-elle son tableau dobjet ? o1o2o3o4o5o6 o1o2o3o4o5o6o7o8o9o10 Éléments déjà présentsRéserve Taille réelle du tableau Taille réelle du tableau (plein) Nouveaux éléments présents o1o2o3o4o5o6o7o8o9o10o11 ajout dun nouvel élément Nouvelle taille réelle du tableau Nouveaux éléments présentsNouvelle réserve ajouts de 4 éléments o1o2o3o4o5o6o7o8o9o10 Lancien tableau est détruit après avoir été reconstruit et recopié

10 9 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde (B) CLASSES GÉNÉRIQUES À SPÉCIALISER : ArrayList par rapport à lensemble : int size()retourne la taille de lensemble boolean isEmpty() teste si lensemble est vide Object clone() retourne une copie de lobjet ArrayList Méthodes utiles à connaître de la classe ArrayList : par rapport à lécriture dans lensemble : boolean add(E e) ajoute un nouvel élément à la fin du tableau void add(int index, E e) insert un nouvel élément à lindice index E set(int index, E e) remplace lélément dindice index par e et retourne lancien E remove(int index) supprime lélément dindice index et le retourne boolean remove(Object o) supprime lélément o et retourne true sil existait, false sinon par rapport à la lecture dans lensemble : E get(int index)retourne lélément dindice index boolean contains(Object o) teste si lensemble contient lobjet o int indexOf(Object o) retourne lindice de lélément o ou -1 sil nexiste pas int lastIndexOf(Object o) retourne lindice du dernier élément o ou -1 sil nexiste pas...du tableau seulement (pas des éléments eux- mêmes)...retourne toujours true

11 10 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde (B) CLASSES GÉNÉRIQUES À SPÉCIALISER : ArrayList Comment utiliser la classe ArrayList ? En O-O, il existe 3 manières différentes : directement dans la classe où on se trouve On instancie directement un objet ArrayList. Puis on lutilise à travers ses méthodes dinstance (celles des ArrayList ). ex:ArrayList jeu = new ArrayList (); jeu.add(new Domino(0,0));... indirectement en lencapsulant dans une nouvelle classe On crée, par exemple, une classe JeuDominos qui encapsule un private ArrayList. Mais alors, on ne peut pas accéder aux méthodes dinstance précédentes directement de lextérieur dun objet JeuDominos. ex:JeuDominos jeu = new JeuDominos(); jeu.add(new Domino(0,0)); // erreur : la méthode add(...) nexiste pas On doit donc munir la classe JeuDominos de méthodes similaires en créant une nouvelle classe qui hérite des propriétés de lobjet ArrayList Nous en verrons par la suite Maintenant, il suffit dappliquer les méthodes disponibles Nous ne verrons cette méthode que plus tard

12 11 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde (B) CLASSES GÉNÉRIQUES À SPÉCIALISER : ArrayList Quel est le meilleur emplacement pour faire jouer les joueurs tour à tour ? classe JeuDominos // Var. instance privées -joueurs:ArrayList -joueurQuiDoitJouer:int classe JeuDominos // Var. instance privées -joueurs:Joueurs classe Joueurs // Var. instance privées -joueurs:ArrayList -joueurQuiDoitJouer:int Utilisation directe dun ArrayList On envisage une nouvelle classe Joueurs Méthode (directe) Méthode (indirecte) Encapsulation de lArrayList dans la nouvelle classe Joueurs On prévoira une méthode comme : public boolean jouerUnCoup() qui fera jouer un joueur à son tour en utilisant une variable qui indique toujours à quel joueur cest le tour de jouer. Plus proche de lutilisation de simples tableaux mais acceptable ici ! Plus proche du paradigme O-O (ce sont les joueurs qui savent qui doit jouer et quand) Le meilleur emplacement est celui où lon décide de placer l'ensemble des joueurs

13 12 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde (B) CLASSES GÉNÉRIQUES À SPÉCIALISER : ArrayList Quelles sont les conséquences qui découlent du choix de méthode ? classe JeuDominos // Var. instance privées -joueurs:ArrayList -joueurQuiDoitJouer:int classe JeuDominos // Var. instance privées -joueurs:Joueurs classe Joueurs // Var. instance privées -joueurs:ArrayList -joueurQuiDoitJouer:int Méthode (directe) Méthode (indirecte) // Méthode dinstance +jouerUnCoup():boolean On doit placer la méthode dans la classe JeuDominos // Méthode dinstance +jouerUnCoup():boolean // Méthode dinstance +jouerUnCoup():boolean Ici, cest la classe JeuDominos qui doit supporter lalgorithmique qui permet de faire jouer le bon joueur au bon moment Ici, la classe JeuDominos délègue à la classe Joueurs la connaissance et lalgorithmique qui permet de faire jouer le bon joueur au bon moment La délégation a pour effet de réduire le problème global en le morcelant en plusieurs endroits (chaque partie du pb. devient plus claire car placé à lendroit le plus judicieux)...mais, en plus, on devra prévoir quelle puisse être invoquée depuis la classe JeuDominos (seule visible de lextérieur) On doit placer la méthode dans la classe Joueurs...

14 13 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde (B) CLASSES GÉNÉRIQUES À SPÉCIALISER : ArrayList Quel est le meilleur emplacement pour faire piocher un domino ? classe JeuDominos // Var. instance privées -pioche:ArrayList classe JeuDominos // Var. instance privées -pioche:Pioche classe Pioche // Var. instance privées -pioche:ArrayList Utilisation directe dun ArrayList On envisage une nouvelle classe Pioche Méthode (directe) Méthode (indirecte) Encapsulation de lArrayList dans la nouvelle classe Pioche On prévoira la méthode : public Domino piocher() qui retournera un domino non nul pioché aléatoirement quand la pioche nest pas vide et nul sinon. On prévoira la méthode : public Domino piocher() qui retournera un domino non nul pioché aléatoirement quand la pioche nest pas vide et nul sinon. Déconseillé ici car le fait de piocher aléatoirement devient extérieur à lobjet pioche ! Plus proche du paradigme O-O (seule la pioche maîtrise la manière de piocher) Le meilleur emplacement est toujours celui qui permet de garantir que des fonctionnalités importantes soient prises en charge par une classe spécifique (=> délégation)

15 14 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde (B) CLASSES GÉNÉRIQUES À SPÉCIALISER : ArrayList Quel est le meilleur choix pour implémenter une ligne de jeu ? classe JeuDominos // Var. instance privées -ldj:LigneDeJeu classe LigneDeJeu // Var. instance privées -ldj:ArrayList On envisage une nouvelle classe LigneDeJeu La méthode (directe) nest évidemment pas adaptée ici car elle ne permet pas de réaliser un objet qui prenne en charge toutes les fonctionnalités importantes que devrait posséder une ligne de jeu. Méthode (indirecte) Encapsulation de lArrayList dans la nouvelle classe LigneDeJeu La gestion dune ligne de jeu nécessite de nombreuses méthodes car il faut, par exemple : - contrôler que les ajouts de dominos ne puissent être effectués quen début ou fin de jeu - contrôler que les dominos joués soient vraiment accolables à une extrémité de ligne de jeu - permettre de tester si des dominos donnés peuvent être joués ou non La gestion dune ligne de jeu nécessite de nombreuses méthodes car il faut, par exemple : - contrôler que les ajouts de dominos ne puissent être effectués quen début ou fin de jeu - contrôler que les dominos joués soient vraiment accolables à une extrémité de ligne de jeu - permettre de tester si des dominos donnés peuvent être joués ou non Plus proche du paradigme O-O (la ligne de jeu garantie que le jeu est correct) Le meilleur emplacement est toujours celui qui permet de garantir que des fonctionnalités importantes soient prises en charge par une classe spécifique (=> délégation)

16 15 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde (B) CLASSES GÉNÉRIQUES À SPÉCIALISER : ArrayList Résumé dun choix possible entre les 2 méthodes dutilisation des classes ensemblistes classe JeuDominos // Var. instance privées -joueurs:ArrayList -joueurQuiDoitJouer:int -jeuEnCours:boolean -pioche:Pioche -ldj:LigneDeJeu classe Joueur // Var. instance privées -donne:ArrayList -nom:String -score:int classe Pioche // Var. instance privées -pioche:ArrayList classe LigneDeJeu // Var. instance privées -ldj:ArrayList Lécriture de quelques méthodes est présentée en cours Encapsulation directe Encapsulation dans une classe ad hoc De plus, on a implicitement dans lidée quun objet JeuDominos fasse jouer un joueur en lui fournissant la pioche et la ligne de jeu......si ces 2 derniers objets nexistaient pas (au travers de classes dédiées), il serait difficile de demander à un joueur de jouer car comment pourrait-il piocher ou poser son domino sur la ligne de jeu ? Ici, on na pas jugé utile de créer une classe Joueurs cest donc le jeu de dominos lui-même qui devra gérer les joueurs et leurs tour de jouer (on a ajouter 2 variables pour cela)

17 16 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde ArrayList (exemple de code) classe JeuDominos // lensemble des joueurs et variables de conditions de jeu -joueurs:ArrayList -joueurQuiDoitJouer:int-pioche:Pioche// la pioche -jeuEnCours:boolean-ldj:LigneDeJeu// la ligne de jeu // Méthode permettant de faire jouer un coup au bon joueur public boolean jouerUnCoup () { } boolean hasPlayed = false;// le coup est supposé non joué // ne pas essayer de jouer si le jeu na pas commencé ou est terminé if ( this.jeuEnCours ) { } return hasPlayed; // renvoyer un indicateur de coup joué // faire jouer le joueur qui doit jouer... hasPlayed =//...et récupérer ce qui sest passé this.joueurs.get( this.joueurQuiDoitJouer ).jouerUnCoup(this.pioche, this.ligneDeJeu); // actualiser lindice du prochain joueur qui doit jouer... if ( hasPlayed ) { //...seulement si le joueur a joué this.joueurQuiDoitJouer = (this.joueurQuiDoitJouer+1 == this.joueurs.size() ? 0 : this.joueurQuiDoitJouer+1; } faire attention aux conditions de jeu (jeuEnCours) déléguer le fait de jouer aux joueurs (joueur.jouerUnCoup(...) actualiser les nou- velles conditions de jeu (joueurQuiDoitJouer et jeuEnCours) // actualiser une éventuelle fin de jeu actualiserFinDeJeu(); // méthode qui mettra à jour this.jeuEnCours Algorithme général : On a utilisé 2 méthodes dobjet ensembliste

18 17 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde ArrayList (exemple de code) classe Joueur // ensemble des dominos du joueur-nom:String// le nom du joueur -donne:ArrayList -score:int// le score du joueur // Méthode faisant jouer un coup à ce joueur public boolean jouerUnCoup (Pioche pioche, LigneDeJeu ldj) { } boolean hasPlayed = false;// le coup est supposé non joué // ne pas essayer de jouer quand cest impossible if ( ldj!=null && pioche!=null && !this.donne. isEmpty () ) { } return hasPlayed; // renvoyer un indicateur de coup joué // essayer de jouer les dominos les uns après les autres... int i = -1; while ( ++i < this.donne. size () ) { } //...en testant si le domino peut être joué sur la ligne de jeu if ( ldj. isAccolable ( this.donne. get (i) ) ) {... } faire attention aux conditions de jeu (pioche ou ligne de jeu incorrecte, donne initiale vide) essayer de jouer en boucle selon une certaine stratégie...en testant des dominos sur la ligne de jeu (ldj.isAccolable(d)) //...en piochant si nécessaire (si dernier domino non jouable) else if ( (i+1)==this.donne. size () && !pioche. isEmpty () ) { this.donne. add ( pioche. piocher () ); } " Algorithme général : "...en piochant si nécessaire (pioche.piocher()) On a utilisé 8 méthodes dobjet ensembliste (dont 3 qui restent encore à écrire)

19 18 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde ArrayList (exemple de code) classe Pioche // ensemble des dominos de la pioche -pioche:ArrayList // Méthode indiquant si la pioche est vide public boolean isEmpty () { // utiliser la méthode de lobjet ensembliste encapsulé return this.pioche. isEmpty (); } // Méthode permettant de piocher un domino public Domino piocher () { } Domino dominoPioché = null;// aucun domino pioché par défaut // ne pas essayer de piocher si la pioche est vide if ( ! isEmpty () ) { } return dominoPioché; // renvoyer le domino pioché (ou null) fournir une méthode permettant de savoir sil reste des dominos dans la pioche fournir une méthode permettant de piocher un domino : retourner null si la pioche est vide // former un indice aléatoire dans [0,taille de la pioche-1] int i = (int)(Math.random()*this.pioche. size ()); // extraire le domino de la pioche avant de le retourner dominoPioché = this.pioche. remove (i); " Algorithme général : " piocher un domino aléatoirement (Math.random()) On a utilisé 4 méthodes dobjet ensembliste La méthode de classe Math.random() renvoie une valeur double semi-aléatoire dans [0.0, 1.0[

20 19 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde ArrayList (exemple de code) classe LigneDeJeu // ensemble des dominos de la ligne de jeu -ldj:ArrayList // Méthode indiquant si la ligne de jeu est vide public boolean isEmpty () { // utiliser la méthode de lobjet ensembliste encapsulé return this.ldj. isEmpty (); } // Méthode permettant de savoir si un domino fourni est accolable public boolean isAccolable (Domino d) { } boolean accolableOK = (d != null);// vrai si la ligne de jeu est vide et que le domino fourni est valide, faux sinon if ( d!=null && ! isEmpty () ) { } // renvoyer la valeur booléenne return accolableOK; fournir une méthode permettant de savoir sil y a déjà un domino dans la ligne de jeu fournir une méthode permettant de savoir si un domino peut être joué : retourner true si la ligne de jeu est vide et que le domino est valide // ici, il faut tester si le domino // est accolable à droite ou à gauche accolableOK = accolableADroite(d) || accolableAGauche(d); " Algorithme général : " sinon, indiquer sil est accolable à droite ou à gauche On a utilisé 2 méthodes dobjet ensembliste Ces deux méthodes restent à écrire ainsi que de nombreuses autres dans cette classe comme cela a été présenté dans le cas dencapsulation de tableaux dobjets

21 20 Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Acta est fabula


Télécharger ppt "1 Objectifs de ce cours (I21) Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Résumé du cours précédent."

Présentations similaires


Annonces Google