IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Déplacement d'un code


Sujet :

Java

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Points : 349
    Points
    349
    Par défaut Déplacement d'un code
    Bonjour à tous.
    En fait,j'essaie de mettre en pratique les pattern de création et j'ai décidé de traité un exercice dans lequel on donne les classes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    package equilibrium;
     
    import java.io.IOException;
    import java.util.Iterator;
     
    public class Game {
      static void play(Player p1, Player p2) {
     
        Iterator<Monster> it1 = p1.monsters.iterator();
        Iterator<Monster> it2 = p2.monsters.iterator();
        while(it1.hasNext() && it2.hasNext()) {
          p2.health -= it1.next().damage;
          p1.health -= it2.next().damage;
     
          if (p1.health <= 0 && p2.health <= 0) {
            System.out.println("no winner");
            return;
          }
          if (p1.health <= 0) {
            System.out.println(p2.name + " wins");
            return;
          }
          if (p2.health <= 0) {
            System.out.println(p1.name + " wins");
            return;
          }
        }
        System.out.println("draw");
      }
     
      public static void main(String[] args) throws IOException {
        Player p1 = new Player("bob", "td3/bob-deck.txt");
        Player p2 = new Player("alice", "td3/alice-deck.txt");
        play(p1, p2);
      }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    package equilibrium;
     
    public class Monster {
      public final int damage;
     
      public Monster(int damage) {
        this.damage = requireValidBounds(damage, 1, 5);
      }
     
      private static int requireValidBounds(int value, int min, int max) {
        if (value < min || value > max) {
          throw new IllegalArgumentException("" + value);
        }
        return value;
      }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    package equilibrium;
     
    import static java.util.Objects.requireNonNull;
     
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.util.ArrayList;
    import java.util.stream.Stream;
     
    public class Player {
      public final String name;
      public final ArrayList<Monster> monsters = new ArrayList<>();
      public int health;
     
      public Player(String name, String path) throws IOException {
        this.name = requireNonNull(name);
        this.health = 5;
        try(Stream<String> lines = Files.lines(Paths.get(path))) {
          lines.forEach(line -> {
            monsters.add(new Monster(Integer.parseInt(line.split(" ")[1])));
          });
        }
      }
    }
    J'ai créé une interface qu'implémentent désormais Monster et Lightning(une classe qu'on a demandé de créer qui a presque les opérations que Monster) afin de répondre à la question de fermeture du code de parsing du fichier(si c'est pas ce qu'il faut pour fermer ce code merci de m'en aviser) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    public interface InterfacePlayer{
    	ArrayList<Monster> monsters = new ArrayList<>();
    	ArrayList<Lightning> lightnings = new ArrayList<>();
     
    	public static void createPlayer(String path)throws IOException{
    		try(Stream<String> lines = Files.lines(Paths.get(path))) {
    			lines.forEach(line -> {switch(line.split(" ")[0]){
    			case "monster" :	
    				monsters.add(new Monster(Integer.parseInt(line.split(" ")[1])));
    				break;
    			case "lightning" :	
    				lightnings.add(new Lightning(Integer.parseInt(line.split(" ")[1])));
    				break;
    			default :
    				throw new IllegalArgumentException("Texte no conform.");
    			}
    			});
    		}	
    	}
    Mon souci c'est comment traiter cette question :

    On souhaite refactorer le code qui fait un switch sur le type d'action pour ne pas coder en dur tous les types possibles d'action et ainsi permettre à n'importe quel code de définir ses propres actions.
    Dans un premier temps, créer une interface ActionFactory qui va permettre d'abstraire le code de création des actions et déplacer l'implantation du code dans le main de la classe Game.
    Bref implanter le design pattern factory object.

    Merci d'avance!!!

  2. #2
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par Kasko Voir le message
    On souhaite refactorer le code qui fait un switch sur le type d'action pour ne pas coder en dur tous les types possibles d'action et ainsi permettre à n'importe quel code de définir ses propres actions.
    Qu'est ce que tu appelles une "action" ?
    Le code que tu montres semble créer des monstres et des "lightning" (ce qui ne me semble pas correspondre à une "action"). Qu'est ce que tu ne voudrais pas coder en dur ? Ajouter de nouveaux types d'elements pour un joueur (donc autre chose qu'un monstre ou qu'un "lightning" )? Ou bien permetre de personaliser le comportement de ce qu'il est possible de créer (donc personnaliser ce que fait un monstre ou un "lightning") ? Un exemple serait le bienvenu (avec des "actions" qui existeraient et une ou deux "actions" que tu voudrais pouvoir ajouter).

    Citation Envoyé par Kasko Voir le message
    Dans un premier temps, créer une interface ActionFactory qui va permettre d'abstraire le code de création des actions et déplacer l'implantation du code dans le main de la classe Game.
    Bref implanter le design pattern factory object.
    A vu de nez, ca ressemble pas trop au pattern factory qui permet d'abstraire la creation d'objets selon differents besoins. Celui-ci pourrait etre utile, par exemple, dans un cas comme le tien si tes monstres/lightnings peuvent etre lu depuis differentes sources (BDD, fichier config, serveur, ...). Mais je n'ai pas l'impression que ce soit ce que tu cherches.

    Si tu veux pouvoir ajouter des types de données dans ta classe Player en découplant au maximum, peut etre peux tu utiliser la reflexion pour que le premier element de chaque ligne contienne la classe à instancier. Puis, par reflexion, tu peux instancier la classe qui va bien. Mais bon, encore une fois, je ne suis pas sur de ce que tu recherches exactement.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Points : 349
    Points
    349
    Par défaut
    Salut,

    Citation Envoyé par hwoarang Voir le message
    Qu'est ce que tu appelles une "action" ?
    Une action représente soit un Monster soit un lightning soit un autre type qu'on pourra ajouter.

    Citation Envoyé par hwoarang Voir le message
    Qu'est ce que tu ne voudrais pas coder en dur ?
    Ce sont les actions.Si vous avez remarqué on détermine une action(monster ou lightning) en fonction d'un switch(avec une chaine de caractère) donc on veux éviter ça pour que ça puisse prendre n'importe quel type(par exemple au cas où on ajoute un autre type)

    Citation Envoyé par hwoarang Voir le message
    A vu de nez, ca ressemble pas trop au pattern factory qui permet d'abstraire la creation d'objets selon differents besoins
    Bon comme l'exercice est sur internet je vous fournis le lien c'est ici afin que vous puissiez voir clair.
    La question que j'ai posée est la 7ème de l'exercice et l'interface que j'ai fournis dans mon premier post est celle répondant aux questions précédentes(mais si c'est pas la bonne réponse merci de m'en aviser).

    Merci d'avance!!!

  4. #4
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Il faut que tu identifies ce qui est commun à toutes tes actions (à mon avis, on devrait plutot parler de cartes, ca me parait plus logique).
    L'idée, ce sera de créer une interface/classe abstraite "Card" et que tes monstres/ligntning heritent de celle-ci. Elle devra definir des methodes abstraites correspondant aux actions qu'une carte peut effectuer. Tes monstres/lightning devront les implementer et faire ce qu'ils ont à faire dans celle-ci.
    Ensuite, tu peux créer un objet "CardFactory" avec une fonction qui ressemble à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Card createCard(String type, String parameters)
    Cette fonction contiendra le switch et retournera l'objet créé. Note que tu vas te retrouver face à un probleme avec tes 2 arraylist dans Player.
    A toi de voir comment le regler.

    Note que ce TP m'a l'air plutot pas mal pour comprendre les concepts d'heritage donc ca vaut le coup de se creuser un peu la tete dessus.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Points : 349
    Points
    349
    Par défaut
    Citation Envoyé par hwoarang Voir le message
    Note que ce TP m'a l'air plutot pas mal pour comprendre les concepts d'heritage donc ca vaut le coup de se creuser un peu la tete dessus.
    Merci pour tout.

Discussions similaires

  1. Déplacement de robot - code à corriger
    Par 114_49 dans le forum C
    Réponses: 6
    Dernier message: 11/09/2014, 16h50
  2. [AC-2010] code vb pour bouton de déplacement dans formulaire
    Par paulux67 dans le forum IHM
    Réponses: 7
    Dernier message: 06/08/2012, 21h56
  3. [AC-2007] Mettre du code sur le déplacement d'un formulaire ?
    Par CrasherSEP dans le forum VBA Access
    Réponses: 5
    Dernier message: 17/06/2011, 11h40
  4. Code machine et bits de déplacement
    Par -Mod- dans le forum x86 32-bits / 64-bits
    Réponses: 1
    Dernier message: 05/04/2011, 21h51
  5. [Formulaire] Code Bouton déplacement
    Par popo68 dans le forum IHM
    Réponses: 2
    Dernier message: 06/12/2006, 13h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo