II. Spécification des fichiers/dossiers/projets▲
Comme dans tout projet, nous allons définir notre organisation :
- Les utilitaires "maisons" seront stockés dans une bibliothèque statique que nous appellerons kinUtils. Elle s'enrichira au fur et à mesure des besoins
- La gestion des données sera implémentée dans une autre bibliothèque statique appelée kinGesDatas, composée essentiellement de classes modèles (Template).
- Les données métiers viendront alors dans une bibliothèque, toujours statique (mais nous la passerons en DLL), nommée kinBusiness
- Puis enfin un petit projet de tests unitaires, kinTestApp, exécutable
II-A. Définition des répertoires▲
Je vous conseille de créer un répertoire, avec pour chaque projet un sous répertoire et aussi un dossier nommé "lib" afin d'accueillir les bibliothèques compilées. Nous utiliserons également des bibliothèques externes, je vous laisse librement vous organiser dans vos dossiers/fichiers à savoir que la procédure pour indiquer au compilateur où il pourra trouver ces éléments (fichiers include et lib) est la même que pour nos bibliothèques à nous.
II-B. Création de la solution, configuration des projets▲
Créez donc quatre projets et définissez le projet de test comme projet de démarrage.
Configurez maintenant les projets selon ce tableau (à noter que les bibliothèques seront compilées en Debug et en Release. Les projets utilisateurs utiliseront la version Debug en compile Debug et la version Release en compile Release).
Projet | Type de projet | Fichier de sortie | Dépendances supplémentaires |
---|---|---|---|
kinUtils | Bibliothèque statique (.lib) |
Debug : $(SolutionDir)\lib\$(ProjectName)d.lib Release : $(SolutionDir)\lib\$(ProjectName).lib |
Debug : kinUtilsd.lib Release : kinUtils.lib |
kinGesDatas | Bibliothèque statique (.lib) |
Debug : $(SolutionDir)\lib\$(ProjectName)d.lib Release : $(SolutionDir)\lib\$(ProjectName).lib |
Debug : kinGesDatasd.dll Release : kinGesDatas.dll |
kinBusiness | Bibliothèque statique (.lib) |
Debug : $(SolutionDir)\lib\$(ProjectName)d.lib Release : $(SolutionDir)\lib\$(ProjectName).lib |
Debug : kinBusinessd.lib Release : kinBusiness.lib |
kinTestApp | Application (.exe) |
Debug : kinBusinessd.exe Release : kinBusiness.exe |
Par défaut |
Lors que vous inclurez le fichier
#include
<kinUtils/UnFichierTresUtil.h>
Il faut indiquer au compilateur où il pourra le trouver le répertoire kinUtils, étant donné qu'une bibliothèque est destinée à être utilisée par plusieurs projets, son emplacement appartient à une configuration à l'échelle de la machine du développeur.
Spécifiez donc dans les options de l'IDE un répertoire include additionnel, dans notre cas celui de la solution.
De même pour lier les bibliothèques, il faut que le compilateur puisse savoir où se trouvent ces fichiers "*.lib" requis à l'édition des liens. Ajoutez un répertoire de bibliothèque dans les options de Visual Studio, ici ce sera le répertoire "lib"
Et pour terminer, il faut indiquer l'ordre de génération des projets. kinTestApp utilise kinBusiness qui utilise kinGesDatas qui utilise kinUtils. Donc, l'ordre de génération est :
- kinUtils
- kinGesDatas
- kinBusiness
- kinTestApp
II-C. Tests▲
Testons maintenant tout ça. Créez une classe dans chaque bibliothèque qui utilisera la classe de la bibliothèque dont elle dépend (par exemple kinBusiness instanciera et appellera la méthode de la classe proposée par kinGesDatas). Puis compilez tous les projets, vous obtiendrez cette ligne.
========== Régénération globale : 8 a réussi, 0 a échoué, 0 a été ignoré ==========
Notre répertoire lib ressemble désormais à ceci :
Une fois l'organisation en place, vous pouvez supprimer tous les fichiers sources, il ne nous serviront plus.
II-D. Les espaces de noms▲
Nous nous sommes organisés au niveau des fichiers, des projets mais pas au niveau du code. En effet, nous sommes dans une espèce de jungle et nous allons déterminer notre terrain, "kin", qui sera à son tour décomposé en trois sous-espace, un par librairie.
Voici un rappel sur l'utilisation des espaces de noms en C++. Dans ce code :
std::
cout <<
"Un message"
;
La fonction cout est incluse dans la librairie standard, sous l'espace de noms std.
Pour utiliser nos codes, soit nous indiquons les espaces de noms explicitement :
kin::utils::
UneClasseTresUtile obj
Soit en indiquant au compilateur que l'on utilise cet espace de noms
using
namespace
kin::
utils;
UneClasseTresUtile obj
Attention dans l'utilisation des using namespace XXX. En effet, ils ne doivent être définis que dans les fichiers sources (.cpp) et non d'inclusions (.h ou .inl) au risque de briser l'encapsulation des espaces de noms.
Dans les portions de codes proposés dans cet article, j'ai volontairement omis ces espaces de noms pour ne pas alourdir l'essentiel, mais ils sont présents dans les sources disponibles dans la section Téléchargement.
II-E. Conclusion▲
L'organisation est très importante, ne soyons pas pressé d'aller directement dans le code. Avec cette disposition, nous obtenons un endroit spécifique aux utilitaires, un autre dédié à la gestion de données, puis le troisième aux données métier et enfin le projet utilisateur. Chaque "partie" du projet est donc encapsulée à sa juste place, nous pouvons désormais attaquer les outils.