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 :

JavaDoc : cette classe est elle bien commentée ?


Sujet :

Langage Java

  1. #1
    Membre éprouvé Avatar de jmnicolas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2007
    Messages : 427
    Points : 976
    Points
    976
    Par défaut JavaDoc : cette classe est elle bien commentée ?
    Bonjour,

    je vais me concocter un petit générateur automatique de classes basiques. Je me suis en effet rendu compte que je passais beaucoup de temps à réécrire la même chose lorsque je créais des classes dont les objets ne font que décrire quelque chose, exemple : une classe "Client" et une classe "Vendeur" ne sont pas bien différentes.

    Des variables d'instance, différents constructeurs afin de passer une valeur aux VI, des méthodes redéfinies (toString et equals) et des getters et setters.

    Mais avant de me lancer dans le code je voulais vous soumettre un exemple de ce que je compte automatiser. Il manque juste des commentaires javadoc pour les getters et les setters, mais à la main je les fais pas : trop long.

    Etant débutant, j'attends vos avis : cette classe est elle "propre", voyez vous des améliorations à apporter ?
    Merci pour vos avis

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
     
    package fr.jmn.outils ;
     
    /**
     * Un objet VariableInstance représente une variable d'instance d'une classe
     * 
     * @author Jean-Michel NICOLAS
     * @since 01 Septembre 2008
     * 
     */
    public class VariableInstance
    {
    	// nom de la variable
    	private String	nomVI ;
     
    	// type de la variable
    	private String	typeVI ;
     
    	// visibilité de la variable
    	private String	visibiliteVI ;
     
    	// valeur de la variable si non null / 0
    	private String	valeurInitiale ;
     
    	// description de la variable
    	private String	commentaireVI ;
     
    	/**
             * Constructeur sans argument : passe les arguments null / 0 au constructeur complet
             */
    	public VariableInstance ()
    	{
    		this (null, null, null, null, null) ;
    	}
     
    	/**
             * Constructeur partiel : construit un objet avec toutes les variables initialisées aux
             * arguments reçus et null / 0 pour celles non présentes
             * 
             * @param pNomVI
             *             nom de la variable
             * @param pTypeVI
             *             type de la variable
             * @param pVisibiliteVI
             *             visibilité de la variable
             */
    	public VariableInstance (String pNomVI, String pTypeVI, String pVisibiliteVI)
    	{
    		this (pNomVI, pTypeVI, pVisibiliteVI, null, null) ;
    	}
     
    	/**
             * Constructeur complet : construit un objet avec toutes les variables initialisées aux
             * arguments reçus
             * 
             * @param pNomVI
             *             nom de la variable
             * @param pTypeVI
             *             type de la variable
             * @param pVisibiliteVI
             *             visibilité de la variable
             * @param pValeurInitiale
             *             valeur de la variable si non null / 0
             * @param pCommentaireVI
             *             description de la variable
             */
    	public VariableInstance (
    	          String pNomVI,
    	          String pTypeVI,
    	          String pVisibiliteVI,
    	          String pValeurInitiale,
    	          String pCommentaireVI)
    	{
    		this.nomVI = pNomVI ;
    		this.typeVI = pTypeVI ;
    		this.visibiliteVI = pVisibiliteVI ;
    		this.valeurInitiale = pValeurInitiale ;
    		this.commentaireVI = pCommentaireVI ;
     
    	}
     
    	/**
             * Redéfinition de la méthode toString afin d'afficher les variables d'instance
             * 
             * @return une String affichant les variables d'instances séparées par un underscore _
             */
    	@Override
    	public String toString ()
    	{
    		StringBuffer sb = new StringBuffer () ;
    		sb.append (this.nomVI) ;
    		sb.append ("_") ;
    		sb.append (this.typeVI) ;
    		sb.append ("_") ;
    		sb.append (this.visibiliteVI) ;
    		sb.append ("_") ;
    		sb.append (this.valeurInitiale) ;
    		sb.append ("_") ;
    		sb.append (this.commentaireVI) ;
     
    		return sb.toString () ;
    	}
     
    	/**
             * Redéfinition de la méthode equals : on compare les variables d'instance
             * 
             * @param compar
             *             l'objet à comparer
             * @return un booléen : true si les variabels d'instance des objets sont égales, false sinon
             */
    	@Override
    	public boolean equals (Object compar)
    	{
    		// on essaye déjà de caster le paramètre : si une exception se produit c'est que l'objet
    		// n'est pas du même type donc on retourne false
    		VariableInstance aComparer = null ;
     
    		try
    		{
    			aComparer = (VariableInstance) compar ;
    		}
    		catch (ClassCastException cce)
    		{
    			return false ;
    		}
     
    		// si les variables d'instances sont identiques, on retourne true
    		if (this.nomVI.equals (aComparer.nomVI)
    		          && this.typeVI.equals (aComparer.typeVI)
    		          && this.visibiliteVI.equals (aComparer.visibiliteVI)
    		          && this.valeurInitiale.equals (aComparer.valeurInitiale)
    		          && this.commentaireVI.equals (aComparer.commentaireVI))
    		{
    			return true ;
    		}
     
    		// sinon ce n'est aps equals !
    		return false ;
    	}
     
    	public String getNomVI ()
    	{
    		return nomVI ;
    	}
     
    	public void setNomVI (String nomVI)
    	{
    		this.nomVI = nomVI ;
    	}
     
    	public String getTypeVI ()
    	{
    		return typeVI ;
    	}
     
    	public void setTypeVI (String typeVI)
    	{
    		this.typeVI = typeVI ;
    	}
     
    	public String getVisibiliteVI ()
    	{
    		return visibiliteVI ;
    	}
     
    	public void setVisibiliteVI (String visibiliteVI)
    	{
    		this.visibiliteVI = visibiliteVI ;
    	}
     
    	public String getValeurInitiale ()
    	{
    		return valeurInitiale ;
    	}
     
    	public void setValeurInitiale (String valeurInitiale)
    	{
    		this.valeurInitiale = valeurInitiale ;
    	}
     
    	public String getCommentaireVI ()
    	{
    		return commentaireVI ;
    	}
     
    	public void setCommentaireVI (String commentaireVI)
    	{
    		this.commentaireVI = commentaireVI ;
    	}
     
    }

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Bonjour.

    Non, cette classe n'est pas très propre

    Tout d'abord, les constructeurs initialisant des champs à 'null', ce n'est pas commun, et dangereux (gros risques de NullPointerException)... par exemple en utilisant ta méthode "equals()".
    Ensuite ça dépend de ton besoin, mais il est plus classique d'initialiser des chaînes de caractère à "" qu'à 'null'.

    Ensuite, concernant ta méthode "equals()", une exception ne doit jamais être interceptée en s'intégrant dans le fonctionnement "normal" d'une méthode comme s'il s'agissait d'un simple test. En effet, la création de l'objet "exception" est très gourmande en ressources. Donc on leur préfère des vrais tests, beaucoup plus légers.

    Mauvaise manière de faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    try {
       obj.methode()
    } catch (NullPointerException e) {
       // ...
    }
     
    try {
       (Clazz) obj...
    } catch (ClassCastException e) {
       // ...
    }
    Bonne manière de faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if(obj != null) {
       // ...
    } else {
       // ...
    }
     
    if(obj instanceof Clazz) {
       // ...
    }
    Toujours sur equals():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if (this.nomVI.equals (aComparer.nomVI)
    		          && this.typeVI.equals (aComparer.typeVI)
    		          && this.visibiliteVI.equals (aComparer.visibiliteVI)
    		          && this.valeurInitiale.equals (aComparer.valeurInitiale)
    		          && this.commentaireVI.equals (aComparer.commentaireVI))
    		{
    			return true ;
    		}
     
    		// sinon ce n'est aps equals !
    		return false ;
    A remplacer par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    return (this.nomVI.equals (aComparer.nomVI)
    		          && this.typeVI.equals (aComparer.typeVI)
    		          && this.visibiliteVI.equals (aComparer.visibiliteVI)
    		          && this.valeurInitiale.equals (aComparer.valeurInitiale)
    		          && this.commentaireVI.equals(aComparer.commentaireVI));
    C'est plus concis et plus clair. De manière générale:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(booleen) { return true; } else { return false; }
    est à remplacer par le simple


  3. #3
    Membre éprouvé Avatar de jmnicolas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2007
    Messages : 427
    Points : 976
    Points
    976
    Par défaut
    D'accord j'en prend bonne note, merci.
    Et sinon un commentaire ... sur les commentaires ? Vu que sur le projet où je suis je suis parti de zéro, j'ai pas eu l'occasion de voir une classe complètement commentée pour la java doc, je sais jamais trop ce qu'il faut mettre pour la doc.

  4. #4
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Pour la doc, elle semble bien.

    Maintenant, la documentation d'un code... ce n'est pas quelque chose d'absolu comme "tous les champs de la javadoc doivent être remplis".

    Il faut faire du commentaire intelligent: commenter à outrance les accesseurs n'a aucun intérêt... par contre, expliquer en commentaire la fonction (et/ou le fonctionnement) des méthodes métier complexes, ça aidera beaucoup à comprendre ton code.

  5. #5
    Membre éprouvé Avatar de jmnicolas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2007
    Messages : 427
    Points : 976
    Points
    976
    Par défaut
    Je suis d'accord avec avec toi, mais vu que ça va être généré automatiquement autant utiliser le temps gagné sur la doc.

    Parce que mine de rien, une petite classe comme ça me prend bien 15-20 minutes à pondre !

Discussions similaires

  1. InterpN est elle bien incomprehensible ?
    Par sayag dans le forum MATLAB
    Réponses: 1
    Dernier message: 29/06/2007, 08h18
  2. cette requette est elle possible?
    Par domino_dj dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/03/2007, 11h08
  3. [Express Edition (gratuit)] Cette version est elle suffisante ?
    Par dymezac dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 26/09/2006, 16h36
  4. cette requête est-elle correcte?
    Par spilliaert dans le forum Requêtes
    Réponses: 1
    Dernier message: 02/02/2006, 22h33
  5. Cette requête est-elle valide?
    Par FrankOVD dans le forum Requêtes
    Réponses: 4
    Dernier message: 13/01/2006, 19h21

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