Quels sont les pires noms de variables que vous avez déjà vus
? Un développeur identifie les deux plus mauvais noms couramment utilisés

Les rubriques (actu, forums, tutos) de Développez
Réseaux sociaux




Sur le même sujet
Le , par Hinault Romaric, Responsable Actualités
Un problème auquel est continuellement confronté le développeur dans son activité est l’attribution des noms aux variables.

Afin de faciliter la lisibilité et la compréhension du code, le programmeur opte le plus souvent pour des variables suffisamment descriptives ou se reporte à des conventions de nommage.

ANDY Lester, un développeur senior se penche dans un billet de blog sur les noms attribués aux variables et présente selon lui les deux pires noms qui sont constamment utilisés par les développeurs pour qualifier les variables.

La pire dénomination qu’un développeur peut donner à une variable est selon Lester le nom « data ».

Code php :
1
2
3
  
$data = read_record(); 
print "ID = ", $data["CUSTOMER_ID"];

« Bien sûr il y a des données ! C’est ce que contiennent les variables » écrit Lester, qui ironise par la suite. « C’est comme si vous emballez vos biens dans des cartons de déménagement et vous les étiquetez le carton des matières ».

Pour ANDY Lester, les noms des variables doivent dire quel type de données est manipulé.

En seconde position, l’utilisation des chiffres pour distinguer les variables. Exemple : data2.

Code php :
1
2
3
4
5
6
7
8
9
  
$total = $price * $qty; 
$total2 = $total - $discount; 
$total2 += $total2 * $taxrate; 
  
$total3 = $purchase_order_value + $available_credit; 
if ( $total2 < $total3 ) { 
    print "You can't afford this order."; 
}

N’importe quelle variable qui s’appuie sur un chiffre pour se distinguer d’une autre doit être immédiatement renommée. Le véritable assassin dans le code ci-dessus selon Lester est la ligne « if ($ total2 <$ total3) » qui obliger à remonter plus haut pour l’interpréter.

Ce ne sont là que deux exemples sur de mauvais noms de variables qui sont utilisés par les développeurs.

Source : Blog ANDY Lester

Et vous ?

Avez-vous déjà utilisé ces noms pour vos variables ?

