Les blocs conditionnels If, Case, etc…
Il m’arrive souvent de voir des blocs de code de contrôle inutilement complexes, mais je suis tombé récemment sur un bloc qui m’a particulièrement bluffé :
-
if( iNb < 100 ) {
-
if( iNb > 50 ) {
-
[… bloc 1 …]
-
} else if( iNb > 30 ) {
-
[… bloc 2 …]
-
} else if( iNb > 10 ) {
-
if( iNb <= 20 ){
-
[… bloc 3 …]
-
} else {
-
[… bloc 4 …]
-
}
-
}
-
}
Lorsque l’on remplit les [...] avec des dizaines de lignes de code (ce que je déconseille aussi fortement), on se retrouve vite à oublier le contrôle mal organisé qui se planque dans le code…
Il existe une pratique simple, qui doit être mise sous forme de théorie quelque part sur le net, qui consiste d’abord à visualiser les ensembles sur lesquels on fait le contrôle. Ici, on peut facilement déterminer 4 ensembles que l’on essaye de distinguer:
iNb dans ]50, 100[ (bloc 1)
iNb dans ]30, 50 [ (bloc 2)
iNb dans ]20, 30 [ (bloc 3)
iNb dans ]10, 20 [ (bloc 4)
Ensuite, le principe de base est le suivant : on conditionne sur le plus grand conteneur d’abord, et on restreint par la suite. On se retrouve alors avec un code beaucoup plus clair :
-
if( iNb < 100 ){
-
[… bloc 1 …]
-
} else if( iNb < 50 ) {
-
[… bloc 2 …]
-
} else if( iNb < 30 ) {
-
[… bloc 3 …]
-
} else if( (iNb < 20) && (iNb > 10) ){
-
[… bloc 4 …]
-
}
Autre possibilité, encore plus lisible je trouve :
-
if((iNb > 50) && (iNb < 100)){
-
[… bloc 1 …]
-
} else if ((iNb > 30) && (iNb < 50)){
-
[… bloc 2 …]
-
} else if ((iNb > 20) && (iNb < 30)){
-
[… bloc 3 …]
-
} else if ((iNb > 10) && (iNb < 20)){
-
[… bloc 4 …]
-
}
On redécrit les ensembles directement au sein des conditionnelles, de manière à ce que l’on ait pas à retrouver la condition précédente pour bien comprendre l’actuelle… Enfin tout du moins c’est ce que je pense…