Conventions de nommage

Le 22 Avril 2005 à 20:21

Introduction

Pour maintenir et faire évoluer un logiciel, un programmeur doit en comprendre tous les rouages. Cette compréhension nécessite plusieurs éléments : des connaissances générales sur les tâches accomplies par le logiciel et la motivation pour accomplir ces tâches d'une certaines façon. Certains de ces éléments peuvent être explicités dans un cahier des charges et des spécifications, mais parfois le programmeur peut se retrouver avec le code source du programme pour unique référence. Si le code source est bien écrit, le programmeur pourra facilement l'étudier, ce qui aidera à la compréhension.

Le language Java a implémenté dès sa conception un outil permettant de générer une documentation à partir des fichiers source, pour peu que ces fichiers comportent des commentaires spéciaux : javadoc. Cet outil incite naturellement à expliquer le code source au plus près. De plus le Java a aussi fortement poussé les développeur à regrouper le code dans des paquetages et à isoler les modélisation en utilisant des concepts simple : un fichier pour une classe, un dossier pour un paquetage.

En revanche, pour le nommage des différentes entités (paquetages, classes, fonctions, variables), il n'y aucun mécanisme de contrôle fourni, juste des conventions basés sur l'expérience et les usages dans d'autres langages de programmation. Les conventions de nommages permettent de faciliter la lecture en permettant d'identifier la nature des entités nommées.

Les conventions existantes

Les conventions sur lesquelles je me base sont celles de Sun, le créateur du language Java [1], et celles d'Ambisoft [2]. Cependant, mes goût personnels et ma propre réflexion m'on conduit à préciser certains usage, ou bien d'utiliser ma propre convention [3].

Les bases

Le principe général est d'utiliser des descriptions en anglais en utilisant des mots complets, sauf pour des abréviations largement reconnu (HTML, par exemple). On utilisera les minuscules et on mettra la première lettre de chaque mot ou abréviation en majuscules. L'utilisation des majuscules et du caractère « souligné » (« _ ») sera explicitement précisé si besoin. Enfin on autorise l'utilisation des chiffres.

On distingue les classes de noms suivantes :

  • Nom de variable
  • Nom de type (paquetage, classe)
  • Nom de fonction (méthode, constructeur, destructeur)

Enfin on rappellera la convention concernant le nommage et l'organisation des fichiers sources : un paquetage correspond à un dossier ayant le même nom, l'imbrication des paquetages se traduit par l'imbrication des dossiers, et le code source d'une classe est placé dans un fichier portant le même nom que la classe.

Nom de variable

