Afin que les différents modules développés pour la plate-forme ARCANE aient une certaine homogénéité, ce document propose un ensemble de règles de codages.
Général
- le langage utilisé est le C++20
- l'encodage des fichiers est obligatoire 'UTF-8' avec le BOM au début du fichier. La première ligne de chaque fichier doit être comme suit :
- tous les commentaires utilisent la syntaxe du produit Doxygen afin de pouvoir extraire directement du code source une documentation papier ou hypertextuelle,
- tous les identifiants sont écrits en Anglais.
- les indentations se font avec 2 espaces. Il ne doit pas y avoir de caractères de tabulation dans le code.
Fichiers sources
- tous les fichiers sources sont formatés de la même manière et commencent tous par un en-tête décrivant le nom du fichier, la date de modification et le nom du ou des auteurs.
- vient ensuite le code proprement dit. Chaque identifiant doit être commenté et les fonctions doivent être séparées par deux lignes de commentaires. Par exemple :
int
functionExample(int argc,char** argv)
{
return argc/2;
}
Variables
- les noms des variables sont toujours en minuscules. Si le nom est composé de plusieurs mots logiques, chaque mot est séparé par le caractère souligné. Par exemple :
volume
list_of_element
cells
- Pour éviter toute ambiguité, les noms pluriels sont réservés pour les variables de type conteneur, tous les autres noms étant au singulier.
Classes
- Les noms des classes (
class
) commencent par une majuscule et continuent par des minuscules. Si le nom est composé de plusieurs mots logiques, la première lettre de chaque nouveau mot est en majuscule. Par exemple :
Component
ComponentMng
String
- Les membres des classes, en plus de respecter les mêmes conventions que n'importe quelle variable, seront toujours préfixés par les deux caractères
m_
. Par exemple :
m_volume
m_list_of_element
Méthodes et fonctions
Dans ce qui suit, on utilisera le mot fonction pour désigner à la fois les fonctions et les méthodes de classe.
- les noms des fonctions sont toujours en minuscules. Si le nom est composé de plusieurs mots logiques, la première lettre de chaque nouveau mot est en majuscule. Par exemple :
numberOfElement()
assign()
- si le nom de la méthode correspond à la notion de propriété (c'est-à-dire équivalent sémantiquement à un champ de la classe) de nom value, l'accesseur doit être le nom de la propriété (value()) et la méthode pour changer la valeur doit être setValue(). L'accesseur ne doit pas commencer par
get
. Si la propriété est booléenne, il est possible de préfixer l'accesseur par is. Par exemple isEmpty().
- Pour éviter toute ambiguité, tous les noms sont au singulier
- La définition des fonctions se fait sur au moins deux lignes :
- la première comprend le type de retour et éventuellement le nom de la classe s'il s'agit d'une méthode.
- la deuxième comprend obligatoirement le nom de la fonction.
- viennent ensuite la liste des arguments sur la deuxième ligne et les suivantes.
- L'accolade ouvrant le corps de la fonction et celle le fermant doivent être sur une ligne séparée :
int
function1(int argc,char** argv)
{
return argc/2;
}
Exemple
template<typename T>
class ConstCArrayT
{
private:
protected:
public:
typedef T value_type;
typedef const value_type * key_restrict const_iterator;
typedef const value_type * key_restrict const_pointer;
typedef const value_type& const_reference;
typedef Integer size_type;
typedef ptrdiff_t difference_type;
typedef ConstIterT< ConstCArrayT<T> > const_iter;
public:
ConstCArrayT() : m_size(0), m_ptr(0) {}
explicit ConstCArrayT(Integer s,const T* ptr)
: m_size(s), m_ptr(ptr) {}
ConstCArrayT(const ConstCArrayT<T>& from)
: m_size(from.m_size), m_ptr(from.m_ptr) {}
ConstCArrayT(const CArrayBaseT<T>& from)
: m_size(from.size()), m_ptr(from.begin())
{
}
const ConstCArrayT<T>& operator=(const ConstCArrayT<T>& from)
{ m_size=from.m_size; m_ptr=from.m_ptr; return *this; }
const ConstCArrayT<T>& operator=(const CArrayBaseT<T>& from)
{
m_size = from.size();
m_ptr = from.begin();
return (*this);
}
public:
const T& operator[](Integer i) const
{
return m_ptr[i];
}
inline Integer size()
const {
return m_size; }
inline const_iterator begin() const { return m_ptr; }
inline const_iterator end() const { return m_ptr+m_size; }
inline bool empty() const { return m_size==0; }
inline const T* base() const { return m_ptr; }
protected:
private:
const T* m_ptr;
};
Int32 Integer
Type représentant un entier.