Normes de programmation pour JAVA


 

Table des matières 
1. Nomenclature
2. Organisation d'un fichier source
2.1. Commentaire global
2.2. Instructions package et import
2.3. La déclaration de la classe ou de l'interface
3. Commentaires
3.1. Commentaire de documentation de classe
3.2. Commentaire des méthodes et des constructeurs
3.3. Commentaire pour les variables de classe et d'instance
4. Indentation
5. Déclarations
5.1. Nombre de déclaration par ligne
5.2. Initialisation
5.3. Placement
5.4. Déclaration des classes (ou interface) et des méthodes
6. Les énoncés
6.1. Énoncés simples
6.2. Énoncés avec accolades
6.3. Énoncés if, if-else, if elseif else
6.4. Énoncé for
6.5. Énoncé while
6.6. Énoncé do-while
6.7. Énoncé switch
6.8. Énoncé try-catch
7. Quelques règles de programmation


1  Nomenclature

TypeRègles de nomenclatureExemples
PackagesLes noms de packages sont écrits en lettres minuscules. Pour le laboratoire DAMAS, les packages commenceront tous par "ca.ulaval.ift.damas".com.sun.eng 
ca.ulaval.ift.damas.netsa.broker
ClassesL'identificateur d'une classe devrait être un nom et il doit commencer par une majuscule. S'il y a plus qu'un mot, tous les mots commencent par des majuscules. Autant que possible, il ne faut pas utiliser d'abréviation.class Cercle; 
class ImageAnimee;
InterfacesLa nomenclature est la même que pour une classe.interface Dessinable; 
interface EventListener;
MéthodesLe nom des méthodes devrait être un verbe à l'infinitif suivi d'un complément et il doit commencer par une minuscule. Le complément peut avoir plus d'un mot. Les noms des méthodes pour accéder aux attributs devraient commencer par get ou set et être suivi par le nom de l'attribut.deplacerForme(); 
envoyerMessageATous(); 
setLargeur(); 
getLargeur();
VariablesLe nom des variables commencent par une lettre minuscule. S'il y a plus d'un mot, les autres mots commencent par une lettre majuscule. Le nom de la variable devrait être le plus significatif possible.int largeurCercle;
AttributsLe nom des attributs commencent par un symbole de soulignement. Par la suite, le premier mot commence par une lettre minuscule et les autres mots commencent par une lettre majuscule. Le nom de l'attribut devrait être le plus significatif possible.int _rayonCercle;
ConstanteLe nom des constantes sont toujours définis en lettres majuscules. Les mots composant le nom doivent être séparés par des soulignés.static final int LARGEUR_MAXIMALE = 50 ; 
static final double NIVEAU_CRITIQUE = 4.0;

2  Organisation d'un fichier source

Il y a un fichier source pour chaque classe ou interface. Voici les parties d'un fichier source dans l'ordre où ils doivent apparaître:

Ces trois parties sont définies dans les sections qui suivent.

2.1  Commentaire global

Tous les fichiers sources doivent commencer par une zone de commentaire qui spécifie:

Voici un exemple de commentaire global:

/*
* Classe: Cercle
*
* Auteur: Sébastien Paquet
*
* 13 mai 2000 Création
* 25 mai 2000 Ajout de la méthode XXX
* 12 juin 2000 Modification de la méthode YYY
*/

2.2  Instructions package et import

En dessous du commentaire global, il devrait y avoir l'instruction pour spécifier le package suivi des instructions de import. 

package java.awt;

import java.awt.peer.CanvasPeer;

2.3  La déclaration de la classe ou de l'interface

Voici les parties de la déclaration d'une classe ou d'un interface dans l'ordre dans lequel elles doivent apparaître.