Un nom de variable consiste en un groupe nominal décrivant la nature de la variable (adresse, compteur, compte client, etc...) et sa fonction (point de départ, compte client à créditer, message d'erreur, etc...).

On utilisera le singulier pour les objets à l'unité, et le pluriel accompagné du terme« collection » pour les collections d'objets.

L'objectif des différentes normes sur les noms de variables est de pouvoir distinguer immédiatement la portée d'une variable, et d'éviter les collisions de nom entre deux variables de portée différentes.

On distingue les portées suivantes avec entre parenthèses des cas particuliers :

  • Variable locale (exception, variables de boucle)
  • Paramètre d'une fonction
  • Variable d'instance
  • Variable de classe modifiable
  • Variable de classe constant

Variable locale

Convention

On utilisera une description complète en anglais, tout en minuscules, les mots séparés par un caractère « souligné ». Pour les descriptions tenant sur un seul mot, on rajoutera « a » ou « an » (« un » en anglais) au début de la description.

Pour les boucles for, on tolèrera les noms de variable classique : i, j, etc...

Pour le traitement des exceptions, on tolèrera les noms de variable en e* : e, e1, exc, etc...

Exemples
an_address
customer_account
customer_account_to_credit
starting_point
error_message
html_document
customers_collection
for (i=...; ... ; ...)
{
    ...
}
try
{
    ...
}
catch (IOException e)
{
    ...
    try
    {
        ...
    }
    catch (IOException ee)
    {
        ...
    }
}

Paramètre d'une fonction

Convention

On utilisera une description complète en anglais, la premières lettre des mots sera en majuscules, à l'exception du premier mot qui sera en minuscules.

Exemples
address
customerAccount
customerAccountToCredit
startingPoint
errorMessage
htmlDocument

Variable d'instance

Convention

On suivra la même convention que pour les paramètres, mes on préfixera le nom de variable avec « my ».

Exemples
myAddress
myCustomerAccount
myCustomerAccountToCredit
myStartingPoint
myErrorMessage
myHtmlDocument

Variable de classe modifiable

Convention

On suivra la même convention que pour les paramètres, mes on préfixera le nom de variable avec « the ».

Exemples
theAddress
theCustomerAccount
theCustomerAccountToCredit
theStartingPoint
theErrorMessage
theHtmlDocument

Variable de classe constante

Convention

On utilisera une description complète en anglais, tout en majuscule, les mots séparés par un caractère « souligné ».

Exemples
ADDRESS
CUSTOMER_ACCOUNT
CUSTOMER_ACCOUNT_TO_CREDIT
STARTING_POINT
ERROR_MESSAGE
HTML_DOCUMENT

Nom de type

Le nommage des types regroupe deux classes :

  • Les paquetages (package), qui servent à regrouper logiquement ou par fonctionnalité les types.
  • Les classes (class, interface), qui modélisent un concept.

Les paquetages

Convention

On utilisera une description complète en anglais, tout en minuscules, les mots séparés par un point. Si on dispose d'un nom de domaine, le premier mot sera le domaine racine (TLD, Top Level Domaine) et le deuxième de nom de domaine.

Exemples
application.ide.widget
com.sporniket.component.io

Les classes

Convention

On utilisera une description complète en anglais, en minuscules avec la première lettre des mots en majuscules.

Plus la description sera longue, plus la classe sera spécifique. Inversement, plus la description sera courte, plus la classe sera générique

Exemples
Display
ColorDisplay
LiquidCrystalDisplay

Cas des classes abstraites

Convention

Une classe abstraite suivra la convention de nommage des classes, mais on préfixera le nom avec le terme « abstract ».

Exemples
AbstractDisplay
AbstractWidget

Cas des interfaces

Convention

Une interface suivra la convention de nommage des classes, et on distingue deux possibilités :

  • L'interface peut être décrite par un terme dénotant une capacité (mot en « -able »), auquel cas on ne rajoute rien.
  • Les autres cas, où on suffixera le nom avec le terme « interface ».
Exemples
Displayable
WidgetInterface

Nom de fonction

Un nom de fonction consiste en verbe et ses complément (« fait ceci et cela »).

On distinguera les cas suivant :

  • Cas général
  • Constructeurs
  • Destructeur
  • Accès en lecture (JavaBean)
  • Accès en écriture (JavaBean)

Cas général

Convention

Le nom de la fonction utilisera une description complète en anglais, commençant par un verbe en minuscules et éventuellement suivi de mots en minuscules avec la première lettre en majuscule.

Exemples
doThisAndThat(...)
execute(...)
addAccount(...)
openFile(...)

Constructeurs

Convention

Les spécifications du langage Java imposent aux constructeur d'avoir le même nom que la classe.

Exemples
Public class RequestBuilder
{
    public RequestBuilder()
    {
        //initialisation
    }

    public RequestBuilder(Connection connection, String request)
    {
        //initialisation
    }

    //etc...
}

Destructeur

Convention

Les spécifications du langage Java imposent au destructeur (si cela est nécessaire) le nom « finalize() ».

Accès en lecture

Convention

La convention JavaBean pour accéder à une propriété en lecture est d'utiliser le verbe « get » suivi du nom de la propriété, à l'exception des propriétés booléennes qui peuvent utiliser le verbe "is". Il y a découplage entre l'accès en lecture d'une propriété dans le cadre d'un JavaBean et son implémentation : variable d'instance ou résultat d'un traitement à effectuer.

Exemples
Public class RequestBuilder
{
    public String getRequest()
    {
        //retourne la requête
    }

    public String getResultSet()
    {
        //execute la requête et retourne le résultat
    }

    //etc...
}

Accès en écriture

Convention

La convention JavaBean pour accéder à une propriété en lecture est d'utiliser le verbe « set » suivi du nom de la propriété. Il y a découplage entre l'accès en écriture d'une propriété dans le cadre d'un JavaBean et son implémentation : affectation directe à une variable d'instance ou encore vérification et notification préalable.

Exemples
Public class RequestBuilder
{
    public void setRequest(String request)
    {
        //met à jour la requête interne
    }

    public void setNameParameter(Object value)
    {
        //effectue des tests de conformité avant l'affectation effective
    }

    //etc...
}

Cette fois c'est fini, avec le bandeau, le style du site est achevé. De plus j'ai fait les corrections qui permettent à mon site de valider, voir les petites icônes officielles en bas.

Le contentieux entre Johnny Hallyday et Universal Music illustre bien la raison pour laquelle je choisi d'ores et déjà l'autoproduction de mon futur disque.

On pourra me rétorquer que sans maison de disque, beaucoup d'artistes n'auraient pas pu vivre de leur art. Certes. C'est pour cela que j'adapte mon projet à cette contrainte : je garde mon boulot, et je mettrait mes compositions en téléchargement gratuit sur Internet, sans frais.

Toujours dans cette optique de m'autoproduire à terme (voire auto-éditer un futur roman), j'ai un projet mettant en oeuvre quelques-uns de mes talents pour obtenir le financement nécessaire.

Beaucoup de boulot en perspective, pour un résultat qui n'est pas garanti, mais quoi qu'il arrive, je me serai fait un immense plaisir, la liberté en plus...

Ce dimanche a été assez épique pour le geek du dimanche que je suis : j'ai décidé de migrer d'une Mandrake 10.0 vers Ubuntu 4.10. La raison ? Une envie de changer, de mettre à jour des logiciels, et... n'avoir qu'un seul CD à graver (N'oublions pas que je suis une grosse feignasse tout de même).

Donc je télécharge l'ISO que je grave aussi sec sur un CD, puis j'installe... Hourra ça marche, je récupère mes données, j'ai enfin accès à une résolution sympa et lisible sur mon 19 pouce : 1400 x 1050 pixels, au lieu de 1600 x 1200, et sans bidouiller le fichier de configuration. (Au passage, par défaut Ubuntu utilise la résolution maximale 1920 x 1440)

Et là c'est le drame : mon modem usb (un fast-sagem 800) reste éteint. Enfer et Damnation !!!

Heureusement, j'ai mis mes disques durs en rack, et j'ai toujours un autre disque avec un dual boot Windows 2000 (version légale complète) et Mandrake 9.1. Je peux alors aller télécharger sur le net les packages qui me manquent, installer et configurer.

Finalement, j'ai de nouveau accès au net. Alléluïa mes frères !!!

Pour mémoire

Packages Ubuntu à installer

Les packages qui suivent sont déjà présent, mais il ne sont pas installés. Il suffit d'aller dans le menu "Poste de Travail – Configuration système – Gestionnaire de paquets Synaptic"

  • linux-kernel-header
  • linux-header-<version>
  • gcc

Packages Debian

Sur un poste ayant un accès à Internet, il faut aller sur le site de Debian et chercher parmi les packages individuels.

  • module-assistant

Packages spécifique eagle-usb

Sur un poste ayant un accès à Internet, il faut aller sur le site de Eagle-usb, télécharger les packages individuels, et suivre les instructions.

  • eagle-usb-data
  • eagle-usb-module-sources
  • eagle-usb-utils