Sonarqube – Règle S3776 – Complexité cognitive

L’équipe de SonarSource a publié un article intéressant sur la complexité cognitive. Il s’agit d’une métrique de code qui permet d’évaluer la complexité d’une méthode de manière à mieux représenter la complexité comparativement à la complexité cyclomatique.

Laquelle des deux méthodes suivantes vous apparaît comme plus complexe?

int sumOfPrimes(int max) {              // +1
  int total = 0;
  OUT: for (int i = 1; i <= max; ++i) { // +1
    for (int j = 2; j < i; ++j) {       // +1
      if (i % j == 0) {                 // +1
        continue OUT;
      }
    }
    total += i;
  }
  return total;
}                  // Cyclomatic Complexity 4
  String getWords(int number) { // +1
    switch (number) {
      case 1:                   // +1
        return "one";
      case 2:                   // +1
        return "a couple";
      default:                  // +1
        return "lots";
    }
  }        // Cyclomatic Complexity 4

Source : https://blog.sonarsource.com/cognitive-complexity-because-testability-understandability/

Dans ce cas, la complexité cyclomatique ne représente pas la réelle complexité que perçoit le développeur en lisant le code. Quand on gère comme il se doit notre dette technique, on tente d’éviter les pertes de temps reliées à la compréhension du code. Pour détecter ces « code smells », on peut donc se fier à la métrique de complexité cognitive.

SonarLint et Sonarqube sont des outils qui permettent de détecter la trop grande complexité cognitive dans le code de multiples langages comme C#, Java, Python, etc..

Malheureusement, on ne peut pas personnaliser la limite de complexité dans SonarLint pour Visual Studio.

http://www.sonarlint.org/visualstudio/rules/index.html#sonarLintVersion=2.12.0&ruleId=S3776&language=C#

On peut quand même bénéficier de cette validation gratuitement dans le code C#. Cependant, elle ne contribue pas à faire augmenter la quantité de dette technique dans l’outil Sonarqube. Difficile d’évaluer une durée de correction en fonction de la complexité.

Pour le détail sur la manière de calculer la métrique, consulter le blog de sonarsource.