Les métriques les plus courantes pour mesurer la complexité (ou la simplicité, si vous considérez la simplicité comme l'opposé de la complexité) sont la complexité cyclomatique de McCabe et les métriques de complexité de Halstead .
La complexité cyclomatique mesure le nombre de chemins distincts à travers une unité donnée, généralement une méthode ou une fonction, bien qu'il puisse également être calculé sur une classe. À mesure que le nombre de chemins augmente, il devient plus difficile de se souvenir du flux de données à travers un module donné, qui est lié au concept de mémoire de travail . Une complexité cyclomatique élevée tend à indiquer une difficulté dans la capacité de tester un module - davantage de cas de test sont nécessaires pour couvrir les différents chemins à travers le système. Des études ont également établi un lien entre une complexité cyclomatique élevée et des taux de défauts élevés. Typiquement, une complexité cyclomatique de 10 indique qu'une unité doit être revue et éventuellement refactorisée.
Les mesures de complexité Halstead utilisent les entrées d'opérateurs et d'opérandes totaux et distincts pour calculer le volume, la difficulté et l'effort d'un morceau de code. La difficulté, qui est le (nombre d'opérateurs uniques / 2) * (nombre total d'opérandes / nombre d'opérandes uniques), est liée à la capacité de lire et de comprendre le code pour des tâches telles que l'apprentissage du système ou l'exécution d'une révision de code. Encore une fois, vous pouvez compter cela au niveau du système, au niveau de la classe ou au niveau de la méthode / fonction. Il y a quelques articles sur le calcul de ces mesures ici et ici .
Le simple fait de compter des lignes de code peut également vous donner une idée de la complexité. Plus de lignes de code signifie qu'il y a plus à lire et à comprendre dans un module. J'hésiterais à utiliser cela comme une mesure autonome. Au lieu de cela, je l'utiliserais avec d'autres mesures, telles que le nombre de défauts dans un module donné pour obtenir la densité des défauts. Une densité de défauts élevée peut indiquer des problèmes lors de l'écriture de tests et de la réalisation de révisions de code, qui peuvent ou non être causés par un code complexe.
L'entrée et la sortie sont deux autres mesures liées au flux de données. Comme défini ici , le fan in est la somme des procédures appelées, les paramètres lus et les variables globales lues et fan out est la somme des procédures qui appellent une procédure donnée, les paramètres écrits (exposés à des utilisateurs externes, transmis par référence), et les variables globales écrites dans. Encore une fois, une entrée et une sortie élevées peuvent indiquer un module qui peut être difficile à comprendre.
Dans des paradigmes spécifiques, il peut y avoir d'autres mesures ou paramètres qui sont également utiles. Par exemple, dans le monde orienté objet, la surveillance du couplage (désir faible), de la cohésion (désir élevé) et de la profondeur d'héritage (désir faible) peut être utilisée pour évaluer la simplicité ou la complexité d'un système.
Bien sûr, il est important de réaliser que de nombreuses mesures et métriques ne sont que des indicateurs. Vous devez utiliser votre jugement pour déterminer s'il est nécessaire de refactoriser pour augmenter la simplicité ou si cela ne vaut pas la peine de le faire. Vous pouvez effectuer les mesures, calculer les métriques et en savoir plus sur votre code, mais vous ne voulez pas concevoir votre système en fonction des chiffres. En fin de compte, faites ce qui a du sens.