Java pour l'informatique industrielle
Chapitre 1. Introduction aux objets
Chapitre 2. Les structures de contrôle
2.1. Abstraction et modularité
2.2. La comparaison
2.3. Le choix
2.3.1. Le bloc if/else
2.3.2. Le bloc if
2.3.3. Le bloc switch
2.3.4. Les invariants
2.4. Les constructeurs
2.5. La surcharge
2.6. La répétition
2.7. Les variables
2.8. Le domaine de valeur
2.9. Exercice
Chapitre 3. Unifier et réutiliser
Chapitre 4. Modèle, Vue et Contrôle
Chapitre 5. Les entrées/sorties
Page d'accueilTable des matièresNiveau supérieurPage précédenteBas de la pagePage suivante

2.3.4. Les invariants

Une autre solution (la plus fréquente) consiste à calculer l'état suivant par une expression arithmétique plutôt que d'explorer toutes les possibilités.

void incrementer3() { if (this.etat < 29) { this.etat += 3; } else { // sinon etat >= 29, on dépasse de 31 this.etat += (3 - 32) ; // équivaut à this.etat -= 29; } }

Il faut faire attention à trouver le bon compromis entre la lisibilité et le nombre de lignes. Cette dernière solution a en effet moins de lignes, mais nécessite une réflexion plus longue pour se convaincre qu'elle est juste. Dans ce cas, on peut travailler par invariants.

Ici, on veut s'assurer que quoi qu'il arrive, l'état sera toujours dans l'intervalle [0,32[.
0 ≤ etat < 32 est donc notre invariant. On remarque que cet invariant est vrai pour l'état initial (0).

/** invariant : 0 ≤ etat < 32 */ void incrementer3() { /* On suppose que l'invariant est vrai avant l'appel */ if (this.etat < 29) { /* invariant : 0 ≤ etat < 29 * donc : 3 ≤ etat+3 < 32 */ this.etat += 3; /* invariant : 3 ≤ etat < 32 */ } else { /* invariant : 29 ≤ etat < 32 * donc : 0 ≤ etat-29 < 3 */ this.etat += (3 - 32) ; // équivaut à this.etat -= 29; /* invariant : 0 ≤ etat < 3 */ } } /* on constate qu'il est alors maintenu après l'appel dans tous les cas ! */

Il faudrait faire ce calcul pour chacune des méthodes de la classe.

Source : Compteur5Bits.java

Page d'accueilTable des matièresNiveau supérieurPage précédenteHaut de la pagePage suivante