Quel est le meilleur moyen pour indiquer qu’il faut cesser d’utiliser une classe, une méthode ou une propriété énormément sollicitée de votre code? L’une des stratégies les plus appropriées est de passer par l’utilisation de l’attribue [Obsolete] qui est inclus à même le framework .NET.
L’utilisation de cet attribut permet d’indiquer aux consommateurs de votre librairie que certaines de vos fonctions sont en cours de dépréciation au profit d’un autre ensemble de fonctionnalités. Ce qui rend intéressant cet approche, c’est que le compilateur C# ainsi que Visual Studio sont aussi liés à cet attribut. Lorsque l’attribut est utilisé, des avertissements de compilation seront affichés aux différents endroits où les éléments de code dépréciés seront utilisés.
C’est très gentil comme approche, lorsqu’on y pense.
Mise en contexte
L’attribut [Obsolete] s’utilise de plusieurs façons. Considérons la classe UserDirectory qui suit.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Collections.Generic; | |
namespace FrenchCoding.Obsolete | |
{ | |
public class UserDirectory | |
{ | |
public List<string> GetAllUsers() | |
{ | |
return new List<string>(); | |
} | |
} | |
} |
Pour bonifier l’exemple, disons que cette classe est consommée dans un namespace différent dans une classe UserSearchEngine.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
namespace FrenchCoding.Consume | |
{ | |
using Obsolete; | |
using System.Collections.Generic; | |
public class UserSearchEngine | |
{ | |
public List<string> SearchUsers(string query) | |
{ | |
var directory = new UserDirectory(); | |
return directory.GetAllUsers(); | |
} | |
} | |
} |
Scénario #1 – [Obsolete]
Supposons que nous ajoutions [Obsolete] sur la classe UserDirectory. Dorénavant, deux effets se produiraient visuellement au nivea de Visual Studio.
Un indicateur visuel ainsi qu’un avertissement de compilation est maintenant affiché dans l’IDE. Il n’est vraiment pas possible de passer à côté.
Scénario #2 – [Obsolete(<string>)]
Il est possible d’ajouter un paramètre de type string à l’attribut Obsolete afin d’ajouter un message qui sera ajouté à l’avertissement de compilation. Il suffit d’écrire l’attribut ainsi: [Obsolete(« Utilisez UserRepository en remplacement »)].
Cela aura effet de produire un avertissement de compilation qui prend la forme suivante:
Scénario #3 – [Obsolete(<string>, <bool>)]
Cette signature de l’attribue Obsolete est, à mon avis, l’équivalent d’une bombe nucléaire. Le paramètre bool qui est ajouté permet d’indiquer au compilateur de générer une erreur de compilation au lieu d’un avertissement.
Lors qu’activé, ce paramètre fait en sorte que votre projet ne compilera pas tant et aussi longtemps que vous n’aurez pas réglé la ou les fonctionnalités dépréciées. Au moins, la signature fait en sorte que vous devez obligatoirement indiquer un message lorsque vous activez la génération d’erreurs avec [Obsolete]. Cela fait un peu moins rude pour vos consommateurs!