2009-12-09 4 views

Répondre

3

Les concepts de conception par contrat sont légèrement compliqués lorsqu'ils sont adaptés à des langages orientés objet. Un invariant de classe est une propriété que chaque instance de la classe est censée avoir lorsqu'une méthode est appelée (comme une condition préalable commune à toutes les méthodes), et qu'en retour, chaque méthode et constructeur doit s'assurer qu'elle reste vraie quand ils se terminent (comme une post-condition commune).

Ils sont bons pour exprimer des conditions de cohérence. Une classe Wallet qui modélise un portefeuille réel peut avoir la classe invariant que la quantité contenue est toujours positive.

Les invariants de classe, comme le reste du contrat, sont hérités. Les nouvelles implémentations de méthodes doivent fournir les mêmes garanties que les méthodes qu'elles remplacent.

+0

invariants de classe appliquent aux instances, non méthodes, et les méthodes doivent fournir le même (ou un surensemble) de garanties de postcondition que la méthode qu'ils remplacent mais peuvent ignorer les conditions préalables. –

+0

Je ne suis pas sûr de ce que vous entendez par "Les invariants de classe s'appliquent aux instances, pas aux méthodes". L'endroit où vous faites l'invariant de classe est au début de chaque méthode, et l'endroit où il doit être assuré est à la fin de chaque méthode. En outre, les logiciens utilisent l'adjectif «plus fort» lorsqu'ils comparent les propriétés, et non «superset de». Et bien sûr, vous pouvez ignorer les conditions préalables: les conditions préalables sont des hypothèses, vous êtes toujours autorisé à ne pas utiliser d'hypothèses. –

+0

Oh, je pense que je comprends maintenant. Vous voulez dire qu'au lieu de dire "Un invariant de classe est une propriété que chaque objet de la classe ..." J'aurais dû dire "Un invariant de classe est une propriété que chaque instance de la classe ...". Merci d'avoir pris le temps de me le faire savoir. –

2

Dans la classe héritée, les invariants devraient être au moins aussi stricte, mais ils peuvent être plus strictes . Si un invariant est omis dans une classe dérivée, les invariants de la classe de base s'appliquent bien sûr.

par exemple:

// Class invariant : sum should be > -1000 
Account { public int sum; } 

// Class invariant : sum should be >= 0 
AccountForKids : inheritsFrom Account { public int sum; } 

Le compte pour les enfants ne doit pas aller au-dessous de zéro, mais bien sûr, est plus grand que -1000.

En général: Le contrat d'une classe dérivée est toujours animé lorsque les invariants de classe deviennent plus stricts.

1

Un invariant de classe dérivée doit:

  • Vérifiez les invariants de toutes les variables membres introduites dans la classe dervied
  • Vérifiez l'invariant de la classe de base