Java; histoire de packages et d'interfaces

Discutez d'informatique ici !
Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

Java; histoire de packages et d'interfaces

par Rockleader » 10 Nov 2014, 14:43

Hello, j'ai un peu de mal à m'y retrouver dans tous ce fourbis, c'était tellement plus facile de travailler avec les headdeurs du c :ptdr:




Bref bref bref =)


Je possède deux packages

un que j'ai appelé tp3 et un autre que j'appelle jeu.


tp3 contient une interface et une classe implémentant cette interface.

Code: Tout sélectionner
package tp3;

public interface Sujet {
   public String getNom();
   public int getArgent();
   public void run();
   
}


En réalité vous verrez que le package tp3 contient un import venant d'un autre package, mais ici ce n'est pas ça qui m'intéresse.

Code: Tout sélectionner
package tp3;
import tp3.console.ConsoleJavaBoy;

public class PetitPrince implements Sujet{
   
   public String nom;
   public int argent;
   ConsoleJavaBoy c1;
   
   public  PetitPrince()
   {
      c1=new ConsoleJavaBoy(this);
   }

   public String getNom() {
      return this.nom;
   }

   public int getArgent() {
      return this.argent;
   }

   public void run() {
      c1.parler("Hola");
      c1.seDirigerVers(0);
   }



Le package jeu contient une classe abstraite

Code: Tout sélectionner
package jeu;

public abstract class JeuSimple {

   private String nom;
   
   public JeuSimple(String unNom)
   {
      this.nom=unNom;
   }
   
   public String getNom()
   {
      return this.nom;
   }
   
   public abstract int arbitrer(String c1, String c2);
   public abstract  String jouerUnTour();
   

}


Ainsi que plusieurs classe qui vont reprendre cette classe abstraite

Par exemple celle ci

Code: Tout sélectionner
package jeu;
import java.util.Random;
public class JeuDeDe extends JeuSimple{
   
   
   private Random random=new Random();
   
   public JeuDeDe()
   {
      super("Jeu de d�s");
   }
   
   
   public String jouerUnTour() {
      return(Integer.toString(random.nextInt(6)+1));
   }
   
   
   public int arbitrer(String c1, String c2) {
      int n1=Integer.parseInt(c1); //transforme un string en int
      int n2=Integer.parseInt(c2);
      if(n1>n2)
      {
         return -1;
      }
      else if(n1<n2)
      {
         return 1;
      }
      return 0;
   }

   

}





A ce stade là, on me demande d'implémenter une interface Joueur contenant deux void gagner et perdre.


J'ai pris la décision (peut être à tord ?) de le mettre dans le package jeu

Code: Tout sélectionner
package jeu;

public interface Joueur{
   void gagner(int argent);
   void perdre(int argent);
}



On me demande ensuite de faire une classe de test pour vérifier que le tout fonctionne correctement.

J'ai donc fais toujours dans le package jeu

package jeu;

Code: Tout sélectionner
public class Test {