PartiesNotes
Le commentaire de documentation de la classe ou de l'interface. (/**...*/)Ce commentaire est en format javadoc. Voir la section commentaire de classe pour voir la manière d'écrire ce commentaire.
L'instruction de classe ou d'interface.
Le commentaire d'implémentation de la classe ou de l'interface, si nécessaire. (/*...*/ ou //)Cette zone de commentaire devrait contenir des commentaires spécifiques à l'implémentation de la classe qui n'étaient pas pertinents d'inclure dans la section de commentaire de documentation.
Les variables de classes. (static)Les variables sont placées en ordre de visibilité: public, protected, friendly(aucun modificateur) et private. La variable de classe est précédé d'un commentaire javadoc.
Les variables d'instance.Les variables sont placées en ordre de visibilité: public, protected, friendly(aucun modificateur) et private. La variable d'instance est précédé d'un commentaire javadoc.
Le ou les constructeurs.Le code du constructeur est précédé d'un commentaire javadoc.
Les méthodes.Les méthodes devraient être ordonnées selon leur fonctionnalité plutôt que par leur visibilité. Par exemple, une méthode private peut être placée entre deux méthodes public. Le but est de rendre le code plus facile à lire et à comprendre.

3  Commentaires

Il y a trois sortes de commentaires possibles en java:

Vous devez utiliser les commentaires pour chacune des parties de votre code qui mérite d'être commentées. C'est au programmeur de juger de la pertinence d'un commentaire. Il est à noter qu'il est possible et conseillé d'utiliser les instructions HTML pour ajuster la présentation des commentaires javadoc. Par contre, les sections suivantes vous présenteront les commentaires obligatoires.

3.1  Commentaire de documentation de classe

Les commentaires de documentation de classe sont en format javadoc. Ils sont placés juste avant la déclaration de la classe. Ils commencent par une description de la classe qui est suivi par le tag @author qui spécifie le nom de l'auteur. Voici un exemple de commentaire: 

/**
* Graphics is the abstract base class for all graphics contexts
* which allow an application to draw onto components realized on
* various devices or onto off-screen images.
* A Graphics object encapsulates the state information needed
* for the various rendering operations that Java supports. This
* state information includes:
* <ul>
* <li>The Component to draw on
* <li>A translation origin for rendering and clipping coordinates
* <li>The current clip
* <li>The current color
* <li>The current font
* <li>The current logical pixel operation function (XOR or Paint)
* <li>The current XOR alternation color
* (see <a href="#setXORMode">setXORMode</a>)
* </ul>
* <p>
* Coordinates are infinitely thin and lie between the pixels of the
* output device.
* Operations which draw the outline of a figure operate by traversing
* along the infinitely thin path with a pixel-sized pen that hangs
* down and to the right of the anchor point on the path.
*
* @author Sami Shaio
*/

3.2  Commentaire des méthodes et des constructeurs

Les commentaires des méthodes et des constructeurs sont en format javadoc. Ils sont placés juste avant la déclaration de la méthode ou du constructeur. Ils commencent par une description de la méthode qui est suivi par les tags suivants:

Voici un exemple de commentaire: 

/**
* Draws as much of the specified image as is currently available
* with its northwest corner at the specified coordinate (x, y).
* This method will return immediately in all cases, even if the
* entire image has not yet been scaled, dithered and converted
* for the current output device.
* If the current output representation is not yet complete then
* the method will return false and the indicated {@link ImageObserver}
* object will be notified as the conversion process progresses.
*
* @param img the image to be drawn
* @param x the x-coordinate of the northwest corner of the
* destination rectangle in pixels
* @param y the y-coordinate of the northwest corner of the
* destination rectangle in pixels
* @param observer the image observer to be notified as more of the
* image is converted. May be <code>null</code>
* @return <code>true</code> if the image is completely
* loaded and was painted successfully;
* <code>false</code> otherwise.
* @exception IOException If an input or output exception occurred
* @see Image
* @see ImageObserver
*/
public abstract boolean drawImage(Image img, int x, int y,
ImageObserver observer) throws IOException;

3.3  Commentaire pour les variables de classe et d'instance

Les commentaires pour les variables de classe et d'instance sont en format javadoc. Ils sont placés juste avant la déclaration de la variable. Ils contiennent une brève description de l'attribut. Voici des exemples de commentaire: 

/**
* Commentaire pour la variable de classe qui s'étend
* sur plus qu'une ligne
*/
private static Object classVar2;

/** Commentaire de la variable d'instance sur une ligne. */
private Object instanceVar1;

4  Indentation

L'indentation devrait être de quatre espaces. Il est conseillé d'éviter d'utiliser des tabulations dans le code. Remplacez-les par des espaces.

Si une instruction s'étend sur plus d'une ligne, coupez-la selon les règles générales suivantes:

Voici quelques exemples: 

someMethod(longExpression1, longExpression2, longExpression3,
longExpression4, longExpression5);

var = someMethod1(longExpression1,
someMethod2(longExpression2,
longExpression3));

longName1 = longName2 * (longName3 + longName4 - longName5)
+ 4 * longname6;

/* On a utilisé une indentation de 8 espaces par rapport au niveau
supérieur, car tout serait trop collé vers la droite. */
private static synchronized horkingLongMethodName(int anArg,
Object anotherArg, String yetAnotherArg,
Object andStillAnother)
{
...
}
sinon on aurait eu:
private static synchronized horkingLongMethodName(int anArg,
Object
anotherArg,
String
yetAnotherArg,
Object
andStillAnother)
{
...
}

5  Déclarations

5.1  Nombre de déclaration par ligne

Il ne devrait y avoir qu'une déclaration par ligne. Par exemple,
int level;
int size;

est préférable à

int level, size;

5.2  Initialisation

Les variables locales devraient être initialisées à l'endroit où elles sont déclarées. Il est préférable de toujours favoriser l'initialisation à l'assignation.
int rayon = 10;

est préférable à

int rayon;
... // Des lignes de code
rayon = 10;

5.3  Placement

Déclarer les variables au début des blocs (Un bloc c'est toute portion de code délimité par des accolades). Ceci rend les déclarations de variables plus facile à identifier. Voici quelques exemples:

void myMethod()
{
int int1 = 0; // Au commencement du bloc de la méthode

if (condition)
{
int int2 = 0; // Au commencement du bloc if
...
}
}

Il y a une exception à cette règle et c'est pour les boucles for
où la variable compteur doit être déclarée à l'intérieur de
l'instruction.

for (int i = 0; i < max; i++)
{
...
}

5.4  Déclarations des classes (ou interfaces) et des méthodes

La déclaration des classes et des méthodes devrait suivre les règles suivantes:

Voici un exemple de déclaration de classe:

class Sample extends Object
{
int ivar1;
int ivar2;

Sample(int i, int j)
{
ivar1 = i;
ivar2 = j;
}

int emptyMethod() {}
}

6  Les énoncés

6.1  Énoncés simples

Il ne devrait y avoir qu'un énoncé par ligne.
argv++;  // OK
argc--; // OK
argv++; argc--; // Éviter

6.2  Énoncés avec accolades

Pour les énoncés avec accolades, il faut suivre les règles suivantes:

6.3  Énoncés if, if-else, if elseif else

Les énoncés if devraient avoir cette apparence:
if (condition)
{
énoncés;
}

if (condition)
{
énoncés;
}
else
{
énoncés;
}

if (condition)
{
énoncés;
}
else if (condition)
{
énoncés;
}
else
{
énoncés;
}

Note: Les énoncés if utilisent toujours les accolades.

//Éviter cela
if (condition)
énoncés;

6.4  Énoncé for

Les énoncés for devraient avoir cette apparence:
for (initialisation; condition; incrément)
{
énoncé;
}

6.5  Énoncé while

Les énoncés while devraient avoir cette apparence:
while (condition)
{
énoncés;
}

6.6  Énoncé do-while

Les énoncés do-while devraient avoir cette apparence:
do
{
énoncés;
}
while (condition);

6.7  Énoncé switch

Tous les énoncés switch doivent contenir un case default. Les énoncés switch devraient avoir cette apparence:
switch (condition)
{
case ABC:
énoncés;
break;

case DEF:
énoncés;
break;

default: //Obligatoire
énoncés;
break;
}

6.8  Énoncé try-catch

Les énoncés try-catch devraient avoir cette apparence:
try
{
énoncés;
}
catch (ExceptionClass e)
{
énoncés;
}

Un énoncé try-catch peut être suivi d'un finally qui est toujours
exécuté, que le bloc try soit réussi ou non.

try
{
énoncés;
}
catch (ExceptionClass e)
{
énoncés;
}
finally
{
énoncés;
}

7  Quelques règles de programmation

Voici quelques règles qu'il est préférable de suivre lors de la programmation.