2. Hello!
Je suis Sylvain Leroy
Vous pouvez me trouver sur :
sylvain.leroy@tocea.com / @sleroy0
about.me/sylvain_leroy
2007
Ingénieur
Recherche
Informatique
2011
Création
Société Tocea
2014
Acquisition Tocea
Groupe Metrixware
CTO Tocea
2015
Acquisition Echoes
Groupe Metrixware
CTO MetrixwareProjet Recherche
3. Ma Société
▧ Assistance Qualité / Recette
applications
▧ Modernisation automatique
d’applications
▧ Offre Intégration Usine
Logicielle
▧ Formateurs Bonnes Pratiques
/Cleancode / Qualité / Devops
▧ Distributeur Outils de
qualité de code
(Optimyth)
▧ Komea Dashboard
(Pilotage développements
par la
qualité/productivité)
▧ Offres Cobol/Mainframe
8. La méthodologie DDD
public boolean peutReserver(Cargo cargo, Voyage voyage) {
double maxReservations = voyage.capacite *
Constants.SURCAPACITE_RATIO;
if (voyage.tailleCargoReserve + cargo.taille >
maxReservations) {
return false;
}
}
public boolean peutReserver(Cargo cargo, Voyage voyage) {
if (!overbookingRegle.estAutorisee(cargo, voyage)) {
return false;
}
}
9. Domain Driven Design
▧ Définition d’un langage commun utilisateur
/ concepteurs / développeurs
▧ Documentation d’un lexique des termes
métiers (et règles métiers)
▧ Inférence entre le métier et la structure de
l’application
▧ Définition d’un modèle métier
▧ Nécessité de silo-ter
fonctionnellement/données => Architecture
microservices
▧ Des frameworks existent (optionnels) : Qi4J
12. Le choix d’une technologie peut avoir un impact sur la
qualité du produit
JDBC pur
193 lignes Java
Spring JDBC
140 lignes Java
MyBatis
46 lignes XML
Spring Data
20 lignes Java
15. Les choix de licences
GPL/LGPL/AGPL/WTF/ASF/CC?
https://www.inria.fr/content/download/5896/48452/version/2/file/INRIA_recueil_fiches_lic
ences_libres_vf.pdf
30. L’algorithmie
Exemple Parcours de LinkedList
LinkedList<Integer> notes = …
int total =0;
for (int i = 0 ; i < notes.size() ; ++i) {
total += notes.get(i);
}
31. L’algorithmie (suite)
public static String treatString(final String str) {
final int length = str.length();
final List<Character> charList = new ArrayList<Character>(str.length());
for (int zIndex = -1; zIndex < length - 1; ++zIndex) {
charList.add(str.charAt(zIndex + 1));
}
final List<Character> charList2 = new LinkedList<Character>();
int z2Index = -2;
final int value = 8;
final int res = value % 3;
while (z2Index < length - 2) {
charList2.add(charList2.size(), charList.get(z2Index + res));
z2Index++;
}
final char[] array = new char[length];
for (int i = 0; i < length; ++i) {
array[length - i - 1] = charList2.get(i);
}
return new String(array);
}
}
32. L’algorithmie (bad smells)
public static String treatString(final String str) {
final int length = str.length();
final List<Character> charList = new ArrayList<Character>(str.length());
for (int zIndex = -1; zIndex < length - 1; ++zIndex) {
charList.add(str.charAt(zIndex + 1));
}
final List<Character> charList2 = new LinkedList<Character>();
int z2Index = -2;
final int value = 8;
final int res = value % 3;
while (z2Index < length - 2) {
charList2.add(charList2.size(), charList.get(z2Index + res));
z2Index++;
}
final char[] array = new char[length];
for (int i = 0; i < length; ++i) {
array[length - i - 1] = charList2.get(i);
}
return new String(array);
}
} CC=4
Nommage !
Performance!
MagicNumbers
Indice complexe
Faille de sécurité!
34. Attention aux faux-
positifs!
Exemple Règles Hibernate
Equals/Hascode doivent être
implémentés
Analyse syntaxique, sémantique,
héritage des classes, fonctionnelle
(que vérifie le equals)...
40. Quelles métriques utiles ?
A lire : Métriques et critères d'évaluation de la qualité du code source d’un logiciel
Métrique Seuil conseillé
Nombre d’erreurs bloquantes /critiques 0
Taux de couverture de code 80%
Densité de commentaire 20-40%
Complexity Cyclomatique (Méthode) <= 10
Complexité NPath <= 5
Couverture (branches) 80%
Couvertures (% loc) 80%
Nombre de lignes de code / module Small (2K), Intermediate(8K), Medium(32K),
Large(128K), Very Large (512K)
% API Publique documentée 100%
Couplage afférent/efférent 20
43. Comment construire son référentiel
▧ Evaluer l’impact du défaut associé à la règle
BLOCKER : Conséquence visible à l’utilisateur ?
CRITICAL : Conséquence invisible mais
comportement anormal vérifié
MAJOR : Conséquence invisible, comportement
anormal possible mais non déterministe
CRITICAL : Impact sur la capacité à tester
(unitairement, intégration)
MINOR, INFO : Pas d’anomalie de comportement
possible