Invertito se
La maggior parte degli sviluppatori pensa in termini di logica nidificata. È difficile per loro invertire la loro logica per ridurre il nidificazione. Il codice profondamente annidato è più difficile da leggere e per ridurre il nesting è necessario invertire la logica.
Quando un programmatore scrive il codice, scrive in una struttura ad albero logica come questa.
bool function publish(Document doc)
{
if(doc != null)
{
if(doc.status == "finished")
{
doc.print();
if(doc.locked)
{
doc.unlock();
}
return true;
}
return false;
}
return false;
}
Quanto sopra è logicamente corretto, ma introduce i rientri che lo rendono difficile da mantenere in futuro. È difficile, perché la logica aggiuntiva richiederà blocchi più profondi. Più è approfondito, più è probabile che venga introdotto un errore.
Invertendo le tue istruzioni if e combinandole puoi ridurre il nidificazione.
bool function publish(Document doc)
{
if(doc == null || doc.status != "finished")
{
return false
}
doc.print();
if(!doc.locked)
{
return true;
}
doc.unlock();
return true;
}
Questo tipo di logica invertita mantiene tutte le operazioni della funzione all'interno del primo blocco rientrato e le istruzioni if vengono utilizzate solo per terminare la funzione.
Dividi loop e lavoro
Non eseguire le tue operazioni di lavoro all'interno di un blocco di loop. Separare l'iterazione dall'attività stessa. Questo crea funzioni a singolo scopo.
Prendi questo esempio
function void PrintDocuments(List<Document> pDocuments)
{
for(int doc=0; doc < pDocuments.Count; doc++)
{
for(int page=0; page < pDocuments[doc].Pages.Count; page++)
{
pDocuments[doc].Pages[page].Print();
}
}
}
Anche se non è molto complesso, crea 3 livelli di nidificazione e la funzione sta eseguendo tre diversi compiti.
Dividi il lavoro e i cicli lo rendono più facile da mantenere.
function void PrintDocuments(List<Document> pDocuments)
{
for(int doc=0; doc < pDocuments.Count; doc++)
{
PrintPages(pDocuments[doc].Pages);
}
}
private function void PrintPages(Document pDocument)
{
for(int page=0; page < pDocument.Pages.Count; page++)
{
PrintPage(Pages[page]);
}
}
private function void PrintPage(Page pPage)
{
pPage.Print();
}
Si potrebbe obiettare che quanto sopra è un lavoro extra, ma il tempo speso per dividere le attività e creare funzioni a singolo scopo ridurrà gli sforzi in seguito quando si manterrà il codice. L'indentazione ridotta facilita la lettura. Il lavoro che deve essere completato da un ciclo non viene mai eseguito all'interno di un ciclo, ma viene gestito da una funzione dedicata per quel lavoro PrintPage
.
Conclusione
Scopo singolo e logica invertita sono le chiavi per ridurre i rientri.