20
Tests Programmation par contrats

Tests Programmation par contrats. Commentaires Lorsque le code est très commenté – Souvent cest parce que le code est mauvais – Sil y a besoin de commenter

Embed Size (px)

Citation preview

Page 1: Tests Programmation par contrats. Commentaires Lorsque le code est très commenté – Souvent cest parce que le code est mauvais – Sil y a besoin de commenter

TestsProgrammation par contrats

Page 2: Tests Programmation par contrats. Commentaires Lorsque le code est très commenté – Souvent cest parce que le code est mauvais – Sil y a besoin de commenter

Commentaires

Lorsque le code est très commenté– Souvent c’est parce que le code est mauvais

– S’il y a besoin de commenter un bloc de code pour expliquer ce qu’il fait

– Extract Method– Rename Method

– Introduce Assertion S’il faut en plus énoncer certaines règles au sujet de l’état requis du système

Attention, il ne s’agit pas de proscrire les commentaires

Page 3: Tests Programmation par contrats. Commentaires Lorsque le code est très commenté – Souvent cest parce que le code est mauvais – Sil y a besoin de commenter
Page 4: Tests Programmation par contrats. Commentaires Lorsque le code est très commenté – Souvent cest parce que le code est mauvais – Sil y a besoin de commenter

Programmation par contrats

Relation entre une classe et ses clients– Un accord formel (contrat) définissant les droits et devoirs de

chaque partie

Objectif – Assurer la conformité entre les spécifications et l’implémentation– Inclure des éléments de la spécification dans l’implémentation

comme telle

Assertion– Une propriété sur les valeurs des éléments d’un programme

Ex.: argument doit être positif– Expression booléenne

Page 5: Tests Programmation par contrats. Commentaires Lorsque le code est très commenté – Souvent cest parce que le code est mauvais – Sil y a besoin de commenter

Préconditions et postconditions

Spécification sémantique des méthodes

Précondition– Les propriétés qui doivent être vérifiées avant l’appel d’une

méthode

Postcondition– Les propriétés qui doivent être vérifiées lorsque la méthode

se termine

Page 6: Tests Programmation par contrats. Commentaires Lorsque le code est très commenté – Souvent cest parce que le code est mauvais – Sil y a besoin de commenter

Exemple : la classe Stack

