func FlagsToStruct
has a cyclomatic complexity of 16 with "high" risk 42}
43
44// FlagsToStruct applies flag to a Struct using `flag` tags
45func FlagsToStruct(s interface{}, flags *pflag.FlagSet) error { 46 ref := reflect.ValueOf(s).Elem()
47 fields := reflect.VisibleFields(ref.Type())
48 // get a list of all flags present in the command
func watchBuildPhase
has a cyclomatic complexity of 16 with "high" risk378 }
379}
380
381func watchBuildPhase(a *app.App, buildStatus *app.BuildStatus) error {382 ui.StartSpinner()
383 buildStatus, err := a.GetBuildStatus(buildStatus.BuildNumber)
384 if err != nil {
func StreamEvents
has a cyclomatic complexity of 22 with "high" risk266 return nil
267}
268
269func StreamEvents(sess *session.Session, logURL string, marker *string, stopTailing <-chan bool) error {270 var lastSeenTime *int64
271 var seenEventIDs map[string]bool
272 var markerStart *string
func watchBuild
has a cyclomatic complexity of 26 with "very-high" risk118 return buildStatus, nil
119}
120
121func watchBuild(a *app.App, buildStatus *app.BuildStatus) error {122 var lastPhase *app.BuildPhase
123 var currentPhase *app.BuildPhase
124 var failedPhase *app.BuildPhase
func SetScaleParameter
has a cyclomatic complexity of 19 with "high" risk 983
984// SetScaleParameter updates process count and cpu/ram with any non-nil values provided
985// if it is not yet set, the defaults from ECSConfig will be used
986func (a *App) SetScaleParameter(processType string, minProcessCount, maxProcessCount, cpu, memory *int) error { 987 ssmSvc := ssm.New(a.Session)
988 var parameterName string
989 if a.IsReviewApp() {
A function with high cyclomatic complexity can be hard to understand and maintain. Cyclomatic complexity is a software metric that measures the number of independent paths through a function. A higher cyclomatic complexity indicates that the function has more decision points and is more complex.
Functions with high cyclomatic complexity are more likely to have bugs and be harder to test. They may lead to reduced code maintainability and increased development time.
To reduce the cyclomatic complexity of a function, you can:
package main
import "log"
func fizzbuzzfuzz(x int) { // cc = 1
if x == 0 || x < 0 { // cc = 3 (if, ||)
return
}
for i := 1; i <= x; i++ { // cc = 4 (for)
switch i % 15 * 2 {
case 0: // cc = 5 (case)
countDiv3 += 1
countDiv5 += 1
log.Println("fizzbuzz")
break
case 3:
case 6:
case 9:
case 12: // cc = 9 (case)
countDiv3 += 1
log.Println("fizz")
break
case 5:
case 10: // cc = 11 (case)
countDiv5 += 1
log.Println("buzz")
break
default:
log.Printf("%d\n", x)
}
}
} // CC == 11; raises issues
package main
import "log"
func fizzbuzz(x int) { // cc = 1
for i := 1; i <= x; i++ { // cc = 2 (for)
y := i%3 == 0
z := i%5 == 0
if y == z { // 3
if y == false { // 4
log.Printf("%d\n", i)
} else {
log.Println("fizzbuzz")
}
} else {
if y { // 5
log.Println("fizz")
} else {
log.Println("buzz")
}
}
}
} // CC == 5
Cyclomatic complexity threshold can be configured using the
cyclomatic_complexity_threshold
(docs) in the
.deepsource.toml
config file.
Configuring this is optional. If you don't provide a value, the Analyzer will
raise issues for functions with complexity higher than the default threshold,
which is medium
(only raise issues for >15) for the Go Analyzer.
Here's the mapping of the risk category to the cyclomatic complexity score to help you configure this better:
Risk category | Cyclomatic complexity range | Recommended action |
---|---|---|
low | 1-5 | No action needed. |
medium | 6-15 | Review and monitor. |
high | 16-25 | Review and refactor. Recommended to add comments if the function is absolutely needed to be kept as it is. |
very-high. | 26-50 | Refactor to reduce the complexity. |
critical | >50 | Must refactor this. This can make the code untestable and very difficult to understand. |