Penso che rimuovere la break
possa essere una buona idea, ma non salvare righe di codice.
Il vantaggio di scriverlo senza break
è che la post-condizione del ciclo è ovvia ed esplicita. Al termine del ciclo ed eseguendo la riga successiva del programma, la condizione del ciclo i < array.length && !condition
deve essere stata falsa. Pertanto, i
era maggiore o uguale alla lunghezza dell'array, oppure condition
è true.
Nella versione con break
, c'è un trucco nascosto. La condizione del ciclo dice che il ciclo termina quando hai qualche altro codice per ogni indice di array valido, ma in effetti c'è un'istruzione break
che potrebbe terminare il prima di ciò, e non lo vedrai a meno che tu non riveda il codice di loop molto attentamente. Inoltre, gli analizzatori automatici statici, tra cui l'ottimizzazione dei compilatori, potrebbero avere problemi a dedurre quali sono anche le post-condizioni del ciclo.
Questa era la ragione originale per cui Edgar Dijkstra ha scritto "Goto Considerated Harmful." Non era una questione di stile: uscire da un loop rende difficile ragionare formalmente sullo stato del programma. Ho scritto molte dichiarazioni di break;
nella mia vita, e una volta da adulto, ho persino scritto un goto
(per uscire da più livelli di un loop interno critico per le prestazioni e poi continuare con un altro ramo dell'albero di ricerca ). Tuttavia, sono molto più propenso a scrivere un'istruzione return
condizionale da un ciclo (che non esegue mai il codice dopo il ciclo e quindi non è in grado di ridurre le sue condizioni) rispetto a break
.
Postscript
In effetti, il refactoring del codice per dare lo stesso comportamento potrebbe effettivamente richiedere più righe di codice. Il tuo refactoring potrebbe essere valido per qualche altro codice o se possiamo dimostrare che condition
inizierà false. Ma il tuo esempio è equivalente nel caso generale a:
if ( array.length > 0 ) {
// Some other code.
}
for ( int i = 1; i < array.length && !condition; i++ ) {
// Some other code.
}
Se un altro codice non è un one-liner, puoi quindi spostarlo su una funzione in modo da non ripetersi, e quindi hai quasi rifatto il tuo loop in una coda funzione -recursive.
Riconosco che questo non era il punto principale della tua domanda, però, e lo stavi mantenendo semplice.