C / C++
Normes départementales des langages C et C++.
Fichiers
Les fichiers d'en-tête du langage C doivent avoir l'extension .h et ceux du langage C++ l'extension .hpp, tandis que les fichiers d'implémentation du langage C doivent avoir l'extension .c et ceux du langage C++ .cpp.
Chaque classe doit être dans un ou des fichiers et porter le même nom, à moins que plusieurs classes soient indissociables.
Langue
Le code peut être en anglais ou en français, mais doit être constant. Tandis que la documentation, les commentaires, les sorties du terminal, et les interfaces utilisateurs doivent obligatoirement être en français.
Inclusions
Limiter les inclusions à ce qui est nécessaire au code présent dans le fichier :
#include <stdio.h>
// ^^^^^^^^^^^^^^^ Ne devrait pas être présent puisqu'inutilisé.
int main() {
return 0;
}
Identificateurs
Tous les identificateurs doivent être significatifs.
De plus, pour une meilleure intercompatibilité, les règles suivantes devraient être respectées :
- Débuter par une lettre ou un trait de soulignement.
- Contenir que des lettres (sans accent), des chiffres, et des traits de soulignement.
- Ne pas être un terme réservé par les langages de programmation.
Constantes
Pour être plus distinguables des autres identificateurs, ceux des constantes doivent utiliser la notation « serpent criant (screaming snake case) » en contenant que des lettres majuscules et des traits de soulignement pour séparer les termes :
#define VALEUR_MINIMALE -42
constexpr char VALEUR_MAXIMALE = 42;
Variables
Les identificateurs de données membres, de variables, de méthodes, et de fonctions, doivent utiliser la casse de chameau « camel case », c'est-à-dire commencer par un caractère minuscule, et utiliser un caractère majuscule au début des termes suivants :
bool identificateurDeVariableBooleenne = true;
Fonction
L'identificateur doit comporter un verbe à l'infinitif précisant ce que réalise la fonction.
Une fonction devrait contenir au maximum une trentaine de lignes de code, et devrait être déclarée « inline » lorsqu'elle comporte moins de 2 lignes de code.
Les paramètres devraient être ordonnés de sorte à pouvoir définir le plus d'arguments par défaut possible.
Structures et Classes
Les identificateurs d'espace de nom, de structure, de classe, etc., doivent utiliser la casse pascal « studle caps », en débutant par un caractère majuscule :
struct Structure {};
class Classe {};
Netteté
Tout code source doit être le plus concis possible, tout en restant visuellement agréable et facile à lire.
Les remises ne devraient pas contenir de code de débogage.
Commentaires
Outre pour des raisons académiques, seuls les morceaux de code non triviaux doivent être commentés afin d'expliquer leur algorithme.
Les remises ne devraient pas contenir de code en commentaire inutilement.
Aération
Comme dans tous textes, les gros morceaux de code doivent être séparés en paragraphes afin d'être plus agréables à lire, mais il ne devrait pas y avoir plus de 2 sauts de lignes consécutifs.
Chaque éléments importants doivent aussi être séparés par une ligne vide. Par exemple: entre les inclusions et la classe, entre les données membres et les méthodes, et entre chaque méthodes.
Accolades
Les accolades ouvrantes doivent être en fin de ligne et précédées d'un espace pour les fonctions et méthodes, les if, les else, les while, les for, et les case :
void fonction() {
// Instructions
}
Les accolades doivent être précédées et suivies d'un espace lors d'initialisation sur une seule ligne :
short tabEntiers[] = { 7, 42, 69, 404, 666 };
Opérateurs
Les opérateurs unaires doivent être adjacents aux identificateurs tandis que les opérateurs binaires doivent être précédés et suivis d'un espace :
int variableC = ++variableA / variableB-- * 42;
Indentation
Il doit y avoir une indentation à la suite des accolades ouvrantes (exceptions pour les classes et les case), des modificateurs d'accès, des if, des else, des while, des for, et des case :
class Classe {
public:
void methode(long valeurEntiere) {
switch (valeurEntiere) {
default:
for (unsigned short i = 0; i < 666; i++)
if (valeurEntiere < 42)
valeurEntiere++;
else
valeurEntiere--;
break;
}
}
};
L'indentation doit être faite avec des tabulations et non des espaces.
Élégance
Le code doit être élégant en étant concis et en évitant les pléonasmes et les redondances.
Pléonasmes
Une proposition est toujours booléenne :
// if (estValide == true)
if (estValide) {
Une valeur autre que 0 est interprété comme étant vrai sous forme booléenne :
// if (compte != 0)
if (compte) {
Redondances
Les mêmes instructions en début et en fin de if et de else doivent être sorties de ces blocs de code :
/*
if (estValide) {
instructionA();
instructionB();
instructionD();
}
else {
instructionA();
instructionC();
instructionD();
}
*/
instructionA();
if (estValide)
instructionB();
else
instructionC();
instructionD();
Concision
Affectation d'une valeur booléenne par une proposition plutôt que dans une structure conditionnelle :
/*
if (estValide)
enMarche = true;
else
enMarche = false;
*/
enMarche = estValide;
Sans bloc de code vide :
/*
if (estValide) {
}
else
instruction();
*/
if (!estValide)
instruction();
L'exécution d'une fonction se termine immédiatement après la rencontre d'une instruction de retour :
int fonction() {
if (estValide)
return 42;
// else
return -1;
}