inf3143moz-code.org/uqam/cours/inf3143/cours/18_revisions.pdf · 2018-12-06 · inf3143...
TRANSCRIPT
INF3143
Modélisation et spécificationformelles des logiciels
Hiver 2018
Alexandre TerrasaDépartement d’informatique, UQÀM
RévisionsAutomates
2
RE -> NFA
3
Traduire l’expression régulière en NFA
a*(b|cd?)+
RE -> NFA
4
NFA -> DFA
5
RévisionsAssertions
6
Exercice 1
7
Soit le code suivant:
int division(int a, int b) {
assert b > 0;
int res = 0;
while(a >= b) {
res ++;
a -= b;
}
return res;
}
Assertions désactivées
8
Que se passe-t-il si on appelle la méthode avec
a = 10 b = 1
a = 8 b = 2
a = 6 b = 0
Les assertions sont désactivées java -da
Assertions désactivées
9
Que se passe-t-il si on appelle la méthode avec
a = 10 b = 1 # retourne 10
a = 8 b = 2 # retourne 4
a = 6 b = 0 # boucle infinie
Les assertions sont désactivées java -da
Assertions activées
10
Que se passe-t-il si on appelle la méthode avec
a = 10 b = 1
a = 8 b = 2
a = 6 b = 0
Les assertions sont activées java -ea
Assertions activées
11
Que se passe-t-il si on appelle la méthode avec
a = 10 b = 1 # retourne 10
a = 8 b = 2 # retourne 4
a = 6 b = 0 # lève AssertionException
Les assertions sont activées java -ea
Soit le code suivant:
int countChars(String input, char toCount) {
assert input != null;
int count = 0;
for(char c : input.toCharArray()) {
if(c == toCount) {
count ++;
}
}
return count;
}
Exercice 2
12
Assertions désactivées
13
Que se passe-t-il si on appelle la méthode avec
input = “Bonjour” b = ‘z’
input = “Bonjour” b = ‘o’
input = null b = ‘o’
Les assertions sont désactivées java -da
Assertions désactivées
14
Que se passe-t-il si on appelle la méthode avec
input = “Bonjour” b = ‘z’# retourne 0
input = “Bonjour” b = ‘o’# retourne 2
input = null b = ‘o’# lève NullPointeurException (null.toCharArray())
Assertions activées
15
Que se passe-t-il si on appelle la méthode avec
input = “Bonjour” b = ‘z’
input = “Bonjour” b = ‘o’
input = null b = ‘o’
Les assertions sont activées java -ea
Assertions désactivées
16
Que se passe-t-il si on appelle la méthode avec
input = “Bonjour” b = ‘z’# retourne 0
input = “Bonjour” b = ‘o’# retourne 2
input = null b = ‘o’# lève AssertionException (assert input != null)
Soit le code suivant:
List<Integer> getRange(int from, int to) {
assert from <= to;
ArrayList<Integer> res = new ArrayList<>();
while(from <= to) {
res.add(from);
from ++;
}
return res;
}
Exercice 3
17
Assertions désactivées
18
Que se passe-t-il si on appelle la méthode avec
from = 0 to = 10
from = 10 to = 10
from = -10 to = 10
from = 10 to = -10
Les assertions sont désactivées java -da
Assertions désactivées
19
Que se passe-t-il si on appelle la méthode avec
from = 0 to = 10 # [0, 1, 2, …, 10]
from = 10 to = 10 # [10]
from = -10 to = 10 # [-10, -9, …, 9, 10 ]
from = 10 to = -10 # []
Les assertions sont désactivées java -da
Assertions activées
20
Que se passe-t-il si on appelle la méthode avec
from = 0 to = 10
from = 10 to = 10
from = -10 to = 10
from = 10 to = -10
Les assertions sont activées java -ea
Assertions désactivées
21
Que se passe-t-il si on appelle la méthode avec
from = 0 to = 10 # [0, 1, 2, …, 10]
from = 10 to = 10 # [10]
from = -10 to = 10 # [-10, -9, …, 9, 10 ]
from = 10 to = -10 # AssertionError
Les assertions sont désactivées java -da
RévisionsTests unitaires
22
Exercice 1
23
Voir la classe TemplateVar
https://github.com/Morriar/INF3143_revisions_final
Écrire les tests unitaires pour les méthodes
● TemplateVar / checkVarString● getVarName● getRegex
Exercice 2
24
Voir la classe Template
https://github.com/Morriar/INF3143_revisions_final
Écrire les tests unitaires pour les méthodes
● parse● registerVar / hasVar / getVar● render
Exercice 3
25
L’implémentation de Template / TemplateVar contient un bogue…
Il faut:
1. l’isoler grâce à vos tests2. le fixer
Sur GitHub:
https://github.com/Morriar/INF3143_revisions_final/tree/correction/test/ex2
Exercices 1, 2, 3
26
RévisionsContrats
27
Question de rappel
28
Quels sont les 6 principes de la conception par contrats?
Question de rappel
29
Quels sont les 6 principes de la conception par contrats?
1. Séparer requêtes et commandes
2. Séparer requêtes primitives et dérivées
3. Pour chaque requête dérivée, écrire une post-condition spécifiant la valeur de chaque requête primitive
4. Pour chaque commande, écrire une post-condition spécifiant la valeur de chaque requête primitive
5. Pour chaque requête et commande, décider d’une pré-condition que le client doit remplir
6. Écrire les invariants décrivant les propriétés non-variables des objets
Exercice 1
30
Parmi les méthodes de la classe ArrayList de Java, lesquelles sont des commandes, lesquelles sont des requêtes, ou ni l’un ni l’autre?
https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#method_summary
Exercice 1
31
requêtes
get,
contains
indexOf,
isEmpty,
lastIndexOf,
size
commandes
add(int, E),
clear,
ensureCapacity,
removeRange,
trimToSize
presque commandes
add(E),
addAll,
remove
removeAll
retainAll
set
Exercice 2
32
Parmi les requêtes de la classe ArrayList, lesquelles sont des primitives, lesquelles sont des dérivées?
https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#method_summary
Exercice 2
33
requêtes primitives
get,
indexOf,
lastIndexOf,
size
requêtes dérivées
isEmpty,
contains
Exercice 3
34
Utilisez l’approche de conception par contrats vue en classe pour écrire les contrats des classes suivantes:
● Template● TemplateVar
Sur GitHub:
https://github.com/Morriar/INF3143_revisions_final/tree/correction/src/ex2
Exercice 3
35
Exercice 4
36
Soit l’interface IVaisseau
interface IVaisseau {
@Requires(“e instanceOf Equipement”)
void chargeEquipement(Equipement e);
}
Que pensez-vous du contrat suivant?
public class VaisseauCombat implements IVaisseau {
@Requires(“e instanceOf EquipementMilitaire”)
public void chargeEquipement(Equipement e);
}
Exercice 4
37
Soit l’interface IVaisseau
interface IVaisseau {
@Requires(“e instanceOf Equipement”)
void chargeEquipement(Equipement e);
}
public class VaisseauCombat implements IVaisseau {
@Requires(“e instanceOf EquipementMilitaire”)
public void chargeEquipement(Equipement e);
}
Pré-condition renforcée: invalide
Exercice 5
38
Soit l’interface IVaisseau
interface IVaisseau {
@Ensures(“result <= 100”)
int vitesseMax();
}
Que pensez-vous du contrat suivant?
public class MonVaisseau implements IVaisseau {
@Ensures(“result <= 200”)
int vitesseMax();
}
Exercice 5
39
Soit l’interface IVaisseau
interface IVaisseau {
@Ensures(“result <= 100”)
int vitesseMax();
}
public class MonVaisseau implements IVaisseau {
@Ensures(“result <= 200”)
int vitesseMax();
}
Post-condition affaiblie: invalide
Pour un examen en douceur...
40
Quelques conseils
● la documentation est autorisée● lisez bien les questions● lisez bien le code● allez-y par élimination● ...● remplissez bien les cases avec un stylo
bleu ou noir!