Replace Control Flag with Break

Removes smells
Symptom

A loop maintaining a boolean flag to decide when to stop — `let found = false; for (...) { if (!found && ...) { ...; found = true; } }`.

Goal

Loops that maintain a boolean to decide when to stop replace it with a direct `break`, `return`, or `continue`.

Before the refactoring

let found = false;
for (const p of people) {
if (!found && p.name === target) {
matched = p;
found = true;
}
}

After the refactoring

for (const p of people) {
if (p.name === target) {
matched = p;
break;
}
}
Example source: Illustrative example written for this site, not a quotation from any source.
Pressure

The exit condition is delayed and obscured; reasoning about when the loop terminates requires tracking the flag's state through every iteration; bugs hide where the flag isn't set when expected.

Tradeoff

If the loop body is large, the break can hide the early-exit semantics — extract a function around the loop's body to keep the exit obvious.

Relief

The exit condition appears at the moment it's decided, not as a delayed effect of a flag check; the loop's intent becomes literal.

Trap

Replacing a flag with a break in a large loop body — the exit point becomes hidden inside the body, and the loop's termination semantics become harder to read than the original flag.