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

Langage Java Discussion :

Initialisation (ou bien écrire du code)


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2006
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2006
    Messages : 503
    Par défaut Initialisation (ou bien écrire du code)
    Bonjour,

    Non, ce n'est pas du tout une question de débutant, mais plutôt pour faire travailler les neurones ou pour essayer de lancer un débat.

    Dans un contexte similaire d'initialisation de constructeur, j'ai posé une question à Michael König (le coauteur du livre sur BlueJ et sur ses constructeurs dans le projet Greenfoot) qui m'a donné une réponse disons correcte.

    Mais commençons par ce code que j'ai adapté (pour la cause) directement d'un énorme projet dont j'ai repris la maintenance. La forme du code a été reprise d'une classe utilitaire sous Hibernate, avec initialisation d'une base de données mySQL, qui m'a donné bien des nausées et des heures de travail totalement inutiles:

    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
    /**
     * @author boijea - 22 Nov 2008
     */
    public class Neurone {
        {
            java.util.Random generateur = new java.util.Random();
            java.io.File monFichier = new java.io.File("Jeu" + (100 / generateur.nextInt(101))+ ".txt");
            try {
                monFichier.createNewFile();
            } catch (java.io.IOException ioe) {
            }
        }
     
        public static void main(String[] args) {
        }
    }
    Ce code est mal écrit, c'est clair, mais où sont les problèmes et qu'elle serait les améliorations possible.

    Bien sûr que je connais certaines réponses, mais je suis certain que plusieurs d'entre vous viendront avec des idées et des solutions nouvelles pour moi!

    Oui, ce genre de code existe, et j'en ai rencontré plusieurs fois des exemples dans de gros projets.

    Ici un fichier JeuXX.txt (XX = nombre) va être créé, mais quand et comment.
    A nouveau je connais la réponse, mais je suis convaincu que bien des lecteurs seront tout de même surpris!

    L'idée ici est d'avoir un XX qui a le plus souvent de petites valeurs.
    Nous pourrions rajouter du code pour ne pas réutiliser le même nombre.
    J'ai laissé exprès une faute horrible?

    Merci d'avance de vos réponses, de vos question et de code adapté!?

  2. #2
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2006
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2006
    Messages : 503
    Par défaut
    Youps ... pas trop de réaction!?!

    Bon je donne quelques pistes:
    - Que mettre dans le code main() pour activer ce code "bizarre"
    - Qu'est qui ne va pas?
    - Pourquoi est-ce mal écrit?
    - Transformer ce code: constructeur, exception, singleton, etc, etc?!?

  3. #3
    Membre Expert

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Par défaut
    Citation Envoyé par boijea Voir le message
    Ici un fichier JeuXX.txt (XX = nombre) va être créé, mais quand et comment.
    Création du fichier à l'instanciation de la classe Neurone. Et ceci pour chaque classe, pour peu qu'il n'y ait pas collision du nom de fichier (ce qui peut arriver avec ton code).

  4. #4
    Membre Expert

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Par défaut
    Je comprends pas l'utilité d'avoir un bloc de construction anonyme alors qu'un constructeur serait plus approprié (notamment pour l'éventuelle jetée d'exception).

  5. #5
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 398
    Par défaut
    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
    import java.io.File;
    import java.io.IOException;
     
    public final class Neurone {
     
      private static final void createFile() throws IOException{
        int i=0;
        File monFichier = new File("Jeu" + i + ".txt");
        while (monFichier.exists()){     
          i++;
          monFichier = new File("Jeu" + i + ".txt");
        }
        monFichier.createNewFile();
      }
     
      public static void main(String[] args) {
        try {
          Neurone.createFile();
        }
        catch (IOException e) {      
          e.printStackTrace();
        }
      }
    }
    cest un peu moins moche peut etre, vu que cest une classe utilitaire que tappelle que quand ten as besoin, des methodes static suffisent non ?

    sinon, les fichiers sont supprimes a un moment ?

  6. #6
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2006
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2006
    Messages : 503
    Par défaut
    Cette première remarque est effectivement essentielle, mais pas encore correcte à mon avis.

    Pour revenir à ce type de code, et oui, il en existe, même sur Developpez.com: voir la classe HibernateUtil.java en fin d'article.

    Avant de déposer une nouvelle version avec le code dans le constructeur, j'aimerais quand même attendre une ou deux remarques sur ce code, par exemple à quel moment il est exécuté et corriger la grosse faute.

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par boijea Voir le message
    Cette première remarque est effectivement essentielle, mais pas encore correcte à mon avis.
    Pourtant je serais également du même avis : les blocs d'initialisations d'instances ne sont pas très propre : l'appel d'une méthode private dans le constructeur serait plus lisible et plus propre...

    Citation Envoyé par boijea Voir le message
    Pour revenir à ce type de code, et oui, il en existe, même sur Developpez.com: voir la classe HibernateUtil.java en fin d'article.
    Ce n'est pas la même chose : il s'agit ici d'un bloc d'initialisation static, qui n'est exécuté qu'une seule et unique fois lors du chargement de la classe...

    Citation Envoyé par boijea Voir le message
    Avant de déposer une nouvelle version avec le code dans le constructeur, j'aimerais quand même attendre une ou deux remarques sur ce code, par exemple à quel moment il est exécuté
    Cela a déjà été dis (par Tommy31) : il est exécuté lors de la création d'une instance de la classe Neurone. Plus précisément après l'appel du constructeur parent et juste avant le code du constructeur de la classe...


    Citation Envoyé par boijea Voir le message
    et corriger la grosse faute.
    Tu parles de la division par zéro ? Il faut dire que tu te compliques la vie avec cette division inutile qui n'apporte rien ! Je ne comprend pas pourquoi tu n'as pas simplement utiliser nextInt(100) !?

    a++

  8. #8
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2006
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2006
    Messages : 503
    Par défaut
    Je réponds maintenant à franck06.

    Il y a une certaine évolution dans le bon sens.
    Mais, perso, je haie le code statique et le traitement des exceptions de cette manière: on perd beaucoup trop de temps à identifier la faute dans un gros projet.

    Il faut aussi rajouter le code du générateur aléatoire et vérifier si le fichier existe déjà (extension que j'ai proposé).

  9. #9
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par boijea Voir le message
    Mais, perso, je haie le code statique et le traitement des exceptions de cette manière: on perd beaucoup trop de temps à identifier la faute dans un gros projet.
    C'est sûr qu'avec un catch vide on retrouve vite l'origine du problème

    Citation Envoyé par boijea Voir le message
    Il faut aussi rajouter le code du générateur aléatoire et vérifier si le fichier existe déjà (extension que j'ai proposé).
    Il vérifie pourtant l'existence du fichier... alors qu'il n'y a rien de tel dans ton code.

    De plus quel est l'intérêt de la valeur aléatoire...


    Comme l'a dit Uther il faudrait déjà connaitre l'objectif de ce code...

    a++

  10. #10
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2006
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2006
    Messages : 503
    Par défaut
    Enfin ça bouge!

    L'exercice avec la division par zéro est voulue, c'est un jeu.
    Comment traiter des divisions par zéro: devons-nous les traiter et les corriger pendant le développement ou prévoir un mécanisme si cela se produit dans 2 ans.

    L'utilité du main() vide est justement pour essayer d'intéresser quelqu'un qui voudrait savoir comment ce code serait activé et quand ... quelqu'un qui n'a jamais rencontré ce genre de construction.

    Que le bloc d'initialisation soit static ou non, ne change rien au problème du traitement des exceptions. Je travaille sur un grosse application Hibernate où il m'est arrivé d'avoir mon GUI Swing qui reste en l'air chez un client à cause de ce code static dans cette classe HibernateUtil.

    Le nom de la classe s'appelle justement Neurone (pour faire un peu travailler ...). Donc du code serait intéressant en vérifiant que le fichier existe déjà. Oui, venir avec un joli code serait bien.

    Oui, il faut au minimum un new pour que ce code soit appelé. Mais peut-on le mettre dans un constructeur?

    Ce code ne va servir qu'à éviter d'utiliser de telles constructions et de construire des classes qui vérifie correctement les exceptions de genres différents.

    Moi même je code en Java et en C#, et de moins en moins en C++. Ces deux langages sont extrêmement efficace au développement. Malheureusement, un mauvais traitement des exceptions ou une mauvaise construction conduit à des heures de temps perdus!

    J'espère qu'on arrive à comprendre l'objectif de ce code!
    Prendre ma définition de base en laissant éventuellement la division par 0, rajouter le contrôle si le fichier existe et écrire du code le plus propre possible (i.e. Constructeur et exception)

  11. #11
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 398
    Par défaut
    Citation Envoyé par boijea Voir le message
    Cette première remarque est effectivement essentielle, mais pas encore correcte à mon avis.

    Pour revenir à ce type de code, et oui, il en existe, même sur Developpez.com: voir la classe HibernateUtil.java en fin d'article.

    Avant de déposer une nouvelle version avec le code dans le constructeur, j'aimerais quand même attendre une ou deux remarques sur ce code, par exemple à quel moment il est exécuté et corriger la grosse faute.
    le code est appele lorsque tu fais un new() je pense

    mais par contre le numero du fichier sera forcement <= 10 puisque tu fais 100 divise par le nombre genere
    du coup tu vas ecraser les fichiers au fur et a mesure (cest le but peut etre ? )
    mais jai pas trop pige le truc, faut reflechir a recrire ca plus proprement ou bien ?

  12. #12
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 690
    Par défaut
    Pour l'erreur, il y a 1% de chance de faire une division par 0. Il faudrait utiliser generateur.nextInt(100) + 1 au lieu de generateur.nextInt(101)

    J'avoue que j'ai un peu de mal a voir comment améliorer ce code vu que j'ai du mal a comprendre son but. Pourquoi un main vide? Comment va servir le fichier généré? Devrait-elle être utilisée comme un singleton ou une classe utilitaire statique?

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: 17/08/2006, 04h11
  3. Bien écrire en C
    Par Gruik dans le forum C
    Réponses: 13
    Dernier message: 30/05/2006, 10h02
  4. [VBA Excel] Comment écrire un code dans le ThisWorkBook ?
    Par WebPac dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/05/2005, 15h03
  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