Partage
  • Partager sur Facebook
  • Partager sur Twitter

Organiser son code

Sujet résolu
    16 mars 2012 à 1:18:18

    Bonjours à tous et à toutes.
    J'ai beaucoup fait de programmes Java et je me suis toujours demandé si se que je faisait était fait correctement, si mes classes étaient bien utilisés, que je n'avais pas de lignes superflues, ou encore si mon code aurait pu être fait d'une totale autre façon et que ce que j'ai écrit n'est pas complètement naze.

    Alors voici: Je développe présentement un petit programme de chat. Pour l'instant je n'ai fait que la version client, le coté serveur n'est pas encore commencé :-° . Le code visuel a été fait par Matisse donc je ne peux pas l'éditer (Enfin si mais faudrait faire un gros copier collé de la classe et la refaire).

    Alors voila ce que j'aimerais que vous m'aidiez à faire: *Non je n'ai pas de devoir à remettre dans une semaine, ce code à été fait pour me pratiquer, d’ailleurs je n'ai même pas l'âge d'aller au lycée pour info* Il y a forcément quelque chose d'améliorable de ce code. J'aimerai que vous puissiez m'expliquer qu'est-ce qui ne va pas et pourquoi faut-il le changer. Je ne veux pas nécéssairement ajouter des choses, mais remplacer celle que j'ai déjà. J'ai mit des commentaire en anglais et d'autre en français parce qu’honnêtement,je dois pratiquer mon anglais :p .
    N'hésitez pas non plus à me dire ce que je fais de bien ;)

    Voici mon code: *J'ai mit en spoil pour ne pas que le code prenne trop de place*

    chat.java
    package userPackage;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    import java.util.Properties;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    import sending.send;
    
    /**
     *
     * @author Samuel Yvon
     * Chat 3.0
     */
    public  class chat extends javax.swing.JFrame {
        Properties userProp = new Properties();
        FileInputStream userPropText = new FileInputStream("C:/Users/olivier/Documents/NetBeansProjects/LogicielChat/src/userPackage/chat.properties");
        textAnalyser tx = new textAnalyser();
        
        public chat() throws FileNotFoundException, IOException {
            initComponents();
            this.setLocationRelativeTo(null);
            this.setTitle("Chat 3.0");
            System.out.println("Chat démarré");
            recevoir re = new recevoir();
            re.start();
            
        }
    
    
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {
    
            chat30Label = new javax.swing.JLabel();
            changeSettings = new javax.swing.JButton();
            jScrollPane1 = new javax.swing.JScrollPane();
            textZone = new javax.swing.JTextArea();
            jScrollPane2 = new javax.swing.JScrollPane();
            writeZone = new javax.swing.JTextPane();
            Send = new javax.swing.JButton();
    
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    
            chat30Label.setFont(new java.awt.Font("Matisse ITC", 0, 36)); // NOI18N
            chat30Label.setText("Chat 3.0");
    
            changeSettings.setText("Change settings");
            changeSettings.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    changeSettingsActionPerformed(evt);
                }
            });
    
            textZone.setColumns(20);
            textZone.setEditable(false);
            textZone.setRows(5);
            jScrollPane1.setViewportView(textZone);
    
            jScrollPane2.setViewportView(writeZone);
    
            Send.setText("Send");
            Send.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    SendActionPerformed(evt);
                }
            });
    
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(layout.createSequentialGroup()
                            .addContainerGap()
                            .addComponent(chat30Label, javax.swing.GroupLayout.PREFERRED_SIZE, 109, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(changeSettings))
                        .addGroup(layout.createSequentialGroup()
                            .addGap(30, 30, 30)
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 582, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGroup(layout.createSequentialGroup()
                                    .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 489, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                    .addComponent(Send, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                            .addGap(0, 0, Short.MAX_VALUE)))
                    .addContainerGap())
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(chat30Label)
                        .addComponent(changeSettings))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 379, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(Send))
                    .addContainerGap())
            );
    
            pack();
        }// </editor-fold>                        
    
        private void changeSettingsActionPerformed(java.awt.event.ActionEvent evt) {                                               
            // TODO add your handling code here:
        }                                              
    
        private void SendActionPerformed(java.awt.event.ActionEvent evt) {                                     
            // Codage de l'envoi terminé
            try {
                userProp.load(userPropText);
            } catch (IOException ex) {
                Logger.getLogger(chat.class.getName()).log(Level.SEVERE, null, ex);
            }
            // Analyse primaire du texte
            String toSend = writeZone.getText();
            if (toSend.charAt(0)=='/')
            { 
            doAction(tx.getCommand(toSend));
            }
            // Vérification si la signature est activée
            if (userProp.getProperty("allowSignature").equals("yes") ==true)
            {
                toSend = "["+userProp.getProperty("userName")+"] "+writeZone.getText()+"\n\n"+userProp.getProperty("signature"); 
            }else {
                toSend = "["+userProp.getProperty("userName")+"] "+writeZone.getText();
            }
            writeZone.setText("");
            System.out.println(toSend+ "||||sera envoyé");
            try {
                send sender = new send(toSend);
                sender.start();
            } catch (FileNotFoundException ex) {
                Logger.getLogger(chat.class.getName()).log(Level.SEVERE, null, ex);
            }
          
        }                                    
    
        /**
         * @param args the command line arguments
         */
        public static void main(String args[]) {
        
            
            java.awt.EventQueue.invokeLater(new Runnable() {
    
                public void run() {
                    try {
                        new chat().setVisible(true);
                    } catch (FileNotFoundException ex) {
                        Logger.getLogger(chat.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IOException ex) {
                        Logger.getLogger(chat.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            });
        }
        // Variables declaration - do not modify                     
        private javax.swing.JButton Send;
        private javax.swing.JButton changeSettings;
        private javax.swing.JLabel chat30Label;
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JScrollPane jScrollPane2;
        private javax.swing.JTextArea textZone;
        private javax.swing.JTextPane writeZone;
        // End of variables declaration                   
    
        private void doAction(int command) {
            // Do action est la classe qui fait l'action de l'int que textAnalyser Retourne
            if (command ==1)
                System.exit(0);
            
        }
        
        
        public class recevoir extends Thread
        {
          
            public void run ()
            {
            while(true){
                try {
                   DatagramSocket socket = new DatagramSocket(300);
                   byte[] buffer = new byte[1500];
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
                    try {
                        socket.receive(packet);
                    } catch (IOException ex) {
                        Logger.getLogger(chat.class.getName()).log(Level.SEVERE, null, ex);
                    }
            InetAddress clientAddress = packet.getAddress();
            int port = packet.getPort();
            System.out.println("Reception de : " + clientAddress.getHostName() + " : " + new String(packet.getData(), 0, packet.getLength()));
            textZone.setText(textZone.getText()+"\n"+new String(packet.getData(),0,packet.getLength()));   
                } catch (SocketException ex) {
                    Logger.getLogger(chat.class.getName()).log(Level.SEVERE, null, ex);
                }
            
            }
            }
            
        }
          
    }
    

    textAnalyser.java
    package userPackage;
    
    /**
     *
     * @author Samuel Yvon
     * Chat version 3.0
     */
    public class textAnalyser {
       int x=0; 
        
        //To do here: Delete the x variable and add commands
        int getCommand(String text)
        {
           if (text.equals("/stop")==true)
               return 1;
        
           
            
            return x;
        }
    
        
        
    }
    

    send.java
    /*
     
    
    package sending;
    
    import java.io.FileInputStream;
    import java.util.Properties;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.net.*;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    /**
     *
     * @author Samuel Yvon
     */
    public class send extends Thread {
        String toSend;
        Properties userProp = new Properties();
        FileInputStream userPropText = new FileInputStream("C:/Users/olivier/Documents/NetBeansProjects/LogicielChat/src/userPackage/chat.properties");
        
        
        
        public send(String toSend) throws FileNotFoundException
        {
          this.toSend = toSend;
          
        }
        
        
        
        
        
        @Override
         public void run(){
            try {
                userProp.load(userPropText);
            } catch (IOException ex) {
                Logger.getLogger(send.class.getName()).log(Level.SEVERE, null, ex);
            }
            
            // DataGram Socket
         try {
          DatagramSocket socket = new DatagramSocket();
          String ip = userProp.getProperty("serverAdress");
          InetSocketAddress serverAddress = new InetSocketAddress(ip, 300);
          byte[] bG = toSend.getBytes();
          DatagramPacket packet = new DatagramPacket(bG, bG.length, serverAddress);
          packet.setData(toSend.getBytes());
                          
                try {
                    socket.send(packet);  System.out.println("Données envoyés avec succès, les voici:" + packet);
                } catch (IOException ex) {
                    Logger.getLogger(send.class.getName()).log(Level.SEVERE, null, ex);
                }
            } catch (SocketException ex) {
                Logger.getLogger(send.class.getName()).log(Level.SEVERE, null, ex);
            }
      
        
          
         
         
             
             
             
             
            
             }
            
                      
    
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
      16 mars 2012 à 9:49:35

      Salut,
      Petit truc qui me "choque" en parcourant rapidement:

      - mélange français/anglais , choisis l'un ou l'autre mais pas les deux en même temps, surtout pour les noms de fonctions/classe.

      - manque des imports du coup ta plein de truc à rallonge partout.

      - déclaration d'attribut de la classe au milieu du code.

      - Sur ton layoutsetHorizontal/VerticalGroup il vaut mieux éviter d'enchainer les appels de fonction comme ça, utilise des objets intermédiaires , tu perds pas en performance et tu gagnes grandement en lisibilité.

      - duplication de code : exemple les attributs userPropText,userProp (peut être en mettre static,final...)

      - "Recevoir" est inner classe mais je vois pas trop pourquoi, l'encapsulation des données n'es pas trop respecté (tout tes attributs sont publics).

      - sinon au niveau architecture il n'y pas vraiment d'utilisation de design pattern ou de séparation métier/présentation, c'est une peu à l'artisanal mais quand on débute c'est pas très grave , mais je t'invite quand même a te renseigner sur les classiques, ça te sera toujours utils et vaux mieux pas prendre trop de mauvaises habitude.
      • Partager sur Facebook
      • Partager sur Twitter
        16 mars 2012 à 13:49:27

        Merci!
        Je corrige déjà l'anglais/ français, c'est vrai que c'était n'importe quoi.
        J'avais pas penser au static pour le .properties c'est pas bête =P
        La classe recevoir (maintenant receive) est inner class parce qu'un thread ne peut pas retourner quelque chose du moins j'ai pas réussi :( alors comme il est inner class je peux direcement lui faire afficher le texte reçu dans mon textZone. Pour ce qui est du visuel, je le fait avec un éditeur pour le gridbagLayout sinon je l'aurait pas fait du tout comme ça. Sinon explique les import je comprends pas trop.

        Enfin merci du commentaire constructif !
        • Partager sur Facebook
        • Partager sur Twitter
          16 mars 2012 à 15:53:05

          Je suis tout à fait d'accord pour dire que le thread me soit pas contenu dans la vue...
          Une manière plus propre consisterait à faire une classe apparentière dans un package "communication". Ensuite, tu pourrais utiliser le pattern observer...

          Par exemple : Quand tpn thread reçoit une réponse, il la transmet à une classe de ta couche modéle. Cette classe modèle notifierait ta classe Chat qu'elle a reçu la réponse du thread et lui communiquerait la valeur de la réponse...


          Tu peux jetter un coup d'oeil sur le design pattern Observer. Il est assez facile à apprendre.
          • Partager sur Facebook
          • Partager sur Twitter
            17 mars 2012 à 0:57:58

            Merci à vous deux! Je code la version serveur et je vais particulièrement tenir compte de ce que vous m'avez dit. Enfin je vais essayer =p
            • Partager sur Facebook
            • Partager sur Twitter
              17 mars 2012 à 10:00:22

              Oui, essaie :) Si tu as des soucis, je pourrai te montrer certains de mes codes.
              • Partager sur Facebook
              • Partager sur Twitter

              Organiser son code

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown