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

avec Java Discussion :

Comment bien faire du code re-utilisable ?


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Chercheur d'Emploi
    Inscrit en
    Février 2017
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'Emploi

    Informations forums :
    Inscription : Février 2017
    Messages : 86
    Par défaut Comment bien faire du code re-utilisable ?
    Salut, je souhaite crée du code réutilisable dans plusieurs programme. Une sorte d'"API" perso a mon humble niveau.

    Ce code doit generer une question aléatoire, verifier si la réponse est bonne et surtout laisser choisir le developpeur du programme en question ce qu'il veut faire en cas de bonne ou mauvaise reponse. Le tout en étant re-utiliser de la manière la plus simple et intuitive possible.

    Pour l'instant voici ou j'en suis:


    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
    import java.util.Random;
     
    public abstract class ProfDeMaths {
    	private String question;
    	private String bonneReponse;
     
    	public ProfDeMaths() {
    	}
     
    	abstract void siBonneReponse();
     
    	abstract void siMauvaiseReponse();
     
    	public void ChoisirUneQuestion() {
    		Random rand = new Random();
    		int facteur1 = rand.nextInt(99) + 1;
    		int facteur2 = rand.nextInt(99) + 1;
    		this.question = "Combien font " + facteur1 + " + " + facteur2 + " ?";
    		this.bonneReponse = "" + (facteur1 + facteur2);
    	}
     
    	public void Corriger(String reponse) {
    		if (reponse.equals(this.bonneReponse))
    			this.siBonneReponse();
    		else
    			this.siMauvaiseReponse();
    	};
     
    	public String getQuestion() {
    		return question;
    	}
     
    }

    Voila ce que ça donne une fois utilisé:

    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
    import java.util.Scanner;
     
    public class Main extends ProfDeMaths {
     
    	static ProfDeMaths prof = new Main();
    	static Scanner sc = new Scanner(System.in);
     
    	@Override
    	void siBonneReponse() {
    		System.out.println("BONNE REPONSE !");	
    	}
    	@Override
    	void siMauvaiseReponse() {
    		System.out.println("MAUVAISE REPONSE !");
    		prof.Corriger(sc.nextLine());
    	}
     
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
     
    		prof.ChoisirUneQuestion();
    		System.out.println(prof.getQuestion());	
    		prof.Corriger(sc.nextLine());
     
    	}
     
    }

    Ca marche bien sauf qu'il y a un gros problèmes:

    _ On ne peut étendre qu'une seul classe abstraite donc cette classe ProfDeMaths devient inutile si celui qui veut s'en servir veut le faire dans une classe qui herite deja d'un autre objet.

    Et un autre probleme un peu moins gros:

    _ L'implementation des methodes siBonneReponse et siMauvaiseReponse n'est pas obligatoire. Du coup sans les implementer manuellement et sans aller fouiller dans le code de ProfDeMaths on peut croire que la methode Corriger() ne fonctionne pas.


    Y'a-t-il une meilleure manière de faire qui m'éviterait ces problemes afin que ce code soit re-utilisable sans ces inconvenients ?

  2. #2
    Membre chevronné Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Par défaut
    L'idée qui me vient en lisant ton problème est de creer in Listener. Une interface qui contient les deux fonctions siBonneReponse() et siMauvaiseReponse(). Ta classe Main devrait alors implémenter cette interface et se déclarer comme listener auprès de prof.

    Class prof de math
    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
    38
    import java.util.Random;
     
    public abstract class ProfDeMaths {
    	private String question;
    	private String bonneReponse;
            private ProfDeMathsListener listener; //listener pour réagir à la réponse
     
    	public ProfDeMaths() {
    	}
     
            // Doit être fourni par l'utilisateur
            public void setListener(ProfDeMathsListener listener) {
                      this.listener = listener;
            }
     
    	public void ChoisirUneQuestion() {
    		Random rand = new Random();
    		int facteur1 = rand.nextInt(99) + 1;
    		int facteur2 = rand.nextInt(99) + 1;
    		this.question = "Combien font " + facteur1 + " + " + facteur2 + " ?";
    		this.bonneReponse = "" + (facteur1 + facteur2);
    	}
     
    	public void Corriger(String reponse) {
                //Il faut vérifier que le listener n'est pas null (si l'utilisateur a oublié d'en donner un)
                if(listener != null) {
    		if (reponse.equals(this.bonneReponse))
    			listener.siBonneReponse(); //réagir à une bonne réponse
    		else
    			listener.siMauvaiseReponse(); //réagir à une mauvaise réponse
                }
    	};
     
    	public String getQuestion() {
    		return question;
    	}
     
    }
    Interface listener :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public interface ProfDeMathListener {
     
         void siBonneReponse();
     
         void siMauvaiseReponse();
     
    }
    Class Main :

    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
    import java.util.Scanner;
     
    public class Main implements ProfDeMathListener {
     
    	static ProfDeMaths prof = new Main();
    	static Scanner sc = new Scanner(System.in);
     
    	void siBonneReponse() {
    		System.out.println("BONNE REPONSE !");	
    	}
     
    	void siMauvaiseReponse() {
    		System.out.println("MAUVAISE REPONSE !");
    		prof.Corriger(sc.nextLine());
    	}
     
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
     
                    prof.setListener(this);
    		prof.ChoisirUneQuestion();
    		System.out.println(prof.getQuestion());	
    		prof.Corriger(sc.nextLine());
     
    	}
     
    }

  3. #3
    Membre confirmé
    Homme Profil pro
    Chercheur d'Emploi
    Inscrit en
    Février 2017
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'Emploi

    Informations forums :
    Inscription : Février 2017
    Messages : 86
    Par défaut
    Merci c'est une bien meilleure solution en effet !

    Sauf que ça marche pas Pour l'instant du moins. J'ai une erreur dans la méthode Main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prof.setListener(this);
    "Cannot use this in a static context"


    J'ai éssayé mais je n'arrive pas a la résoudre ça :/

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 909
    Billets dans le blog
    54
    Par défaut
    Tu es dans la méthode main qui est statique, il t'est donc impossible d'invoquer this puisque tu n'est pas dans une instance.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre chevronné Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Par défaut
    il faut faire prof.setListener(prof);

  6. #6
    Membre confirmé
    Homme Profil pro
    Chercheur d'Emploi
    Inscrit en
    Février 2017
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'Emploi

    Informations forums :
    Inscription : Février 2017
    Messages : 86
    Par défaut
    Merci Drowan mais prof.setListener(prof) ne marche pas non plus car il attend un ProfListener et pas un Prof. J'ai cette erreur: "The method setListener(ProfListener) in the type Prof is not applicable for the arguments (Prof)"

    Je post le code de là ou j'en suis car j'ai modifié 2-3 trucs de ta réponse (tu avais parfois oublié le "s" a la fin de "ProfDeMaths" et surtout tu avais laissé la classe en abstraite. C'était bien un oubli ?)

    Prof:
    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
    import java.util.Random;
     
    public class Prof {
    	private String question;
    	private String bonneReponse;
    	private ProfListener listener;
     
    	public Prof() {
    	}
     
    	// Doit être fourni par l'utilisateur
    	public void setListener(ProfListener listener) {
    		this.listener = listener;
    	}
     
    	public void ChoisirUneQuestion() {
    		Random rand = new Random();
    		int facteur1 = rand.nextInt(99) + 1;
    		int facteur2 = rand.nextInt(99) + 1;
    		this.question = "Combien font " + facteur1 + " + " + facteur2 + " ?";
    		this.bonneReponse = "" + (facteur1 + facteur2);
    	}
     
    	public void Corriger(String reponse) {
    		if (listener != null) {
    			if (reponse.equals(this.bonneReponse))
    				listener.siBonneReponse();
    			else
    				listener.siMauvaiseReponse(); 
    		}
    	};
     
    	public String getQuestion() {
    		return question;
    	}
     
    }
    ProfListener:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public interface ProfListener {
     
         void siBonneReponse();
     
         void siMauvaiseReponse();
     
    }
    Main:

    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
    import java.util.Scanner;
     
    public class Main implements ProfListener {
     
    	static Prof prof = new Prof();
    	static Scanner sc = new Scanner(System.in);
     
    	public void siBonneReponse() {
    		System.out.println("BONNE REPONSE !");
    	}
     
    	public void siMauvaiseReponse() {
    		System.out.println("MAUVAISE REPONSE !");
    		prof.Corriger(sc.nextLine());
    	}
     
    	public static void main(String[] args) {
    		prof.setListener(prof); //The method setListener(ProfListener) in the type Prof is not applicable for the arguments (Prof)
    		prof.ChoisirUneQuestion();
    		System.out.println(prof.getQuestion());
    		prof.Corriger(sc.nextLine());
     
    	}
     
    }

Discussions similaires

  1. Comment bien déboguer son code ?
    Par D[r]eadLock dans le forum Débuter
    Réponses: 47
    Dernier message: 02/04/2024, 16h06
  2. Réponses: 3
    Dernier message: 05/06/2014, 15h26
  3. Class de mesh, comment bien faire ?
    Par Tosh dans le forum Développement 2D, 3D et Jeux
    Réponses: 8
    Dernier message: 24/04/2007, 12h24
  4. [MS/SQL 2K][Securité][Restauration]Comment bien faire ?
    Par jbat dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 18/04/2007, 11h18
  5. [VBA][Excel] Comment bien structurer son code?
    Par skystef dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/03/2007, 19h39

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