Lavoro con giovani programmatori a cui è stato insegnato a scuola che le funzioni dovrebbero essere brevi ma mancano di esperienza per ragionare correttamente il loro codice.
Spesso faccio esattamente l'opposto: incorporando nei siti di chiamata quelle funzioni o metodi per rendere leggibile il codice.
Sebbene sia vero che il codice ben strutturato dovrebbe solitamente essere conciso, probabilmente non è più grande di uno schermo per una data funzione o metodo che funzioni è importante.
Quello che faccio è seguire le regole degli odori del codice per organizzare il mio codice.
La funzione lunga è un odore di codice ben noto, ma non è l'unico, e certamente non il più importante.
Ad esempio, se prendi a caso blocchi di codice casuali e cambi i metodi come fanno molti programmatori inesperti, scambia solo funzioni lunghe con classe estesa . Ancora peggio, questo può portare a metodi che ricevono parti dei loro dati attraverso parametri di metodo e parti dall'istanza dell'oggetto. Evitare quell'odore ( Campi temporanei ... un modo orientato agli oggetti di programmare con i globali) è molto più importante per me dei metodi brevi.
Anche una funzione o un metodo dovrebbe svolgere alcune attività chiaramente identificabili e solo una di queste attività. Ho visto molto spesso una funzione eseguire una mezza attività e restituire alcuni parametri passati a un'altra funzione poche righe dopo l'altra metà dell'attività (questo potrebbe essere un caso di Clumps di dati odore). O funzione il cui unico compito è chiamarne un altro, senza fare praticamente nulla ( metodo Lazy ). Anche questo è orribile. Di solito, puoi facilmente rilevare che sta esaminando l'uso di variabili locali (se queste variabili locali non sono state inserite nell'istanza dell'oggetto come nel caso precedente, Campo temporaneo odore)
Un altro odore comune è il passaggio di un booleano a una funzione: in molti casi nasconde una funzione che esegue un'attività o un'altra a seconda del booleano fornito. Probabilmente sarebbe meglio dividerlo in due funzioni (io chiamo metodo schizofrenico )
.
Ciò che è interessante in quanto la scelta delle funzioni non è sempre così male all'inizio, ma l'evoluzione del codice nel tempo spesso porta a problemi di cui sopra.
La mia spiegazione del perché accade risiede nella psicologia dei programmatori ed è probabilmente il principale svantaggio di dividere il codice tra molti metodi o funzioni.
Puoi facilmente accecarti con funzioni / metodi e in pratica dimenticare che c'è del codice all'interno di questi metodi. Alcuni programmatori (inesperti) dopo aver creato un metodo lo danno per scontato come se fosse una nuova chiamata di libreria. Non permetteranno a themselve di cambiarlo più di quanto farebbero per alcune chiamate in librerie di terze parti.
(lo stesso problema si verifica anche con classi definite dall'utente).
Incredibilmente abbastanza funziona anche il contrario: alcuni programmatori inesperti non creeranno un metodo o una classe logicamente necessari se il codice iniziale è breve (tipico nel caso di curryfying una funzione impostando alcuni parametri sui valori iniziali) !!!
Questo può diventare davvero brutto se non ne sei consapevole e prudente.
Ricapitolando, quello che sto dicendo è che la suddivisione del codice tra molti metodi / funzioni / classi può essere davvero una buona cosa se sai cosa stai facendo, o un vero problema se non lo fai.
Per questo motivo ho messo questo odore piuttosto basso nella mia lista personale.
Peccato che sia spesso vicino alla testa della lista nelle liste degli odori del codice in rete. Immagino sia perché è uno degli odori più facili da rilevare, sia da parte dell'uomo che degli strumenti automatici.