Quels autres pires noms de variables avez-vous déjà vus ?


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de ShaiLeTroll ShaiLeTroll
http://www.developpez.com
Expert Confirmé Sénior
le 28/05/2012 15:16
Difficile dans l'absolu de dire qu'un nom de variable est mauvais !
Tout dépend aussi de la portée de la variable, je suis plutôt POO donc locale, membre d'instance, membre de classe, et parfois globale
Le thème de la fonction, sa complexité (si tu as 2-3 variables, un nom très court ça peu se comprendre, si tu en as 26 évidemment A..Z c'est pas terrible)
On voit cela souvent avec le SQL, les alias de table pour raccourcir la requête avec T1 à T10, hyper lisible !

Toto, un classique pour tester un code vite fait, comme Foo Bar !
Une fois que l'on sait bien utiliser la fonction, on refait au propre ! non ?

Moi, j'adore les fautes d'orthographe comme requette
Après, tu te traines ça comme nom de variable un peu partout !
Pratique lorsque tu cherche un truc, et qu'il y a pas une seule fois la même chose Req, Requete, Rqt, ...

Pour ma part, j'essaye d'avoir des fonctions assez courte et des variables nommées à part i pour mes for
Dès que j'ai deux compteurs imbriqués (assez rare), je le nomme plus longuement pour ne pas les confondre !
J'ai aussi un cartouche de documentation

J'évite des variables au nom trop court (même si cela peut rendre le code plus concis), j'ai souvent vu des variables comme _t pointant sur l'objet global Translator ! personnellement, je ne suis pas fan !
Typique aussi avec des MACRO

Pour les préfixes façon notation hongroise, je les réserve aux appels des API Windows, tout simplement parce que j'utilise les noms des paramètres de la fonction et donc que je ne les invente pas !
En général, en Delphi\C++Buider, je respecte juste
T pour Type (C pour une classe C++ pure et non Delphiesque)
A comme Arguments pour un paramètre de fonction,
F pour Field indiquant un membre privé\protégé équivalent au m_
C'est la convention historique de Borland Delphi
Je n'en vois pas d'autre

Pour mes objets, j'ai la tendance à être très verbeux, tout le monde n'aime pas comme TShaiORPersistentClassMetaDataItem,
TShaiHardwareProviderAbstractPersistentObject ou un des mes derniers TShaiCameraActionByComputerItemList.
Shai étant en réalité, le nom du projet ou de la lib interne

l'ancien programmeur était plus concis TObjetItem, TPlan, TLstItems en même temps, le code n'était pas très POO, au grand max 30 classes dans tout le projet, j'ai du en écrire 300 de plus

J'ai plein de petite classe avec une tache bien précise, je découpe beaucoup, et donc il faut trouver beaucoup de nom, parfois j'ai peu de mal, j'ai même abusé

Je fais aussi du Franglais !

TFacture.GetClient ou TFacture.GetLigneDeCommande,
au lieu de GetCustomer ou Get... je sais pas comment on dit Ligne de Commande d'une Facture en anglais ? TBill.GetDetailOrder ???

Manque de vocabulaire, et après, si personne ne comprend ou que moi-même, j'oublie, c'est une perte de temps de traduire !

Quand tu n'as pas de spécifications, pas de règle de codage, et une transmission à 99% oral, c'est un sport d'avoir un code métier lisible et compréhensible subissant les changements de besoins et de fonctionnalités en cours de développement
Alors si on en plus on se permet de délire comme ce qui suit.

Donc, le pire, mais aussi le plus drôle (l'auteur ne supportait plus le projet ni la responsable, sa petite vengeance).
Extrait d'un code dont j'ai subi la maintenance par la suite :

Code pascal :
1
2
3
4
function TCensure.ConstruireQui(OleTypes, OleValeurs : OleVariant; ModeOU : Boolean) : String; 
var i, NbDim : integer; 
    Operateur_OuiIciTank, jointhuuuure : String; //c'est matrix voyons !!! 
    LeTextounet, leFromTon, LeTe : String;

Voilà, des jeux de mots avec le vocabulaire SQL et des références à des films !
Ou ce code qui exprime de la mauvaise humeur du même développeur

Code pascal :
1
2
3
4
5
6
7
8
9
10
//comme son nom l'indique !!! 
  
Function TCensure.ConvSaloperieAChierDePutainDeMerde(Per_ID : Integer) : Integer; 
begin 
  ReqDeMerdeAChier.close; 
  ReqDeMerdeAChier.parambyname('PER_Id').asinteger := Per_Id; 
  ReqDeMerdeAChier.open; 
  result := ReqDeMerdeAChier.fieldByName('TER_ID').asinteger; 
  ReqDeMerdeAChier.close; 
end;


J'avoue, j'ai récemment aussi fait une référence à un jeu vidéo de MegaDrive :

Code :
  bool TShaiCameraRecordingByDirect::AddExtraTime(TSeconds ATimeBonus = -1); // Tribute to Wiz 'n' Liz !
Cela reste sobre et le nommage correspond à la fonctionnalité souhaité, ajouter du temps supplémentaire à un enregistrement automatique déjà en route !
Avatar de Melancoliah Melancoliah
http://www.developpez.com
Nouveau Membre du Club
le 29/05/2012 16:18
Le pire est lorsque tu te retrouves avec une tonne de variable (je parles du VB.NET) qui sont pas changées (TextBox34) et ça peut allé très loin ...

Je ne dirais pas que c'est moi Je trouve ça horrible mais je continu ...
Avatar de bilbonec bilbonec
http://www.developpez.com
Membre éclairé
le 27/06/2012 14:39
Pour ma part, le pire que j'ai vu est un nom de variable utilisé un peu partout dans les tests unitaires de mon projet : $res !

Comme son nom l'indique : une variable utilisée pour stocker les résultats d'une méthode testée.

Aucune idée sur le type de résultat retourné, sur le cas testé ou autre. J'ai eu beau me battre pour que ce genre de variable disparaisse et pourtant il est toujours autant utilisé
Avatar de air-dex air-dex
http://www.developpez.com
Membre Expert
le 27/06/2012 16:33
Citation Envoyé par bilbonec  Voir le message
Pour ma part, le pire que j'ai vu est un nom de variable utilisé un peu partout dans les tests unitaires de mon projet : $res !

Comme son nom l'indique : une variable utilisée pour stocker les résultats d'une méthode testée.

Aucune idée sur le type de résultat retourné, sur le cas testé ou autre. J'ai eu beau me battre pour que ce genre de variable disparaisse et pourtant il est toujours autant utilisé

Si le code (ou le test) en question est bien documenté et/ou bien commenté, on comprend aisément ce que "res" contient. Le nom de la variable n'est donc pas à remettre en cause.
Avatar de Dutiona Dutiona
http://www.developpez.com
Membre régulier
le 27/06/2012 17:29
Le pire que j'ai fait, à un prof que j'aimais pas !
Code java :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  
class _{ 
    private int __; 
  
    public _(int ___){ 
        __ = ___; 
    } 
  
    public int guessWhatImDoing(){ 
        if(__<=0)return 1; 
        _ ____=new _(___()-1); 
        return ___()*____.guessWhatImDoing(); 
    } 
  
    public int ___(){ 
        return __; 
    } 
}
He ben après ça il m'aimait pas non plus ! ahahaha

PS : c'est une factorielle volontairement compliquée !
Avatar de Sergejack Sergejack
http://www.developpez.com
Membre Expert
le 28/06/2012 9:12
Mieux vaut parfois imposer au (re)lecteur de remonter dans le code que de perdre du temps à rédiger des variables dont les noms chambouleraient la remise du prix Goncourt.
Avatar de SurferIX SurferIX
http://www.developpez.com
Membre Expert
le 02/07/2012 9:45
Citation Envoyé par bilbonec  Voir le message
Pour ma part, le pire que j'ai vu est un nom de variable utilisé un peu partout dans les tests unitaires de mon projet : $res !

Comme son nom l'indique : une variable utilisée pour stocker les résultats d'une méthode testée.

Aucune idée sur le type de résultat retourné, sur le cas testé ou autre. J'ai eu beau me battre pour que ce genre de variable disparaisse et pourtant il est toujours autant utilisé

Euh moi j'ai presque toujours une variable nommée "$result" qui est le retour. Mes fonctions ne dépassent jamais 100 lignes de code, donc peut être que je n'ai pas besoin de savoir ce qu'il y a dedans. Et puis c'est en Php, donc très faiblement typé, on peut mettre n'importe quel type dans une variable. Donc ce que tu dis ne convient pas forcément.
Avatar de souviron34 souviron34
http://www.developpez.com
Expert Confirmé Sénior
le 02/07/2012 10:56
Citation Envoyé par SurferIX  Voir le message
. Et puis c'est en Php, donc très faiblement typé, on peut mettre n'importe quel type dans une variable. Donc ce que tu dis ne convient pas forcément.

ça n'a pas grand chose à voir...

Si le nom de la fonction est clair, il est alors totalement compréhensible dans tous les cas d'appeler "res" le retour, si on ne s'en sert que là..

C'est sûr que si on a "res1", "res2, .. res100", là c'est une faute grave.. et impossible à lire...
Avatar de deuz59 deuz59
http://www.developpez.com
Membre habitué
le 02/07/2012 17:46
Citation Envoyé par souviron34  Voir le message
ça n'a pas grand chose à voir...

Si le nom de la fonction est clair, il est alors totalement compréhensible dans tous les cas d'appeler "res" le retour, si on ne s'en sert que là..

C'est sûr que si on a "res1", "res2, .. res100", là c'est une faute grave.. et impossible à lire...

Avec une fonction unitaire de moins de 30 lignes ça peut passer en effet, mais de façon globale, on est toujours gagnant a bien nommer une variable...
Avatar de SurferIX SurferIX
http://www.developpez.com
Membre Expert
le 09/07/2012 11:31
Citation Envoyé par souviron34  Voir le message
ça n'a pas grand chose à voir...

Si, parce que dans la conversation, des personnes parlaient du fait qu'en fonction du type intrinsèque de la variable, le nom pouvait être explicite (intXXX = entier, strXXX = chaine etc), alors qu'en Php comme c'est faiblement typé, ce principe ne s'applique plus, donc tu ne peux pas faire (intRetour = entier, strRetour = chaine etc), ce qui pourrait être un indice supplémentaire pour aider à comprendre.

Citation Envoyé par deuz59  Voir le message
Avec une fonction unitaire de moins de 30 lignes ça peut passer en effet, mais de façon globale, on est toujours gagnant a bien nommer une variable...

Si, dans toutes tes fonctions qui renvoient quelque chose, pour chaque fonction, tu as :

- une variable nommée "$result" ;
- tes fonctions sont courtes.

Alors, tu sais que c'est là que sera forcément le résultat de retour. Le nom de la fonction doit suffire à lui tout seul.

Exemples concrets (pris de deux fichiers différents) :

Code :
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
    public function translateDate( 
        $date_time, 
        $format = 'date_time_format_long_sans_annee', 
        $first_upcase=true 
    ) {  
        switch ($this->_trad->getLang()) { 
            /* (!!) RAF pour l'anglais */ 
            case 'cn': 
                /* Code pour le jour où je le ferai en Chinois */ 
                break; 
 
            default: 
                /* Traduction date en français */ 
                $jour = $this->_trad->get( 
                    self::$_TabStrDaysOfWeek[ $date_time->format('w') ] 
                );   
                $mois = $this->_trad->get( 
                    self::$_TabStrMonths[ $date_time->format('n') ] 
                );   
                $retour = sprintf( 
                    $date_time->format( 
                        $this->_trad->get($format) 
                    ),   
                    $jour, 
                    $mois 
                );   
                if ($first_upcase) { 
                    $retour = ucfirst($retour); 
                }    
                break; 
        }    
        return $retour; 
    }
et

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public function queryManyValues( 
        $sql, 
        $tab, 
        $type_fetch=PDO::FETCH_BOTH, 
        $debug=false, 
        $debug_console=false, 
        $debug_maxlen=false 
    ) {  
        if ($debug) { 
            $this->_queryDump($sql, $tab, $debug_console, $debug_maxlen); 
        }    
        $stmt = $this->execQuery($sql, $tab); 
        $retour = $stmt->fetch($type_fetch); 
        return $retour; 
    }
Désolé mais si le type ne comprend pas à quoi sert "$retour", là, je ne peux vraiment plus rien pour lui. Ah si la documentation. Toutes mes fonctions sont documentées. Exemple pour la fonction précédente :

Code :
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
 
    /** 
     * Exécution d'une requête et renvoi du résultat, afin de 
     * pouvoir lire plusieurs champs 
     * 
     * @param string $sql           Requête à exécuter 
     * @param array  $tab           Paramètres à passer à la requête 
     * @param string $type_fetch    Type de résultat de retour : 
     *                              PDO::FETCH_BOTH (défaut): 
     *                              retourne un tableau indexé 
     *                              par les noms de colonnes 
     *                              et aussi par les numéros de 
     *                              colonnes, commençant à 
     *                              l'index 0, comme retournés 
     *                              dans le jeu de résultats 
     * @param bool   $debug         Si on affiche une trace 
     *                              de debug 
     * @param bool   $debug_console Si le debug de retour est 
     *                              pour une console 
     * @param bool   $debug_maxlen  Si le debug de retour est 
     *                              pour une console, on peut 
     *                              préciser la longueur max 
     *                              par ligne 
     * 
     * @return integer Nombre d'enregistrements affectés par la requête 
     */

Et là vraiment, vraiment... si la personne ne comprend pas à quoi sert "$retour", là, je ne peux vraiment plus rien...
Avatar de deuz59 deuz59
http://www.developpez.com
Membre habitué
le 10/07/2012 15:06
Citation Envoyé par SurferIX  Voir le message

Si, dans toutes tes fonctions qui renvoient quelque chose, pour chaque fonction, tu as :

- une variable nommée "$result" ;
- tes fonctions sont courtes.

Alors, tu sais que c'est là que sera forcément le résultat de retour. Le nom de la fonction doit suffire à lui tout seul.

Cela peut en effet passer avec une troisième condition :
- le nom de tes fonctions est précis et compréhensible

Offres d'emploi IT
Développeur DELPHI - Poste Client Final (H/F)
CDI
PAC Recrutement - Provence Alpes Côte d'Azur - Marseille
Parue le 02/12/2014
Un architecte .net avec des compétences sitecore
Freelance
Triaums France - Ile de France - Paris (75000)
Parue le 27/11/2014
Ingénieur .NET (H/F)
CDI
Technology & Strategy - Alsace - Strasbourg (67000)
Parue le 10/12/2014

Voir plus d'offres Voir la carte des offres IT
 
 
 
 
Partenaires

PlanetHoster
Ikoula