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 :

Bien écrire son code


Sujet :

avec Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut Bien écrire son code
    Bonjour à tous,

    Alors voilà je suis confronté à un problème qui était inévitable.
    J'ai codé une application depuis 1 mois maintenant, mais je n'ai utilisé que très peu de méthodes.

    Tout mon code est une succession de if de for etc...
    Tout fonctionne mais c'est illisible.

    J'ai négligé le concept de méthode. J'ai donc décidé de tout reprendre à zéro et de tout réécrire avec des méthodes.

    J'ai donc quelques questions :

    - J'ai compris qu'une méthode sert à éviter la répétition de codes. Est ce que ça ne sert que à ça ou à d'autres choses ?
    - Dans mon application j'ai des boutons qui, lors d'un clic, traitent des informations et les retournent. Ai-je besoin de réécrire ce type de code dans une méthode si je ne l'utilise qu'une seule fois ?

    Voilà voilà

    Merci pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Moux88 Voir le message
    - J'ai compris qu'une méthode sert à éviter la répétition de codes. Est ce que ça ne sert que à ça ou à d'autres choses ?
    ça sert aussi à décuper ton code en briques dont le role est clairement identifiable. Si je crée une méthode lireFichier(String chemin), même si elle n'est appelée qu'à un seul endroit, je sais au moins facilement à quoi sert ce bloc de code. Et quand je lit l'appel coté appelant, je vais plus vite à lire.

    Citation Envoyé par Moux88 Voir le message
    - Dans mon application j'ai des boutons qui, lors d'un clic, traitent des informations et les retournent. Ai-je besoin de réécrire ce type de code dans une méthode si je ne l'utilise qu'une seule fois ?
    Vu qu'il sont dans des event listenener, ils sont déjà dans des méthodes

  3. #3
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    De plus, tu seras peut-être amené a invoquer ces "commandes" via des menus donc du coup invoquer une méthode déjà toute prête pour le bouton permet d’éviter de dupliquer du code. De la même manière tu peux parfois avoir un bouton qui fait la même chose sur plusieurs écrans, a nouveau invoquer une méthode t’évite de recopier le code. Etc. etc. etc.
    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

  4. #4
    Membre éprouvé
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Points : 1 256
    Points
    1 256
    Par défaut
    Les méthodes, mieux vaut trop que pas assez. C'est un peu l'atome logique d'un programme. A partir du moment ou un bout de code a une logique cohérente sur laquelle tu peux mettre un nom, met le dans une méthode.

    Pour ce qui du passage.gros bloc -> méthodes, n'oublis pas que ton ide a probablement une fonction de refactoring "extraire méthode" qui va déplacer le code sélectionné, le remplacer par un appel a la méthode, et chercher toutes les répétitions pour les remplacer également ...
    «Dieu ne joue pas aux dés.» - Albert Einstein. Et pan! 30 ans de retard dans la théorie quantique!
    «Tout n'est pas politique, mais la politique s'intéresse à tout.» - Nicolas Machiavel. Et surtout à ceux qui ne s'y intéressent pas.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut
    Bonjour,

    Ok merci c'est donc vraiment indispensable.
    Je vais essayer d'en faire pour tous mes boutons également.
    Par contre je n'ai pas compris le passage "gros bloc -> méthode" ?

    Pouvez-vous me donner un petit coup de main pour ma première méthode et je ferais le reste tout seul ?

    Voici mon code :

    Code placé hors du bouton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private BufferedImage imgglobal = null;
    private Image imagelabel = null;
    private ImageIcon imageagrandie = null;
    Code placé dans le bouton :
    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
     
            int x1 = jLabel1.getWidth();
            int y1 = jLabel1.getHeight();
     
            JFileChooser chooser = new JFileChooser();//création dun nouveau filechosser
    	chooser.setApproveButtonText("Choose this file..."); //intitulé du bouton
    	chooser.showOpenDialog(null); //affiche la boite de dialogue
     
            //permet d'importer tout type d'extension (jpg, jpeg bmp gif)
            try {
                imgglobal = ImageIO.read(new File(chooser.getSelectedFile().getAbsolutePath()));
                 } catch (IOException e) {
            }
     
            imagelabel = imgglobal.getScaledInstance(x1,y1,Image.SCALE_DEFAULT);
            imageagrandie = new ImageIcon(imagelabel);
     
            jLabel1.setIcon(imageagrandie);
    Alors cette fonction sert à importer une image lors du clic d'un menu. Cette image est placée dans un Jlabel et prend la taille de ce dernier.
    J'ai plein de fonctions qui traitent la même image "imgglobal" et après chaque traitement l'image est redimensionnée et placé dans le Jlabel.

    ex : imgglobal => Traitement1 => Redimensionnement/affichage
    => imgglobal => Traitement2 => Redimensionnement/Affichage
    => imgglobal => Traitement2 => Redimensionnement/Affichage etc...

    A chaque fois mon image est traité puis stockée dans la variable bufferisée "imgglobal".
    Redimensionnement/Affichage pourrait donc être une méthode également non ?

    Mes questions pour la méthode :
    - Si je comprends bien je dois définir une méthode qui retourne une variable de type image.
    - Une méthode pour le redimensionnement et l'affichage.
    - Dois-je intégrer ma variable "imgglobal" dans ma méthode ou à l'extérieur car c'est une variable globale.

    Merci beaucoup

    Pour commencer je n'arrive pas bien à savoir si je dois retourner quelque chose ou pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static void ImportImage (BufferedImage imgglobal){}
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public static BufferedImage ImportImage (imgglobal){
    return imgglobal;
    }

  6. #6
    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 Moux88 Voir le message
    Par contre je n'ai pas compris le passage "gros bloc -> méthode" ?
    Je pense que @Cafeinoman veux dire si l'on a un bloc de code qui détermine une action bien précise de lui en créer une méthode.

    Redimensionnement/Affichage pourrait donc être une méthode également non ?
    Oui ça peut être une méthode.Au passage quant au nommage de la méthode tu peux la nommer comme tu veux l'essentiel que tu comprennes ce qu'elle fait mais il est recommandé de nommer une méthode avec un nom ou un verbe qui reflète ce qu'elle fait par exemple à ta place j'aurais nommé cette méthode importer_Image.

    Dois-je intégrer ma variable "imgglobal" dans ma méthode ou à l'extérieur car c'est une variable globale.
    C'est une variable globale à ta classe dans laquelle se trouve actuellement ce bout de code mais si tu crées une méthode alors ce bout de code sera déporté dans le corps de cette méthode par conséquent je dirais oui cette variable doit être déclarée dans la méthode sinon tu devrais ajouter un paramètre de même type à ta méthode.

    Une méthode pour le redimensionnement et l'affichage
    ça dépend.Comme tu dis que cette fonction sert à importer une image lors du clic d'un menu du coup si tu connais tout les composants utilisant cette fonction ce qui est probablement sûr,tu peux ajouter un argument à ta méthode qui va te permettre de savoir sur quel composant t'as cliqué et redimensionner ton image en fonction du composant ayant déclenché l'action.

    Pour commencer je n'arrive pas bien à savoir si je dois retourner quelque chose ou pas ?
    Si tu veux appliquer des traitements sur le retour de la méthode alors oui tu dois retourner sinon ce n'est pas nécessaire.

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Kasko Voir le message
    j'aurais nommé cette méthode importer_Image.
    importerImage() ou encore mieux importImage(), autant commencer directement à respecter les conventions

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut
    super merci pour tous ces conseils

    Alors j'ai essayé de l'écrire : "labelimg" est un label que j'ai déclaré

    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
    //*****Global Variables******
        private BufferedImage imgglobal = null;
        private Image imagelabel = null;
        private ImageIcon imageagrandie = null;
        //***************************
     
        //*****Methods***************
        public BufferedImage importImage(BufferedImage imgglobal){
     
     
            int x1 = labelimg.getWidth();
            int y1 = labelimg.getHeight();
     
            try{
            imgglobal = ImageIO.read(new File("chemin"));
            } catch (IOException e) {
            }
     
            imagelabel = imgglobal;
            imagelabel = imagelabel.getScaledInstance(x1,y1,Image.SCALE_DEFAULT);
            imageagrandie = new ImageIcon(imagelabel);
            labelimg.setIcon(imageagrandie);
     
            return imgglobal;
        }
    Mais j'ai un problème avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     //*****Events****************
    private void ImageImportButton(java.awt.event.ActionEvent evt) {                                   
    this.importImage();
        }
    j'ai comme erreur :

    method importImage in class App cannot be applied to given types;
    required : BuffereImage
    found : no arguments
    reason : actual and formal argument lists differ in length

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ta méthode demande à ce qu'on lui passe un BufferedImage, ce que tu ne fait et ce qui est de toutes façons inutile car tu n'utilise pas cette information fournie en paramètre, tu la crée dans ta méthode. Du coup construit ta méthode sans paramètre. Aussi, ta valeur de retour est inutile puisque tu ne l'utilise pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        public BufferedImage importImage(){
     
            int x1 = labelimg.getWidth();
            int y1 = labelimg.getHeight();
     
            try{
               BufferedImage imgglobal = ImageIO.read(new File("chemin")); 
               imagelabel = imagelabel.getScaledInstance(x1,y1,Image.SCALE_DEFAULT);
               imageagrandie = new ImageIcon(imagelabel);
               labelimg.setIcon(imageagrandie);
            } catch (IOException e) {
            }
     
        }

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut
    Merci

    Alors désolé j'ai oublié d'écrire un bout de code. (cf ci dessous)

    Donc je comprends ma méthode permet d'affecter ma variable globale imgglobal. Et justement je veux réutiliser cette variable plus tard.
    En fait je veux pouvoir appliquer pleins de modification à mon image en touchant aux pixels mais sans que la dernière modification soit effacée.
    Cette variable est imgglobal et de type BufferedImage.

    Donc voici mon code mais j'ai une erreur qui me dit que la méthode attend un "return". Car on a déclaré un type.

    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
     
        //*****Global Variables******
        private BufferedImage imgglobal = null;
        private Image imagelabel = null;
        private ImageIcon imageagrandie = null;
        //***************************
     
        //*****Methods***************
        public  BufferedImage importImage(){
     
     
            int x1 = labelimg.getWidth();
            int y1 = labelimg.getHeight();
     
            JFileChooser chooser = new JFileChooser();//création dun nouveau filechosser
    	chooser.setApproveButtonText("Choose this file..."); //intitulé du bouton
    	chooser.showOpenDialog(null); //affiche la boite de dialogue
     
            try{
            BufferedImage imgglobal = ImageIO.read(new File(chooser.getSelectedFile().getAbsolutePath()));
            imagelabel = imgglobal;
            imagelabel = imagelabel.getScaledInstance(x1,y1,Image.SCALE_DEFAULT);
            imageagrandie = new ImageIcon(imagelabel);
            labelimg.setIcon(imageagrandie);
            } catch (IOException e) {
            }
     
     
     
        }

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut
    Ah j'ai réussi merci beaucoup ^^
    Ducoup j'ai mis public void imporImage pour éviter le return

    Merci bien

    Alors désolé encore :
    J'ai fait une deuxième méhode pour enlever le bout de code qui sert à redimensionner mon image :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public void scaleImage(){
     
            int x1 = labelimg.getWidth();
            int y1 = labelimg.getHeight();
     
            imagelabel = imgglobal;
            imagelabel = imagelabel.getScaledInstance(x1,y1,Image.SCALE_DEFAULT);
            imageagrandie = new ImageIcon(imagelabel);
            labelimg.setIcon(imageagrandie);
     
     
     
        }
    Mais j'ai l'erreur du NullPointerException car en vérifiant "imgglobal" vaut bien "null" en sortant de ma première méthode.
    Comment faire pour toujours garder la valeur de imgglobal après chaque modification?

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Points : 58
    Points
    58
    Par défaut
    Ah j'ai trouvé désolé pour le multiposte

    erreur bête j'avais déclaré ma variable en global et initialisé à null et dans ma méthode je redéclarais ma variable ducoup ma variable globale ne prenait pas de nouvelles valeurs.

    Merci à tous pour vos réponses.

+ Répondre à la discussion
Cette discussion est résolue.

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. Initialisation (ou bien écrire du code)
    Par boijea dans le forum Langage
    Réponses: 16
    Dernier message: 24/11/2008, 12h40
  3. Bien commenter son code Java
    Par shaun_the_sheep dans le forum Général Java
    Réponses: 2
    Dernier message: 27/05/2008, 11h13
  4. [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
  5. [mise en page] pour bien indenter son code
    Par bihorece dans le forum C++Builder
    Réponses: 4
    Dernier message: 06/08/2003, 16h14

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