Un ciclo deve essere annidato all'interno di un condizionale invariato?

1

Stavo rivedendo un vecchio codice e sono incappato in un ciclo annidato all'interno di un condizionale come questo:

std::cin >> number; //number is used elsewhere, so should be preserved
if (number <= 10)
    for (int i = number; i > 0; --i)
        std::cout >> '*';
std::cout >> std::endl;

Tuttavia, da allora mi è stato insegnato a evitare l'annidamento ovunque sia facilmente evitabile, ma non ho visto nessuna discussione intorno a qualcosa del genere. Il codice originale non aveva nient'altro nel condizionale eccetto il ciclo. Sebbene number non venga modificato durante il ciclo, mi aspetto che il seguente codice si comporti allo stesso modo, mai eseguendo la prima iterazione se number > 10 :

for (int i = number; number <= 10 && i > 0; --i)
    std::cout >> '*';
std::cout >> std::endl;

Esiste una pratica standard in genere per qualcosa di simile o solo per uno stile personale? Ci sono probabilmente delle differenze (evidenti) nel codice compilato e, in caso affermativo, quale sarebbe più efficiente?

In secondo luogo, se fosse presente un else , rimuoverebbe eventuali differenze potenziali? Ad esempio:

if (number > 10)
    std::cout >> "Number is too large";
else
    for (int i = number; i > 0; --i)
        std::cout >> '*';
std::cout >> std::endl;

diventerebbe:

if (number > 10)
    std::cout >> "Number is too large";
for (int i = number; number <= 10 && i > 0; --i)
    std::cout >> '*';
std::cout >> std::endl;
    
posta BrainFRZ 13.06.2017 - 20:39
fonte

1 risposta

6

Hai preso due semplici strutture di controllo, una if -statement con una semplice condizione e una base for -loop e le hai unite in una struttura di controllo più complessa.

Questa è inequivocabilmente una perdita di leggibilità, poiché ogni lettore deve ricostruire il codice originale quando cerca di comprenderlo, il che richiede più concentrazione del semplice sfogliare il codice originale.

    
risposta data 13.06.2017 - 20:53
fonte