web-dev-qa-db-ja.com

循環的複雑度違反:関数の複雑度は10以下である必要があります:現在の複雑度は13です(cyclomatic_complexity)

私はSwift3に次のコードがあり、コードをリントするためにSwift lintを使用しています。コードは次のように与えられます:

    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
    }
  }

Swift lintは "Cyclomatic Complexity Violation"警告を生成します。この警告が発生した理由と解決方法は?

enter image description here

12
Chelsea Shawra

警告は、関数が metric で定義されているように複雑すぎるために発生します。

この特定のケースでそれを回避する簡単な方法は、いくつかの単純な数学を使用することです。

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

メソッドは複雑すぎるです。ただし、コードを書き直す代わりに、switchescyclomatic_complexityの計算から除外することもできます(完全に読みやすいため)のようにこの:

cyclomatic_complexity:
  ignores_case_statements: true
24
Jakub Truhlář

繰り返されるif letステートメントを削除することで、複雑さを軽減できます。

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)
    }
  }
2
Paulw11

ロジックを変更したくない場合は、以下に従ってください。 「cyclomatic_complexity:」プロパティを追加し、.swiftlint.ymlファイルに警告値を設定します。

cyclomatic_complexity:警告:25

注:ここで警告値を設定するとは、線形に独立したパスの数を増やすことを意味します。独自の値を設定できます。

2
ajaybomma

次のようなコードでswiftlint警告を無効にできます。

// swiftlint:disable cyclomatic_complexity
func selectedMenuInLoggedOutState(sender: UIButton) {
    ...
}
// swiftlint:enable cyclomatic_complexity

または、次のswiftlint警告を明示的に無効にする場合:

// swiftlint:disable:next cyclomatic_complexity
func selectedMenuInLoggedOutState(sender: UIButton) {
2
deanWombourne