Le C peut-il émuler des identifiants fortement typés ?
Dans divers scénarios de programmation, la saisie explicite de variables à l'aide de « usings » améliore la lisibilité et la compréhension du code. Cependant, il existe une limitation selon laquelle différents types peuvent toujours être attribués les uns aux autres, ce qui peut conduire à des erreurs logiques. Cette question explore la possibilité d'utiliser des fonctionnalités C pour résoudre ce problème.
Utilisation de SAFE_TYPEDEF pour le typage fort
La solution fournie utilise la macro SAFE_TYPEDEF, créant finalement des classes qui hériter du type prévu. Pour imposer une vérification de type stricte, ces classes n'acceptent que le même type d'objets comme arguments de constructeur. Par exemple, la classe PortalId ne peut être créée qu'avec un argument de chaîne et la classe CakeId avec un argument de chaîne différent.
De plus, la classe fournit une méthode raw() pour récupérer la valeur de chaîne sous-jacente. Cela permet une utilisation pratique dans des scénarios tels que les opérations cartographiques, où une simple chaîne peut être nécessaire. Cependant, les conversions de types sont sévèrement limitées, garantissant que les objets de types distincts ne peuvent pas être échangés.
Exemple d'utilisation
L'exemple d'extrait de code illustre l'utilisation :
PortalId portal_id("2"); CakeId cake_id("is a lie"); std::map<CakeId, PortalId> p_to_cake; // OK p_to_cake[cake_id] = portal_id; // OK // p_to_cake[portal_id] = cake_id; // COMPILER ERROR // portal_id = cake_id; // COMPILER ERROR // portal_id = "1.0"; // COMPILER ERROR portal_id = PortalId("42"); // OK
Dans ce scénario, l'affectation de cake_id à portal_id est interdite, évitant ainsi d'éventuelles erreurs logiques. De plus, le conteneur de cartes accepte correctement un CakeId comme clé et PortalId comme valeur.
Personnalisation avancée
La solution présentée peut être davantage personnalisée pour inclure des opérateurs ou des opérateurs supplémentaires. fonctions pour améliorer sa fonctionnalité selon les besoins. Par exemple, on peut implémenter des opérateurs de comparaison pour faciliter les comparaisons entre différentes instances du même type ou ajouter des constructeurs pour gérer l'initialisation d'objets complexes.
En résumé, cette approche permet la création d'identifiants fortement typés en C , garantissant sécurité des types pendant les missions et prévention du mélange accidentel de différents types. Cela améliore la lisibilité du code, réduit les erreurs et améliore la qualité globale du logiciel.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!