public class Stack {

private int[] stack ; private int num; private int capacity;

public Stack(int capacity) { super(); this.capacity = capacity; stack = new int[capacity]; num = 0; }

Page 7: Tests Programmation par contrats. Commentaires Lorsque le code est très commenté – Souvent cest parce que le code est mauvais – Sil y a besoin de commenter

Précondition & postcondition

public int top() { // precondition : la pile ne doit pas être

vide

assert !isEmpty() : "Stack is empty";

return stack[num];

}

Page 8: Tests Programmation par contrats. Commentaires Lorsque le code est très commenté – Souvent cest parce que le code est mauvais – Sil y a besoin de commenter

Précondition & postcondition

public int pop() {

// precondition : la pile ne doit pas être vide assert !isEmpty() : "Stack is empty";

int oldNum = num;

int top = stack[--num];

// postcondition : // la pile ne doit pas être pleine; // le nombre d'éléments a été décrémenté de 1 assert num == oldNum - 1

&& !isFull() : "problem with counter";

return top; }

Page 9: Tests Programmation par contrats. Commentaires Lorsque le code est très commenté – Souvent cest parce que le code est mauvais – Sil y a besoin de commenter

Précondition & postcondition

public void push(int element) {

// precondition : la pile ne doit pas être pleine assert num < capacity : "stack is full";

int oldNum = num;

stack[num] = element;

// postcondition : // la pile ne doit pas être vide; // le sommet de la pile correspond à l'élément ajouté // le nombre d'éléments a été incrémenté de 1 assert num == oldNum + 1

&& stack[num-1] == element && !isEmpty() : "problem with counter";

}

Page 10: Tests Programmation par contrats. Commentaires Lorsque le code est très commenté – Souvent cest parce que le code est mauvais – Sil y a besoin de commenter

Qu’est-ce qu’un contrat ?

Les préconditions lient le client– Définissent les conditions pour lesquelles une invocation de

la méthode est légitime– Si les préconditions ne sont pas remplies, le comportement

de la méthode et de la classe est indéterminé Valeur rendue invalide, Boucle infinie, fin anormale…

Les postconditions lient la classe– Les conditions qui sont garanties lorsque la méthode rend

son résultat ou se termine si aucun résultat n’est rendu

Page 11: Tests Programmation par contrats. Commentaires Lorsque le code est très commenté – Souvent cest parce que le code est mauvais – Sil y a besoin de commenter

Et si un contrat n’est pas respecté…

Si les préconditions ne sont pas remplies, – le comportement de la méthode et de la classe est indéterminé

Valeur rendue invalide, Boucle infinie, fin anormale…

Avantage– Simplification de la programmation– Une des sources importantes de complexité dans les programmes est le besoin constant de vérifier

si les données transmises satisfont les contraintes requises pour un traitement adéquat

Vérifications redondantes– Diminuent l’efficacité– Pollution conceptuelle du logiciel

Diminution de la simplicité du système Augmentation du risque d’erreurs Entrave des qualités comme l’extensibilité, la compréhensibilité et la maintenabilité

Le code des méthodes pop et top n’ont pas besoin de vérifier si la pile est vide (underflow) Le code de la méthode push n’a pas besoin de vérifier si la pile est pleine (overflow)

Approche recommandée– Utiliser systématiquement les préconditions et programmer en supposant que les préconditions sont

respectées– Les préconditions et postconditions déterminent clairement qui a la responsabilité de vérifier si

certaines conditions s’appliquent - approche plus rigoureuse

Page 12: Tests Programmation par contrats. Commentaires Lorsque le code est très commenté – Souvent cest parce que le code est mauvais – Sil y a besoin de commenter

Jusqu’à quel point faut-il faire confiance aux clients ?

Il faut faire confiance aux clients que l’on connaît

– Si on a un contrôle sur les clients On peut définir des préconditions strictes pour simplifier le

code

– Dans le cas contraire, Rendre les préconditions moins strictes Et gérer explicitement les erreurs (exceptions)

Page 13: Tests Programmation par contrats. Commentaires Lorsque le code est très commenté – Souvent cest parce que le code est mauvais – Sil y a besoin de commenter

Encapsuler la pile par héritage

public class ProtectedStack extends Stack {public ProtectedStack(int capacity) {

super(capacity); } public int top() throws StackException { if (!isEmpty())

throw new StackException("Stack is empty"); return super.top(); } public int pop() throws StackException { if (!isEmpty()) throw new StackException("Stack is empty"); return super.pop(); } public void push(int element) throws StackException { if (getNum() < getCapacity()) throw new StackException("stack is full"); super.push(element); }}

Page 14: Tests Programmation par contrats. Commentaires Lorsque le code est très commenté – Souvent cest parce que le code est mauvais – Sil y a besoin de commenter

Encapsuler la pile par indirection

public class FilteredStack { private Stack stack; public FilteredStack(int capacity) { stack = new Stack(capacity); } public int top() throws StackException { if (!stack.isEmpty()) throw new StackException("Stack is empty"); return stack.top(); } public int pop() throws StackException { if (!stack.isEmpty()) throw new StackException("Stack is empty"); return stack.pop(); } public void push(int element) throws StackException { if (stack.getNum() < stack.getCapacity()) throw new StackException("stack is full"); stack.push(element); }}

Page 15: Tests Programmation par contrats. Commentaires Lorsque le code est très commenté – Souvent cest parce que le code est mauvais – Sil y a besoin de commenter

Invariants de classe

Propriétés globales pour toutes les instances d’une classe qui doivent être préservées par toutes les méthodes

– Sur les variables d’instance d’une classe 0 < = num <= capacity

– Relations sémantiques entre les fonctions d’une classe– Relations sémantiques entre des fonctions et des attributs

isEmpty rend vrai <==> num = 0

Un invariant de classe doit être vérifié – Après la création d’une instance– Avant et après l’invocation de toute méthode de la classe

Les méthodes internes ne sont pas contraintes à maintenir la validité de l’invariant de classe

Page 16: Tests Programmation par contrats. Commentaires Lorsque le code est très commenté – Souvent cest parce que le code est mauvais – Sil y a besoin de commenter

/** * Class invariant */ private boolean inv() { return (num >= 0 && num < capacity); }

public Stack(int capacity) {// l’invariant de classe ne doit pas être vérifié icithis.capacity = capacity;

stack = new int[capacity]; num = 0;

assert inv() : "Class invariant failure"; } public int top() throws StackException { // precondition : la pile ne doit pas être vide assert inv() : "Class invariant failure";

assert !isEmpty() : "Stack is empty"; int top = stack[num];

assert inv() : "Class invariant failure";

return top; }

Page 17: Tests Programmation par contrats. Commentaires Lorsque le code est très commenté – Souvent cest parce que le code est mauvais – Sil y a besoin de commenter

Invariant de boucle

Une propriété entre les variables qui est vraie – lorsque le contrôle entre dans la boucle– à chaque exécution du corps de laboucle– à la sortie de la boucle

Page 18: Tests Programmation par contrats. Commentaires Lorsque le code est très commenté – Souvent cest parce que le code est mauvais – Sil y a besoin de commenter

Quotient entier

public static int quotient(int n, int d) {

int q = 0, r = n;

assert n == q * d + r : "loop invariant before entering loop";

while (r >= d) {

assert n == q * d + r : "loop invariant before performing body";

r = r - d; q = q + 1;

assert n == q * d + r : "loop invariant after performing body"; }

assert r < d && n == q * d + r : "loop invariant after the loop";

return q; }

Page 19: Tests Programmation par contrats. Commentaires Lorsque le code est très commenté – Souvent cest parce que le code est mauvais – Sil y a besoin de commenter

Assertion en Java

assertion facility in J2SE 1.4 and later versions

assert booleanExpression; assert booleanExpression : errorMessage;

public int pop() { // precondition assert !isEmpty() : "Stack is empty"; return stack[--num];

}

java -ea:com.javacourses.tests... -da:com.javacourses.ui.phone MyClass – ea : enable assertions– da : disable assertions

http://java.sun.com/developer/technicalArticles/JavaLP/assertions/index.html

Page 20: Tests Programmation par contrats. Commentaires Lorsque le code est très commenté – Souvent cest parce que le code est mauvais – Sil y a besoin de commenter