image/svg+xml $ $ ing$ ing$ ces$ ces$ Res Res ea ea Res->ea ou ou Res->ou r r ea->r ch ch ea->ch r->ces$ r->ch ch->$ ch->ing$ T T T->ea ou->r

Documenter son code (quel que soit le langage utilisé) est important pour plusieurs raisons :

Lisibilité du code

Le code-source doit être facilement lisible par un humain. Pour cela on peut adopter une convention d'écriture et s'y conformer. Il existe de nombreuses conventions avec chacune ses thuriféraires et ses détracteurs (les goûts et couleurs ne se discutent pas). Il existe des raisons plus ou moins rationnelles de préférer une convention plutôt qu'une autre. Pour un projet donné, l'important est de rester homogène : un projet pourra imposer une certaine convention.

Pour toutes les conventions, il est important :

Il existe des outils réalisant l'indentation automatique du code. On peut ainsi utiliser un environnement de développement intégré (IDE tel que Eclipse, Visual Studio Code...) ou alors un utilitaire tel que indent :

indent code.cpp -o corrected_code.cpp

En langage C++, il existe de nombreuses conventions d'écriture :

La juste dose de commentaire

Le code-source doit être agrémenté d'une juste dose de commentaires. En règle générale, les modules, les classes, méthodes et fonctions doivent être précédées d'un commentaire décrivant leur rôle ainsi que leur usage (signification de chaque paramètre, valeurs attendues pour les paramètres, informations sur la valeur de retour calculée...). Il est conseillé de démarrer ces commentaires par /** pour les distinguer des commentaires locaux.

A l'intérieur des blocs de code, on peut également indiquer des commentaires si le code n'est pas très explicite par lui-même ou si des choix peu évidents ont été réalisés (afin de les expliquer). C'est d'autant plus important pour les algorithmes d'un certain niveau de complexité.

En règle générale, on indique en début de fichier des informations sur l'identité de l'auteur du code ainsi que la licence sous laquelle celui-ci est disponible.

Voici un exemple de programme documenté calculant un nombre de Fibonacci pour un rang précisé par l'utilisateur en utilisant une méthode itérative :

/* 
 * Copyright 2018 Michel Chilowicz
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * fibo.cpp
 * A program computing Fibonacci numbers using a classical iterative method
 * 
 * @author Michel Chilowicz
 * @email chilowi@u-pem.fr
 * @version 1.0 2018/11/15
 * @license Apache License
 */

#include <iostream>

using namespace std;

/* First values of the Fibonacci sequence */
const uint64_t FIBO_0 = 1;
const uint64_t FIBO_1 = 1;

/**
 * Swap two references in memory.
 * 
 * @param a first reference
 * @param b second reference
 */
template<class T>
void exchange(T& a, T& b) {
	T c = a;
	a = b;
	b = c;
}

/**
 * Compute the Fibonacci number of the given rank.
 * 
 * For large ranks, note that the computed Fibonacci number may exceed the
 * capacity of the return type uint64_t.
 * 
 * @param n rank whose Fibonacci number is expected
 * 				The rank must be positive or null
 * @return the Fibonacci number of rank n
 */
uint64_t fibo(const int n) {
	// We keep the two last Fibonacci numbers
	// we initialize them with the constant values of fibo(0) and fibo(1)
	uint64_t previous = FIBO_0;
	uint64_t last = FIBO_1;
	
	if (n == 0) return previous;
	else if (n == 1) return last;
	else {
		for (int i = 2; i < n; i++) {
			previous += last;
			exchange(previous, last);
		}
	}
	return last;
}

/**
 * Entry point of the program.
 * We ask the rank of the Fibonacci number the user wants to compute.
 * We print the result on the standard output.
 * We continue while the user supplies valid positive ranks.
 */
int main() {
	while (true) {
		cout << "Enter the rank of the Fibonacci number to be computed" << endl;
		int rank = -1;
		cin >> rank;
		if (rank < 0 || cin.fail())
			return 0;
		else {
			auto result = fibo(rank);
			cout << "fibo(" << rank << ") = " << result << endl;
		}
	}
}

Génération d'une documentation

Des outils permettent de générer une documentation depuis le code-source en extrayant les commentaires en tête des classes et méthodes. On pourra citer notamment Doxygen assez utilisé pour le langage C++ (Doxygen est également compatible pour d'autres langages). Doxygen propose une interface graphique (doxywiard) afin de choisir les différentes options de configuration. On peut ainsi choisir de générer une documentation au format HTML avec moteur de recherche, en PDF (en utilisant LaTeX), au format manpage ou alors en fichier RTF. Le style de la documentation peut être personnalisé par exemple en fournissant ses propres feuilles de styles ou logos pour la version HTML.