Skip to content

Conventions de programmation internes au projet (nommage, syntaxe, bonnes pratiques)

Guillaume Truchot edited this page May 10, 2016 · 27 revisions

Nommage

Fichiers

  • Les fichiers de classes doivent être nommés "NomDeLaClasse.h" et "NomDeLaClasse.cpp"
  • Le fichier contenant la fonction main() se nomme "main.cpp"
  • De manière générale, les noms des fichiers et des dossiers respectent la PascalCase

Code

Elément Préfixe Casse
Interfaces I PascalCase
Classes abstraites A PascalCase
Classes PascalCase
Constantes UPPER_CASE
Variables membres m_ (C.F. "Note") camelCase
Variables locales/paramètres de fonctions C.F. "Note" camelCase
Fonctions camelCase
Espaces de noms lowercase

Note : Les variables ne doivent pas être préfixées d'une lettre indiquant le type de la variable.

Syntaxe

  • Dans les classes, la section public: précède la section protected: qui précède elle-même la section private:. Une seule section de chaque par classe.
  • Les accolades doivent être seules sur une ligne
  • Constructeurs : l'appel au constructeur de la classe mère est sur la même ligne, l'initialisation des variables sur la ligne suivante
  • L'étoile servant à déclarer un pointeur porte sur le type et non sur le nom -- même chose pour le "&" des références
  • Pas de parenthèses pour les return
  • Pas de commentaires dans les fonctions, uniquement avant la fonction suivant ce schéma :
/*
** Mon commentaire
** sur plusieurs lignes
*/

Indentation

  • Le caractère utilisé pour l'indentation est la tabulation
  • Les identificateurs (noms de fonctions, noms de variables, ...) sont alignés sur le plus long type du bloc actuel
  • Les modificateurs après les déclarations de fonctions (const, = 0) sont alignés
class Indentation
{
public:
	// Les noms de variables sont alignés
	static const std::string	myString;
	static const int			myInt;

	// Les "default" sont alignés
	Indentation()	= default;
	~Indentation()	= default;

	// Les noms de fonctions sont alignés ensemble et les "const" sont alignés ensemble
	int											returningSomeInt()		const;
	std::map<int, std::vector<std::string> >	returningSomeBigMap()	const;
	
	// Les noms de fonctions sont alignés ensemble PAR RAPPORT à ce bloc (pas alignés avec les noms de fonctions ci-dessus)
	void	setSomeInt(int someInt);
	void	resetSomeBigMap();


private:
	// Les noms de variables sont alignés
	int											m_someInt;
	std::map<int, std::vector<std::string> >	m_someBigMap;
};

Bonnes pratiques

  • N'écrire que du code strictement nécessaire (exemple : on n'implémente pas de getters/setters pour tous les attributs d'une classe si on ne s'en sert pas)
  • Ne pas utiliser des fonctions du langage C (à part si elles n'ont pas d'équivalent en C++)
  • Pas de casts C-style (utiliser les casts C++ : static_cast, dynamic_cast, reinterpret_cast et const_cast)
  • Pas d'implémentation dans les en-têtes (sauf templates ?)
  • Pas de void entre les parenthèses d'une fonction ne prenant aucun argument. Ça ne sert à rien en C++.
  • Utiliser des const pour les fonctions membres quand nécessaire
  • N'utiliser l'allocation dynamique que lorsque c'est nécessaire
  • Préférer les références aux pointeurs lorsque c'est possible
  • Utiliser des constantes à la place des #define
  • Utiliser nullptr à la place de NULL
  • Mettre les noms des paramètres de fonctions dans les en-têtes
  • Ne pas préfixer les noms des variables membres de this->
  • Préfixer les appels aux fonctions membres de this-> (à l'inverse des variables membres, celles-ci n'ayant pas de préfixe m_, cela aide à savoir qu'il s'agit d'une fonction membre)

#include

  • Inclure seulement les en-têtes nécessaires au fichier
  • Utiliser les double quotes pour les en-têtes perso seulement, sinon utiliser les chevrons
  • Ne pas remonter ou descendre l'arborescence, utiliser les options du compilateur pour ajouter des répertoires d'inclusion (pas de #include "../../fichier.h" ou #include "dossier/fichier.h")
  • Ordre des #include :
    1. En-têtes standards C++ venant du C (exemple : #include <cstdlib>, version C : #include <stdlib.h>)
    2. En-têtes standards C++ (exemple : #include <string>)
    3. En-têtes système (exemple : #include <Windows.h>, #include <unistd.h>)
    4. En-têtes des bibliothèques externes (exemple : #include <irrlicht.h>)
    5. En-têtes perso (exemple : #include "Weapon.h")