   static void Arbitrer(Joueur j1, Joueur j2, JeuSimple jeu)
   {
      String chaine1=jeu.jouerUnTour();
      String chaine2=jeu.jouerUnTour();
      int gagnant=jeu.arbitrer(chaine1,chaine2);
      if(gagnant==1)
      {
         
      }
   }
   


C'est cette dernière classe qui va donc articuler un peu tout ensemble, et j'ai du mal à y voir clair.

En fonction de la valeur de gagner, je vais devoir faire un appel sur mes fonction gagner et perdre.

Donc j'aimerais pouvoir récupérer l'argent des joueurs pour faire l'appel aux fonctions codé dans Joueur.
Sauf que, dans mon joueur je n'ai aucun moyen d'accéder à l'argent.

Je me suis donc dis que Joueur devait être mis en relation avec Sujet ou bien avec PetitPrince; mais rien n'y fais je ne vois pas comment faire le lien.



Au final n'aurais je pas dû implémenter Joueur dans tp3 ? Mais dans ce cas là comment je fais pour lier cet interface avec l'autre package ???
Je suis un peu paumé comme vous pouvez le voir :hum:
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !



Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 10 Nov 2014, 15:02

Au final n'aurais je pas dû implémenter Joueur dans tp3 ? Mais dans ce cas là comment je fais pour lier cet interface avec l'autre package ???


Tu implémentes Joueur ou tu veux c'est pas gênant pour les tests.

Première chose: tu testes une classe
Code: Tout sélectionner
public class Test { //BAD
static void Arbitrer(Joueur j1, Joueur j2, JeuSimple jeu)
  {...

Code: Tout sélectionner
public class TestJeuSimple { //Better
static void Arbitrer(Joueur j1, Joueur j2, JeuSimple jeu)
  {....

Ensuite, tu testes une méthode
Code: Tout sélectionner
static void Arbitrer(Joueur j1, Joueur j2, JeuSimple jeu)
  {
    String chaine1=jeu.jouerUnTour(); //BAD
    String chaine2=jeu.jouerUnTour(); //BAD
    int gagnant=jeu.arbitrer(chaine1,chaine2);
    if(gagnant==1) //BAD
    {
     
    }

//on teste arbitrer donc on sait que si chaine1 vuat 2 et chaine2 vaut 4, on s'attend à ce que arbitrer retourne vrai
Code: Tout sélectionner
static void Arbitrer(Joueur j1, Joueur j2, JeuSimple jeu)
  {
    String chaine1="2"
    String chaine2="4"
    int gagnant=jeu.arbitrer(chaine1,chaine2);
    Java.whatever.tooShort.aBiggerNamespace.expect(gagnant).toBe(true) //better


De manière générale, tu ne veux pas te soucier de l'internal des classes.
Si argent est privé, tu n'a pas à connaitre sa valeur (si tu es utilisateur de la classe)
(et au passage, vu que argent est un truc de joueur, tu ne te préoccuperas du status de joueur que quand tu testeras...joueur)
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 10 Nov 2014, 15:38

Mais en fait, arbitrer renverra -1 si le joueur 1 gagne, 1 si le joueur 2 gagne; et 0 en cas d'égalité.


Et c'est à ce moment là que je dois faire un appel sur gagner et perdre. Et que par conséquent je dois récupérer argent.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 10 Nov 2014, 16:06

est-ce que gagner c'est une méthode de Jeu?
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 10 Nov 2014, 16:08

C'est une méthode de l'interface joueur du package jeu.

Le truc c'est que le package ou je peux récupérer argent est différent du package ou je veux m'en servir.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 10 Nov 2014, 16:37

quand tu testes JeuDeDe tu testes pas joueur.
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 10 Nov 2014, 17:01

fatal_error a écrit:quand tu testes JeuDeDe tu testes pas joueur.



Nan mais JeuDeDe ne fais pas intervenir le joueur dans son code contrairement à arbitrer dans test.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 10 Nov 2014, 17:58

Quand tu testes arbitrer. qui est la méthode de la classe JeuDede
T'en as rien à foutre de l'argent.

Donc si tu veux tester arbitrer, tout ce dont t'as besoin dans tes tests c'est :
l'accès à l'objet string (pour chaine1 et chaine2) qui sont des types de base donc pas de dépendances
l'accès au type de retour de arbitrer qui est de type int; idem

1) le test que tu écris il est mauvais.
Si tu veux à tout prix l'écrire, alors qq1 de maso t'aidera, mais c'est du code à jeter
2) si t'arrives pas à écrire un test, c'est que ton code est mauvais, mais on en est pas encore là :)

Ps:je me suis rendu compte que j'ai utilisé la méthode de ton test en passant qu'il s'agissait de la méthode réelle...bonne idée de les nommer pareil!
Code: Tout sélectionner
package jeu//synatex whatsoever
//public int arbitrer(String c1, String c2) {} la methode quon test
class Test{
 static void arbitrer-1(){ //test que t1 est gagnant
  JeuDede jeu
  int resultat = jeu.arbitrer("t1", "t2");
  java.assert(resultat == 1);
 }
 static void arbitrer-2(){ //test que t1 est perdant
  JeuDede jeu
  int resultat = jeu.arbitrer("t2", "t1");
  java.assert(resultat == -1);
 }
etc...
}
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 10 Nov 2014, 18:27

Nan mais si ça te gêne qu'on l'appelle test on peut l"appeler progPrincipal :zen:


Il y a peut être mésentente; test ne teste pas si arbitrer marche, il s'agit juste d'une classe qui contient la méthode arbitrer finale si je puis dire et dans ma spec on me demande bien de modifier l'argent dans arbitrer; si on l'avait laissé le choix il est bien évident que je n'aurais pas fait les choses ainsi même si je comprends pas tout.

PS: pour les noms là encore c'est la spec qui les donne je ne les choisis pas x)
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 10 Nov 2014, 19:32

Nan mais si ça te gêne qu'on l'appelle test on peut l"appeler progPrincipal

oui stp

ne fais pas déteindre sur nous les mauvaises pratiques que laissent trainer les profs... je dis pas qu'ils font que du mauvais mais une classe Test généralement c'est pas pour faire tourner le programme principal :hein:

concernant ton problème ya une question essentielle qu'il faut poser et qu'il faut que tu répondes à 100%.
1- est-il nécessaire de connaitre le montant du joueur?
par exemple peut etre que le joueur peu gérer tout seul son argent...
si non, alors décris ton problème précisément.

si oui, alors inévitablement il faut que joueur implémente un moyen d'accéder à ses internals.
ca veut dire: modifier son interface (qui ne contient que gagner et perdre en void)
ce qui signifie au choix:
- ajouter un accesseur (getteur)
- hériter d'un truc qui définit un accesseur (par exemple hériter de Sujet)
- implémenter un visiteur (la suivante est pas tres bonne mais elle est simple à comprendre, ya des variantes un peu mieux), idem
Code: Tout sélectionner
 dans Joueur:
void accept(Jeu jeu){
  jeu.gererArgent(this.argent); //this.argent étant l'argent du joueur
}
-------------------------------------
dans Jeu:
void gererArgent(int argent){
  //do whatever
}
void main(){
 joueur.accept(this)
}
la vie est une fête :)

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite