Ceci est une ancienne révision du document !
Dans les chapitres précédents, vous avez appris qu'il était possible de modifier des types en ajoutant des modificateurs. Il sera par exemple possible de passer d'un entier sur 32 bits (int
) en un entier sur 16 bits en ajoutant le mot-clé short
.
Imaginons que l'on écrive le code suivant :
int x {}; int y {}; int z {}; int a {}; int b {}; int c {};
Après analyse des contraintes imposées par les données, il apparaît que les valeurs prises par ces variables seront comprises entre 0 et 100. Vous souhaitez donc changer les types pour utiliser un type entier non signé sur 8 bits unsigned char
au lieu d'un type entier signé int
. Vous faites donc le remplacement de tous les types des variables :
unsigned int x {}; unsigned int y {}; unsigned int z {}; unsigned int a {}; unsigned int b {}; unsigned int c {};
On voit tout de suite le problème, puisque c'est le même qui a été présenté pour les variables. La modification manuelle de plusieurs lignes de code diminue l'évolutivité du code et donc la qualité logicielle du programme.
Pour corriger ce problème, on va pouvoir utiliser une solution équivalente à celle utilisée pour les variables. On va pouvoir créer un nouveau type, qui sera en fait un type créé à partir d'un type de base et de modificateurs et au quel on donnera un nouveau nom.
La syntaxe est la suivante, en utilisant le mot-clé using
:
using local_type = int; local_type x {}; local_type y {}; local_type z {}; local_type a {}; local_type b {}; local_type c {};
Avec ce code, il ne sera plus nécessaire de changer plusieurs lignes si on souhaite changer le type des variables. Le code a gagné en maintenabilité et en qualité logicielle.
using
, pour déclarer l'utilisation d'un espace de noms. Même si on utilise le même mot-clé, il s'agit bien de deux utilisation différentes et donc deux syntaxes différentes. Pour rappel :
using namespace std; // déclaration d'un espace de noms using std::cout; déclaration d'un fonctionnalités d'un espace de noms using nouveau_type = ancien_type; // déclaration d'un nouveau type
Pour les noms de type, les règles sont les mêmes que pour les noms de variables (caractères alphanumériques et tiret bas et doit commencer par une lettre). De la même façon, il est classique de définir des règles de codage pour préciser comment il faut écrire les noms de type. Par exemple, il sera classique de terminer un nom de type avec “_t” ou “_type” (par exemple avec la bibliothèque standard ou la bibliothèque Boost) ou avec une majuscule (par exemple avec la bibliothèque Qt).
sémantique simple : donner un sens aux types.
ex:
int temp1 { 12 }; // heure int temp2 { 40 }; // minutes temps1 + temps2; // n'a pas de sens
Nommer les types :
using heure = int; using minute = int; heure temp1 { 12 }; minute temp2 { 40 };
Le type exprimer à quoi il correspond, c'est plus précis que “int”. Mais pas suffisant, on peut toujours écrire :
temps1 + temps2; // n'a pas de sens
idéallement, faudrait que compilateur préviennent. Pourquoi fait-il pas ? Parce que “heure” et “minute” ont un sens pour lecteur. Mais pour compilateur, ce sont des int, donc pas d'interdiction d'addition. Sémantique incomplète
Dans la suite, apprendre à créer ses types et créer une sémantique (des “règles” d'utilisation).