Qu'est-ce qu'un invariant de classe?
Dans la conception et la programmation informatique orientées objet, un invariant de classe est un ensemble de règles pouvant être utilisées pour définir si une instance d'objet existe dans un état valide. Du point de vue de la conception, un invariant de classe est un ensemble de limites entre lesquelles les données d'un objet doivent être classées pour être prises en compte dans un état fonctionnel approprié. Un invariant de classe peut être défini dans la documentation de conception ou dans les commentaires de code source ou, dans certains langages de programmation, directement implémenté dans du code informatique pouvant faire l'objet d'une action. Un programme qui utilise des invariants et des assertions codés peut provoquer l'arrêt du programme ou générer diverses erreurs lorsque les conditions d'invariant ne sont pas remplies. Contrairement à la vérification d'erreur standard, les invariants de classe sont généralement utilisés uniquement pour garantir le bon fonctionnement de l'implémentation interne d'une classe. Ils ne sont généralement pas répertoriés dans la documentation publique ni dans les interfaces de programmation.
À partir d'un niveau très basique, un invariant de classe est essentiellement un ensemble d'assertions pour une classe. Une assertion, encore une fois en termes simples, est une instruction qui vérifie une partie de l'état de la classe et doit être évaluée à true pour que l'exécution du programme se poursuive. Un exemple d'assertion est une instruction qui assure qu'un entier donné est toujours compris entre 1 et 10. Lorsqu'un invariant de classe est utilisé, les assertions sont évaluées pour toutes les parties pertinentes des données détenues par l'objet, en validant essentiellement que toutes les données de la objet sont dans les plages définies.
Dans de nombreux cas, l'utilisation d'un invariant de classe ressemble fortement à la vérification d'erreur standard, dans laquelle les variables sont mesurées pour s'assurer qu'elles se trouvent dans les limites utilisables ou qu'elles ne sont pas nulles. La différence entre l'utilisation d'invariants de classe et la vérification des erreurs standard réside toutefois dans le fait que les invariants et les assertions sont principalement utilisés pour capturer les erreurs qui ne devraient pas se produire, sauf en cas de défaut intrinsèque du code. Une autre différence est que la vérification d'erreur standard implique généralement une reprise et des modifications du flux de contrôle du programme, alors que le résultat d'un échec invariant devrait être la fin du programme. La plupart des programmes se terminent lorsqu'une vérification invariante par classe échoue parce que l'objet est dans un état compromis et qu'il n'est pas en mesure, du point de vue de la conception, de remplir ses conditions préalables et post-conditions nécessaires pour respecter son contrat de conception.
L'une des propriétés d'un invariant de classe dans les langages de programmation orientés objet dans lesquels ils sont définis implicitement est que l'invariant est un mécanisme hérité par toutes les sous-classes. Cela empêche une sous-classe de remplacer les vérifications invariantes effectuées dans la classe parente. En fin de compte, cela signifie qu'une sous-classe est incapable de rompre le contrat de conception établi par la super-classe, ce qui pourrait entraîner des résultats imprévisibles ou des erreurs de programme difficiles à trouver.