Dire che ho una grande funzione come la seguente:
function do_lots_of_stuff(){
{ //subpart 1
...
}
...
{ //subpart N
...
}
}
un modello comune è quello di scomporlo in sottofunzioni
function do_lots_of_stuff(){
subpart_1(...)
subpart_2(...)
...
subpart_N(...)
}
Di solito trovo che la decomposizione abbia due vantaggi principali:
- La funzione scomposta diventa molto più piccola. Questo può aiutare le persone a leggerlo senza perdersi nei dettagli.
- I parametri devono essere passati esplicitamente alle sottofunzioni sottostanti, invece di essere implicitamente disponibili solo per essere inclusi nell'ambito. Questo può aiutare a migliorare la leggibilità e la modularità in alcune situazioni.
Tuttavia, trovo anche che la decomposizione abbia alcuni svantaggi:
- Non ci sono garanzie che le sottofunzioni "appartengano" a do_lots_of_stuff quindi non c'è nulla che impedisca a qualcuno di chiamarle accidentalmente da un posto sbagliato.
- La complessità di un modulo cresce in modo quadratico con il numero di funzioni che aggiungiamo ad esso. (Ci sono più modi possibili in cui le cose si possono chiamare)
Quindi:
Ci sono utili convenzioni o stili di codifica che mi aiutino a bilanciare i pro ei contro della scomposizione delle funzioni o dovrei semplicemente usare un editor con il codice che si piega e chiamarlo un giorno?
EDIT: Questo problema si applica anche al codice funzionale (anche se in modo meno urgente). Ad esempio, in un'impostazione funzionale avremmo le sottoparti che restituiscono i valori che sono combinati alla fine e il problema di decomposizione di avere molte sottofunzioni che possono utilizzare l'un l'altro è ancora presente.
Non possiamo sempre presumere che il dominio del problema possa essere modellato su alcuni piccoli tipi semplici con solo poche funzioni altamente ortogonali. Ci saranno sempre algoritmi complicati o lunghi elenchi di regole aziendali che vogliamo ancora essere in grado di gestire correttamente.
function do_lots_of_stuff(){
p1 = subpart_1()
p2 = subpart_2()
pN = subpart_N()
return assembleStuff(p1, p2, ..., pN)
}