Come qualcuno che di recente ha fatto proprio questo, ha rifattorizzato alcuni lunghi fogli di codice in un insieme di piccole funzioni, posso attestare che è efficace.
Immagino tu abbia sentito parlare del principio Unix: "fai una cosa e fallo bene". Aiuta immensamente.
Una funzione breve è facile da osservare, facile da ragionare e facile da testare. Ciò che è importante, di solito è facile da testare in assenza della maggior parte delle altre funzioni, e mentre si prende in giro solo pochi oggetti, se ce ne sono, dipende da.
Quando scrivi una funzione breve, sei costretta a pensare a cosa esattamente fa, a trovare un nome appropriato (doIt () non va bene), nomi di parametri validi, ecc. Rende il tuo codice più auto-descrittivo, e ti fa capire meglio il codice. Fornisce anche concetti di livello superiore per descrivere il tuo programma con.
La suddivisione di transizioni di stato complesse in brevi funzioni ti fa pensare al flusso di dati del programma e lo districa il più possibile. Ciò porta a un minor numero di dipendenze tra i dati, spesso a vite più brevi di alcuni dati (importante quando i dati sono enormi) e meno errori come razze di dati, aggiornamenti di stato che si scontrano l'un l'altro, ecc.
Anche la realizzazione di un frammento di codice più grande di una schermata in una funzione ti fa notare e calcola il codice incollato sulla copia, anche leggermente modificato. Trovare il modello comune aiuta a capire.
A volte ti ritrovi con funzioni che riconosci immediatamente, perché fanno (quasi) la stessa cosa che fanno già alcune funzioni di libreria. Riduci il conteggio delle righe e riutilizza il lavoro esistente di qualcun altro (e eventuali miglioramenti e correzioni di bug imminenti).
Al contrario, le funzioni estratte possono essere riutilizzate negli altri programmi. Non puoi riutilizzare un frammento di codice monolitico, tranne incollandolo per copia.
Molte persone hanno difficoltà a scrivere brevi funzioni, però. Tendono a scrivere una lunga sceneggiatura monolitica che fa il tutto, poiché scriverebbero un intero capitolo di prosa. Uno dei rimedi non è solo scrivere codice, ma eseguirlo immediatamente.
Se hai un linguaggio dinamico come Python o JS, o anche cose come Scala, hai sempre un REPL aperto. Quando trovi un frammento di codice, provalo nella REPL. Avrai bisogno di oggetti dipendenti per questo? Scrivi una funzione che fornisce ciascun oggetto dipendente. Una volta che hai trovato un frammento di codice che produce qualcosa di significativo, avvolgilo anche in una funzione. Ne avrai bisogno al prossimo passaggio. In questo modo si finisce con una serie di funzioni che compongono l'intero programma di cui si aveva bisogno, e ne avete già eseguito la maggior parte!
Con le lingue che non forniscono prontamente REPL, le cose sono più difficili. Qui la 'progettazione basata sui test' può aiutare: non puoi giocare liberamente con i tuoi frammenti di codice in un REPL, ma puoi eseguirlo a basso costo come test. Mentre vai, finisci con l'intero programma e con una serie di test che lo verificano e lo spiegano. Con un monolite, questo è impossibile.
Se il tuo programma è uno script usa e getta, non abbastanza importante da essere sottoposto a peer-review prima di essere in produzione, un muro di codice può andare bene.
Altrimenti, il factoring del tuo codice in parti più piccole paga ogni volta che devi estendere, modificare, rivedere le modifiche di qualcun altro o semplicemente consultarlo.