Skip to content

Latest commit

 

History

History
228 lines (199 loc) · 9.03 KB

File metadata and controls

228 lines (199 loc) · 9.03 KB

Qualité du code et documentation

  • La difficulté est de visualiser l’ensemble des rapports produits

  • Il peut être utile d’agréger les différentes mesures pour générer des indicateurs synthétiques

  • Ces indicateurs doivent ensuite être disponibles pour l’ensemble des membres du projet

  • Les réactions face à ces rapports doivent aussi être anticipées

Conventions de codage

Styles de codage

  • Améliore la lisibilité du code source

    • le code est plus facile à comprendre

    • le code est plus facile à maintenir

  • On s’appuie généralement sur l’éditeur de texte et/ou un outil de vérification

Important
L’important est de choisir un style et de s’y tenir !

Exemple : un extrait de code Java ne respectant pas de convention

Que fait cet extrait de code ?
public static <T extends Comparable<? super T>> void f(List<T> l) {
int s=l.size();
int i,j;
for(i=0;i<s-1;++i)
{
for(j=0;j<s-1-i;++j){
if(l.get(j+1).compareTo(l.get(j))<0){
T t=l.get(j);
l.set(j,l.get(j+1));l.set(j+1,t);
}}}
}

Exemple : un extrait de code Java respectant une convention

Que fait cet extrait de code ?
/**
  * Tri la liste passée en paramètre en ordre croissant
  * en respectant l'ordre naturel de ses éléments.
  * Les éléments de la liste doivent implémenter
  * l'interface <code>Comparable</code>.
  * Cet méthode utilise un algorithme de tri a bulle.
  *
  * @param aList la liste à trier
  */
public static <T extends Comparable<? super T>> void bubbleSort(List<T> aList) {
int size = aList.size();
for (int i = 0; i < size - 1; ++i) {
    for (int j = 0; j < size - 1 - i; ++j) {
    if (aList.get(j+1).compareTo(aList.get(j)) < 0) { // compare les deux voisins
        // échange les deux voisins
        T tmp = aList.get(j);
        aList.set(j, aList.get(j + 1));
        aList.set(j + 1, tmp);
    }}
}}

Quelques conventions

Table 1. Style de codage par langage
Plusieurs Java Python C++

Google Style Guides, Google, 2014. Clean Code: A Handbook of Agile Software Craftsmanship, Robert C. Martin, Pearson, 2009.

Java code conventions, SUN, 1999. Coding standards for Java, AmbySoft, 2007. Java Programming Style Guidelines, Fluxens. Java Language Coding Guidelines, Cay Horstmann, 2004.

PEP 8, PEP 8 — the Style Guide for Python Code,

C++ Coding Standards: 101 Rules, Guidelines, and Best Practices, Herb Sutter, Andrei Alexandrescu, Pearson, 2005.

Thèmes abordés par les conventions

  • Structure et contenu d’un fichier source

    • Files longer than 2000 lines are cumbersome and should be avoided.

  • Conventions de nommage

    • Class names should be nouns, in mixed case with the first letter of each internal word capitalized.

  • Format et emplacement des commentaires

    • Short comments can appear on a single line indented to the level of the code that follows.

  • Indentation des lignes

    • Four spaces should be used as the unit of indentation.

  • Format des déclarations, des instructions et emplacement des espaces

    • Each line should contain at most one statement.

  • Quelques bonnes pratiques

    • Don’t make any instance or class variable public without good reason.

Audit des conventions de codage

  • Des outils permettent de réaliser un audit des fichiers sources

  • Génèrent un rapport des violations des conventions de codage

  • Sont généralement configurables pour différentes conventions

Table 2. Outils de vérification des conventions par langage
Java Python

CheckStyle, JCSC,

Pylint

Outils de reformatage

  • Mettre en conformité le code source avec des conventions

  • Concerne uniquement la mise en forme du code (indentation, espaces, …)

  • La plupart des IDE assurent également ce service

Documenter un code source ([wikipedia w])

Qu’est-ce qu’une bonne documentation ?

  • Un commentaire doit clarifier le code

    • la documentation du code doit permettre à une autre personne de mieux comprendre le code

  • Documentez pourquoi les choses sont faites et pas simplement ce qui est fait

    • ne paraphrasez pas le code

  • Rédigez des commentaires simples et concis

  • Écrivez la documentation avant d’écrire le code

    • permet de définir l’objectif en premier

  • Évitez les commentaires décoratifs (bannières, …)

    • ajoute peu de valeurs à la documentation

    • est une perte de temps

Important
Idéalement, un code bien écrit doit se suffire à lui-même, i.e. doit se lire (et se comprendre) facilement sans commentaire.

Intérêt des outils de génération de la documentation

  • Générer automatiquement la documentation (dans diverses formats) du code source

  • Permet de garder plus facilement la documentation en phase avec le code

Table 3. Outils de documentation par langage
Plusieurs Java Python

Doxygen

JavaDoc

pydoc

Audit de code source ([wikipedia w]) et Analyse statique ([wikipedia w])

Audit de code source

  • L'audit ou revue de code consiste à étudier attentivement un code source afin de détecter et de corriger des erreurs

  • L’objectif est d’améliorer la qualité du logiciel et l’expérience des développeurs

  • Peut prendre différentes formes

    Fagan inspection

    est un processus formel pour l’audit de code

    "par dessus l’épaule"

    un développeur suit en temps réel ce qu’un autre écrit

    programmation par binôme

    deux développeurs travaillent de concert et échange leur rôle régulièrement (vient de eXtreme Programming (XP))

    assisté par un outil

    s’appuie sur des outils pour une analyse systématique

Analyse statique du code

  • Certaines erreurs se reproduisent fréquemment dans un fichier source (; après un for, …)

  • La plupart de ces erreurs peuvent être recherchées de façon systématique

  • L'analyse statique permet d’obtenir des informations sur un programme sans l’exécuter

  • Elle est un bon complément aux tests

  • En général, elle n’a pas connaissance de ce que le programme doit faire (recherche de motifs généraux)

  • Des outils proposent un moteur ainsi qu’un ensemble de règles permettant de trouver ce type d’erreurs dans un fichier source

  • L’ensemble de règles peut éventuellement être modifiable

Table 4. Outils d’analyse statique par langage
Java Shell

FindBugs, Pmd, SonarQube

ShellCheck

Quelques bogues courants

  • Boucle récursive infinie

    public MaClasse() {
      MaClasse m = new MaClasse();
    }
  • Déréférencement d’une référence null

    if (c == null && c.uneMethode()) //...
  • Auto affectation d’attribut

    public MaClasse(String uneChaine) {
      this.chaine = chaine;
    }
  • Valeur de retour ignorée

    String nom = //...
    nom.replace('/', '.');

Catégories de bogues

Correction

le code ne fait clairement pas ce qui est attendu

  • déréférencement d’une référence null

Mauvaise pratique

le code ne respecte pas les bonnes pratiques

  • redéfinition d'_equals sans hashCode, comparaison de chaîne avec ==

Problème de sécurité

le code est vulnérable à un usage malveillant

  • injection SQL

Code suspect

le code utilise des pratiques non usuelles

Performance

le code est inefficace

Correction multithread

il y a un problème de correction en environnement multithread

Mise en œuvre de l’analyse statique

  • Intégration au processus de développement

    • intégration à l’IDE, exécution comme les tests unitaires, …

  • Réglage de l’outil utilisé

    • éviter les faux positifs, paramétrer le niveau de détail, …

  • Réfléchir à la prise de décision

    • consultation des rapports, processus pour la correction du bogue, ne pas corriger le bogue, …