== Why is this an issue?

Nested control flow statements ``++if++``, ``++for++``, ``++do++``, ``++while++``, ``++switch++`` and ``++try++`` are often key ingredients in creating
what's known as "Spaghetti code". This code smell can make your program difficult to understand and maintain.

When numerous control structures are placed inside one another, the code becomes a tangled, complex web.
This significantly reduces the code's readability and maintainability, and it also complicates the testing process.

=== Exceptions

Each use of a macro containing control flow statements is counted as one nesting level, even if the macro contains more than one control flow statement.

[source,cpp]
----
  #define FOREACH(V,ARR) if(ARR!=nullptr) for(int V=0; V<(sizeof(ARR)/sizeof(ARR[0])); V++)

  if (condition1) {       // Compliant; depth = 1
    if (condition2) {     // Compliant; depth = 2
      FOREACH(i, arr) {     // Compliant; depth = 3 (not 4)
        if (condition3) {   // Noncompliant; depth = 4
          /* ... */
        }
      }
    }
  }
----

== How to fix it

=== Code examples

The following example demonstrates the behavior of the rule with the default threshold of 3 levels of nesting
and one of the potential ways to fix the code smell by introducing guard clauses:

==== Noncompliant code example

[source,cpp,diff-id=1,diff-type=noncompliant]
----
if (condition1) {                  // Compliant - depth = 1
  /* ... */
  if (condition2) {                // Compliant - depth = 2
    /* ... */
    for (int i = 0; i < 10; i++) {  // Compliant - depth = 3
      /* ... */
      if (condition4) {            // Noncompliant - depth = 4, which exceeds the limit
        if (condition5) {          // Depth = 5, exceeding the limit, but issues are only reported on depth = 4
          /* ... */
        }
        return;
      }
    }
  }
}
----

==== Compliant solution

[source,cpp,diff-id=1,diff-type=compliant]
----
if (!condition1) {
  return;
}
/* ... */
if (!condition2) {
  return;
}
for (int i = 0; i < 10; i++) {
  /* ... */
  if (condition4) {
    if (condition5) {
      /* ... */
    }
    return;
  }
}
----

include::../resources.adoc[]

ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

include::../message.adoc[]

include::../parameters.adoc[]

include::../highlighting.adoc[]

'''
== Comments And Links
(visible only on this page)

=== on 6 May 2016, 09:23:25 Alban Auzeill wrote:
I added an "Exception" paragraph to describe how we count depth with macro.

=== on 6 May 2016, 13:37:58 Ann Campbell wrote:
\[~alban.auzeill] the exception isn't clear to me as currently written. Typically in an exception code block you'd show a "noncompliant" piece of code that's actually ignored because of the exception. So, could you expand the example?

include::../comments-and-links.adoc[]

endif::env-github,rspecator-view[]
