18 février 2010
Imprimer ce billet

Nommage en Anglais ou Francais ou Franglais

Au démarrage d'un projet et à des fins de qualité de développement l'équipe doit s'imposer des conventions et des bonnes pratiques à respecter tout au long de ce projet. Il existe de nombreuses bonnes pratiques admises. Par exemple pour les nommages des variables et attributs on utilise le Camel Case, comme le suggère les conventions de nommage Sun.

Cependant, à la question "dois je utiliser l'anglais ou le français pour nommer mes classes et mes méthodes?", il n'y a pas encore de consensus admis. Il y a différentes possibilités :

  • Le tout en anglais
  • Le tout en français
  • Le franglais

Le tout en anglais

Généralement c'est le choix indiscutable si vous travaillez avec des équipiers anglophones, développeurs ou fonctionnels. Cependant cela est plus discutable lorsque l'équipe métier travaille en français.

Exemple

class Person {
    String firstname;
    String lastname;

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public String getLastname() {
        return lastname;
    }
    ...
}

Défauts

La traduction de terme métier français en anglais introduit de nombreux problèmes :

  • Mauvaise traduction.
    • Ex: Conducteur ne se traduit pas Conductor mais Driver. Conductor signifie en français Contrôleur. Ce sont des faux-amis.
  • Traduction dupliquée, il existe différentes traductions acceptables pour un même terme métier. Plus tard les développeurs vont se demander pourquoi deux traductions? parle-t-on de la même chose?
    • Ex : Travail en anglais peut se traduire par Employ, Job
  • Traduction vague, mauvaise traduction automatique.
    • gameOfData => jeu de données, la traduction mot à mot est bonne mais jeu de données se traduit setOfData.
  • etc ... il faut donc créer un lexique de traduction des termes métiers. Cela demande encore plus de travail. Ce n'est pas très réaliste.

Avantages

  • Généralement, les développeurs ont l'habitude de manipuler l'anglais mais seulement dans un contexte technique et pas fonctionnel
  • Possible avec des équipes polyglottes, l'anglais reste la langue de référence
  • Indispensable, pour les projets internationaux et Open Source

Le tout en français

FBI, Fausse Bonne Idée.

Exemple

class Personne {
    String prenom;
    String nom;

    public void fixerNom(String) {
        this.nom = nom;
    }

    public String obtenirNom() {
        return nom;
    }
}

On constate rapidement qu'il n'est pas naturel, pour un développeur, de traduire get et set. Il en est de même pour un certain nombre d'artefacts qui sont en anglais :

  • Les patterns : Singleton, Repository.
  • Les qualifieurs de classe : Repository, Service, DAO.
  • Les qualifieurs de méthode : find, set, get.
  • etc ...

Défauts

  • Les frameworks ne supportent pas toujours le français l'exemple le plus connu est la convention java bean.

Avantages

  • Plus de problèmes de traduction.

Le Franglais

Quitte à se mettre à dos Jacques Toubon, il me semble que le meilleur compromis est le franglais. Les artefacts métiers sont nommés en français. Les artefacts techniques sont nommés en anglais.

Exemple

Dans l'exemple suivant on mélange à la fois des termes métiers en français, objets et règles métiers, et des termes techniques en anglais, pattern specification

public class RegleProduitsPanierSontOranges extends LeafSpecification<Panier> {

    public boolean isSatisfiedBy(Panier panier) {
        for (Produit produit : panier.getProduits()) {
            if ( ! (produit instanceof Abricot
                    || produit instanceof Carotte
                    || produit instanceof Citrouille
                    || produit instanceof Mandarine
                    || produit instanceof Orange)) {
                return false;
            }
        }
        return true;
    }

}

Défauts

  • Au premier abord, il peut être choquant de lire du code à moitié de l'anglais à moitié du français. On s'habitue, il suffit juste de définir la bonne frontière. Les termes métiers sont en français, le reste en anglais.

Avantages

  • On est le plus explicite et le plus précis possible dans le choix de nos noms de classes, méthodes, packages et variables, dans sa langue maternelle
  • Les fonctionnels et les développeurs ont un langage commun (en DDD c'est l'ubiquitous language). Pour un langage commun il faut donc une langue commune, idéalement c'est la langue maternelle parlée par les fonctionnels.

Conclusion

Dans le cas de projets internationaux ou si le fonctionnel travaille en anglais il est indispensable d'utiliser l'anglais pour le nommage des artefacts du code source.
Par contre si le fonctionnel travaille en français, alors le choix n'est plus aussi tranché.

Pour le nommage des artefacts, il faut avoir quelques idées directrices en tête :

  • Être précis et explicite (i.e. efficace) dans le choix des noms des artefacts.
  • Idéalement, être auto-documenté. 5 lignes de javadoc pour expliquer le pourquoi du comment du choix de la traduction est superflu.
  • Respecter ces règles est un grand pas en avant pour la maintenance de l'application.
  • Une classe mal nommée introduit une dette technique.
  • Ne pas hésiter à faire différents refactorings pour trouver le meilleur nom.
  • Si vous ne trouvez pas un nom satisfaisant, parlez en au reste de l'équipe de développement et fonctionnelle.

Le choix de langage de nommage n'est pas un détail. Dans un contexte de projet entièrement francophone, il m'est arrivé de choisir le tout en anglais. Mais au fil des mois et des incompréhensions dues aux traductions, nous avons de plus en plus regretté ce choix. Pour ce type de projet, je choisirai maintenant le franglais. De plus, cela permet d'être plus près des préconisations du Domain Driven Design, afin de construire l'ubiquitous language avec la langue maternelle des fonctionnels.

Mots-clefs :