Galactic-Shrine C++ Coding Standard
Version: 1.0.0
Auteur / Author: ⋞Galactic-Shrine⋟
Portée / Scope: Projets C++ / Moteurs / Bibliothèques natives / Outils / Applications Desktop / Modules système / Intégrations Unreal-like ou propriétaires
1. Objectif
Ce standard définit la manière d’écrire le code C++ dans les projets Galactic-Shrine.
Il a pour objectifs :
- d’uniformiser le style C++ des bibliothèques et modules natifs ;
- de conserver une base robuste, lisible et industrialisable ;
- de limiter les erreurs de gestion mémoire, de contrat et d’interface ;
- d’aligner les conventions de nommage avec Galactic-Shrine.
2. Principes généraux
Le code C++ Galactic-Shrine doit être :
- clair ;
- sûr autant que possible ;
- cohérent ;
- orienté RAII ;
- attentif aux coûts réels.
Le code doit privilégier :
- des interfaces nettes ;
- des responsabilités courtes ;
- l’usage de types explicites ;
- des ressources gérées automatiquement ;
- la réduction des dépendances de compilation inutiles.
3. Décisions officielles Galactic-Shrine pour C++
Décisions officielles :
- classes, structs, enums, aliases de types :
PascalCase; - méthodes :
PascalCase; - paramètres :
PascalCase; - propriétés ou accesseurs exposés :
PascalCase; - variables locales :
PascalCase; - champs privés :
_PascalCase; - constantes nommées :
PascalCase; - préférer
enum classàenumlorsque pertinent ; - préférer
nullptràNULL; - privilégier RAII et smart pointers quand la sémantique le justifie.
4. Convention de nommage
- fichiers
.hpp/.het.cppalignés sur le type principal ; - classes / structs :
PascalCase; - méthodes :
PascalCase; - paramètres :
PascalCase; - variables locales :
PascalCase; - membres privés :
_PascalCase; - namespaces : stables, hiérarchiques et lisibles ;
- macros : uniquement si nécessaire, clairement nommées.
À éviter :
- noms trop courts sans signification ;
- préfixes techniques omniprésents sans valeur ;
- noms ambigus pour des pointeurs propriétaires ou non propriétaires.
5. Structure recommandée d’un fichier C++
Ordre recommandé :
- en-tête légal si requis ;
- include guard ou
#pragma once; - includes minimaux ;
- namespace ;
- déclaration du type ou des fonctions ;
- implémentation en
.cpp.
Règles :
- limiter les includes dans les headers ;
- préférer les forward declarations lorsque raisonnable ;
- séparer clairement l’interface et l’implémentation ;
- éviter les dépendances transversales cachées.
6. Style d’écriture
6.1 Accolades
Utiliser un style d’accolades cohérent sur tout le dépôt.
Toujours préférer la stabilité au mélange de styles.
6.2 const correctness
- marquer
consttout ce qui doit l’être ; - utiliser des références constantes pour éviter des copies inutiles ;
- rendre explicite l’intention de mutation.
6.3 Valeurs de retour
- éviter les pointeurs nus propriétaires ;
- retourner des types de valeur, références ou wrappers explicites selon le contrat ;
- documenter la sémantique de possession quand elle n’est pas évidente.
6.4 Conditions et branches
- privilégier les gardes précoces ;
- factoriser les expressions complexes dans des variables lisibles ;
- éviter la logique métier cachée dans des macros.
7. Règles spécifiques C++
- préférer
std::unique_ptrà la possession manuelle ; - utiliser
std::shared_ptrseulement pour une propriété partagée réelle ; - éviter
new/deletedirects hors cas spécialisés ; - marquer
overrideexplicitement ; - utiliser
explicitsur les constructeurs à un paramètre quand nécessaire ; - préférer
std::string_viewpour la lecture non propriétaire lorsque sûr ; - faire attention à la durée de vie des références et vues.
8. Gestion des erreurs et robustesse
- utiliser les exceptions selon la politique du projet ou une alternative claire ;
- ne pas ignorer silencieusement un code d’erreur ;
- garder les invariants de classe simples et défendables ;
- valider les préconditions importantes ;
- documenter les contrats de possession et les cas d’échec.
9. Types d’éléments à revoir en priorité
Relire en priorité :
- types manipulant des ressources ;
- code concurrent ou multithread ;
- wrappers système ;
- interfaces publiques de bibliothèques ;
- sérialisation binaire ou réseau ;
- interopérabilité C / C++ / moteur.
10. Exemple complet recommandé
#pragma once
#include <memory>
#include <string_view>
namespace GalacticShrine::Users
{
class UserProfileRepository;
class UserProfileService final
{
public:
explicit UserProfileService(std::shared_ptr<UserProfileRepository> Repository);
bool UpdateDisplayName(std::string_view UserId, std::string_view DisplayName);
private:
std::shared_ptr<UserProfileRepository> _Repository;
};
}
#include "UserProfileService.hpp"
#include "UserProfileRepository.hpp"
namespace GalacticShrine::Users
{
UserProfileService::UserProfileService(std::shared_ptr<UserProfileRepository> Repository)
: _Repository(std::move(Repository))
{
}
bool UserProfileService::UpdateDisplayName(std::string_view UserId, std::string_view DisplayName)
{
if (UserId.empty())
{
return false;
}
if (DisplayName.empty())
{
return false;
}
return _Repository->UpdateDisplayName(UserId, DisplayName);
}
}
11. Décision officielle recommandée
Standard officiel recommandé pour Galactic-Shrine C++ :
- utiliser
PascalCasepour méthodes, paramètres et variables locales ; - utiliser
_PascalCasepour les membres privés ; - appliquer RAII systématiquement ;
- séparer interface et implémentation clairement ;
- rendre explicites la possession, les coûts et la durée de vie.
12. Résumé exécutable
À appliquer dans tous les projets C++ Galactic-Shrine :
PascalCasepour types, méthodes, paramètres et variables locales ;_PascalCasepour membres privés ;enum class,nullptr,override,explicitquand approprié ;- pas de gestion mémoire propriétaire implicite ;
- headers légers, dépendances limitées ;
- contrats de possession clairs.