Publié le 22/04/2024
Par Christophe MOMMER
C# 12, sorti avec .NET 8, permet de rendre les types primitifs plus explicite.
Si vous n'aimez pas lire, il y a une vidéo ici sur ce sujet : https://youtube.com/shorts/DkNWe7E03jg
Très souvent, on a recours à des types primitifs (int
, string
, ValueTuple
, etc.) pour stocker des éléments qui, pourtant, peuvent avoir un véritable sens métier. Même si la préconisation est d'éviter la "primitive obsession" (c'est-à-dire éviter les types primitifs pour des données métier afin d'y ajouter du sens et des vérifications, comme j'en parle dans mon cours sur la clean architecture), il y a des cas où ça peut être utile de faire un alias d'un type primitif pour l'utiliser comme un type à part entière et rendre le code explicite.
Comparons :
public User GetUserById(int userId)
{
...
}
Soyons franc : sur le code ci-dessus, le paramètre bien nommé nous donne déjà une bonne indication. Mais ce ne serait pas mieux d'avoir ceci ?
using UserId = int;
public User GetUserById(UserId userId)
{
...
}
Le code reste globalement le même, on a juste ajouté une instruction using au début du code pour rendre ce type explicite.
Attention cependant : aucune vérification supplémentaire ne sera effectuée, il s'agit d'un alias de confort. Ainsi, le code suivante ne provoquera aucune erreur :
using UserId = int;
using CourseId = int;
public void Methode()
{
CourseId c = 1;
var user = GetUserById(c); // pas d'erreur ici !
}
public User GetUserById(UserId userId)
{
..
}
D'où la recommandation principale : éviter la primitive obsession pour éviter ce genre d'inversion