web-dev-qa-db-fra.com

Violation de complexité cyclomatique: la fonction doit avoir une complexité de 10 ou moins: actuellement, la complexité est égale à 13 (cyclomatic_complexity)

J'ai le code suivant dans Swift3 et j'utilise de la charpie Swift pour lintiner le code. Le code est donné comme suit:

    func selectedMenuInLoggedOutState(sender: UIButton) {
    switch sender.tag {
    case 1:
      if let menu = LeftGuestMenu(rawValue: 0) {
        self.changeGuestViewController(menu)
      }
    case 2:
      if let menu = LeftGuestMenu(rawValue: 1) {
        self.changeGuestViewController(menu)
      }
    case 3:
      if let menu = LeftGuestMenu(rawValue: 2) {
        self.changeGuestViewController(menu)
      }
    case 4:
      if let menu = LeftGuestMenu(rawValue: 3) {
        self.changeGuestViewController(menu)
      }
    case 5:
      if let menu = LeftGuestMenu(rawValue: 4) {
        self.changeGuestViewController(menu)
      }
    case 6:
      if let menu = LeftGuestMenu(rawValue: 5) {
        self.changeGuestViewController(menu)
      }
    default:
      break
    }
  }

Le swiftlint génère un avertissement appelé complexité cyclomatique. Pourquoi cet avertissement survient et comment le résoudre?

 enter image description here

6
Chelsea Shawra

L'avertissement se produit parce que votre fonction est trop complexe, comme défini par la métrique qui compte essentiellement le nombre de décisions à prendre.

Un moyen simple de l'éviter dans ce cas particulier serait avec quelques calculs simples: 

func selectedMenuInLoggedOutState(sender: UIButton) {
    guard let menu = LeftGuestMenu(rawValue: sender.tag - 1) else { return }
    self.changeGuestViewController(menu)
}
8
Daniel T.

La méthode est trop complexe . Mais au lieu de réécrire le code, vous pouvez exclure switches du calcul cyclomatic_complexity (car ils sont parfaitement lisibles) comme ceci:

cyclomatic_complexity:
  ignores_case_statements: true
9
Jakub Truhlář

Si vous ne souhaitez pas modifier votre logique, procédez comme suit: Ajoutez la propriété "cyclomatic_complexity:" et définissez la valeur d'avertissement dans le fichier .swiftlint.yml.

cyclomatic_complexity: warning: 25

Remarque: Ici, le réglage de la valeur d’avertissement signifie l’augmentation du nombre de chemins linéairement indépendants. Vous pouvez définir votre propre valeur.

2
ajaybomma

Vous pouvez réduire votre complexité en éliminant les instructions if let répétées:

func selectedMenuInLoggedOutState(sender: UIButton) {

    let menu: MenuType?

    switch sender.tag {
    case 1:
     menu = LeftGuestMenu(rawValue: 0)
    case 2:
     menu = LeftGuestMenu(rawValue: 1) 
    case 3:
     menu = LeftGuestMenu(rawValue: 2) 
    case 4:
      menu = LeftGuestMenu(rawValue: 3) 
    case 5:
      menu = LeftGuestMenu(rawValue: 4)   
    case 6:
      menu = LeftGuestMenu(rawValue: 5) 
    default:
      menu=nil
    }

    if let menu = menu {
       self.changeGuestViewController(menu)
    }
  }
1
Paulw11