Contesto
In Clean Code , pagina 35, si dice
Ciò implica che i blocchi all'interno delle istruzioni if, else, while, e così via dovrebbero essere lunghi una riga. Probabilmente quella linea dovrebbe essere una chiamata di funzione. Questo non solo mantiene piccola la funzione che racchiude, ma aggiunge anche valore documentale perché la funzione chiamata all'interno del blocco può avere un nome ben descrittivo.
Sono completamente d'accordo, questo ha molto senso.
Più avanti, a pagina 40, parla degli argomenti delle funzioni
Il numero ideale di argomenti per una funzione è zero (niladic). Ne segue uno (monadico), seguito da vicino da due (diadico). Tre argomenti (triadici) dovrebbero essere evitati ove possibile. Più di tre (poliadici) richiedono una giustificazione molto speciale, e quindi non dovrebbero essere usati comunque. Gli argomenti sono difficili. Prendono molto potere concettuale.
Sono completamente d'accordo, questo ha molto senso.
Problema
Tuttavia, piuttosto spesso mi ritrovo a creare un elenco da un altro elenco e dovrò vivere con uno dei due mali.
O uso due righe nel blocco , una per creare la cosa, una per aggiungerla al risultato:
public List<Flurp> CreateFlurps(List<BadaBoom> badaBooms)
{
List<Flurp> flurps = new List<Flurp>();
foreach (BadaBoom badaBoom in badaBooms)
{
Flurp flurp = CreateFlurp(badaBoom);
flurps.Add(flurp);
}
return flurps;
}
Oppure aggiungo un argomento alla funzione per l'elenco in cui la cosa verrà aggiunta, rendendola "un argomento peggiore".
public List<Flurp> CreateFlurps(List<BadaBoom> badaBooms)
{
List<Flurp> flurps = new List<Flurp>();
foreach (BadaBoom badaBoom in badaBooms)
{
CreateFlurpInList(badaBoom, flurps);
}
return flurps;
}
Domanda
Ci sono (dis) vantaggi che non vedo, che rendono uno di questi preferibile in generale? O ci sono tali vantaggi in determinate situazioni; in tal caso, cosa devo cercare quando prendo una decisione?
f(g(x))
è contro la tua guida di stile, beh, non posso aggiustare la tua guida di stile. Voglio dire, non ti dividi nemmeno sqrt(x*x + y*y)
in quattro righe, vero? E questo è tre (!) Sottoespressioni nidificate su due (!) Livelli di annidamento interno (sussulto!). Il tuo obiettivo dovrebbe essere la leggibilità , non le dichiarazioni di un singolo operatore. Se vuoi il dopo, beh, ho il linguaggio perfetto per te: Assembler.
mov
istruzioni x86 e una singola jmp toStart
alla fine. Qualcuno ha effettivamente creato un compilatore che fa esattamente questo: D
rlwimi
istruzioni sul PPC. (Questo indica l'inserimento della maschera immediata Ruota a sinistra.) Questo comando non ha preso meno di cinque operandi (due registri e tre valori immediati) ed ha eseguito le seguenti operazioni: Il contenuto di un registro è stato ruotato da uno spostamento immediato, una maschera è stata creato con una singola corsa di 1 bit che era controllata dagli altri due operandi immediati, e i bit che corrispondevano a 1 bit in quella maschera nell'altro operando di registro venivano sostituiti con i corrispondenti bit del registro ruotato. Istruzioni molto interessanti :-)
flurps.Add(CreateFlurp(badaBoom));
?