2013-08-21 12 views
7

La mia comprensione di "Codice spaghetti" è una base di codice che salta da un blocco di codice a un altro senza uno scopo logico e leggibile. Il trasgressore più comune sembra essere la dichiarazione GOTO.Come evitare il codice spaghetti durante la scrittura di piccole funzioni

Attualmente sto leggendo/riferendo il capitolo della funzione di Clean Code: un manuale di abilità software agile. L'autore, pur autoreticamente, è estremamente severo sulla dimensione delle funzioni. Capisco l'idea di mantenere le funzioni piccole, tuttavia, suggerisce che dovrebbero essere circa 5 righe. Mentre le Classi diventano certamente più leggibili, ho paura di creare codice spaghetti scrivendo funzioni più piccole. Anche le funzioni più piccole sembrano inavvertitamente creare astrazioni molto più alte.

A che punto il codice diventa codice spaghetti? Quanto è astratto anche lo ? Qualsiasi risposta sarebbe di grande aiuto.

Per inciso, sono un seguace di lunga data di Stack Overflow anche se è la prima volta che faccio una domanda, quindi qualsiasi suggerimento riguardante il mio post è ben accetto.

Grazie mille!

+0

Probabilmente sarebbe meglio su Programmers Exchange anziché stack. Ti darò il tuo voto, ma stai per essere svalutato all'inferno. –

+2

L'autore ti ha dato una regola generale. Tuttavia, non esiste una regola difficile. Potresti avere a che fare con un algoritmo che richiede più di 5 righe. Tuttavia, quando vedi te stesso ripetere il codice o non riusare a riutilizzare la funzionalità esistente, è tempo di refactoring e probabilmente dividere alcune funzioni a parte. – Tarik

+1

@AMR ringrazia per il voto positivo. Dopo aver esaminato la Borsa dei programmatori, devo essere d'accordo con te. Questa è decisamente più una domanda concettuale. Mi scuso per non aver fatto la differenza in anticipo. – Chris

risposta

4

Come già detto nei commenti, non esiste una regola assoluta. Alla fine, dovresti mirare a una buona leggibilità del tuo codice. Ma non è tutto sulla lunghezza dei tuoi metodi. Robert Martin suggerisce di ordinare i metodi in base al grado di astrazione. I metodi Abststract dovrebbero essere al top della classe e più un metodo è, più profondo dovrebbe essere individuato.

Un altro aspetto importand è il nome del metodo. Dovrebbe essere scelto bene per chiarire cosa fa il metodo! Se scegli saggiamente i nomi dei tuoi metodi, i commenti dovrebbero essere difficilmente necessari. Per esempio, si consideri un istruzione if-:

if(isValidAge(value)) { 
    ... 
} 

è molto più leggibile di

if(value > 10 && value < 99) { 
    ... 
} 

perché l'intenzione della dichiarazione diventa molto più chiaro. Per causa potresti aggiungere un commento nel secondo esempio. Ma i commenti diventano spesso superati (c'è un capitolo in più nel libro di Robert Martin su questo). Penso che questo stile di programmazione porti a molti metodi brevi.

È difficile scegliere il giusto livello di astrazione. Secondo la mia esperienza, è più facile iniziare con un basso livello di astrazione. Quindi posso prima concentrarmi sulla soluzione del problema. Quando ho bisogno di più astrazione in un secondo momento, posso ancora refactoring il codice. TDD aiuta molto!

Spero che questo aiuti ...

+1

Fortemente d'accordo con l'ultimo paragrafo! – Tarik

+0

Hauptmann, grazie per la risposta. Sono d'accordo con @Tarik che il tuo ultimo paragrafo illustra davvero come lavorare con diversi livelli di astrazione. La maggior parte dei miei progetti attuali ha solo astrazioni di basso livello e tu mi hai aiutato a sollevare le mie astrazioni. Soprattutto con il tuo riferimento a TDD. Completamente d'accordo con te. Come pensi di poter evitare il maledetto codice spaghetti durante l'astrazione? – Chris

+0

Prima di tutto, ogni classe dovrebbe avere una sola responsabilità. Le lezioni con molte responsabilità costringono il lettore a cambiare i contesti spesso (dai un'occhiata alla risposta di @ utnapistim). In secondo luogo, cerca di mantenere l'interfaccia pubblica e il numero di dipendenze piccoli. Ciò significa che devi usare metodi privati. Quindi la tua classe è facile da capire dal punto di vista esterno. Penso a questo come a un firewall: la classe adempie al suo contratto, e io posso metterlo alla prova - non importa cosa ci sia dentro. Avendo una buona serie di test, è possibile migliorare la struttura interna fino a raggiungere il tuo senso estetico. –

2

Sono d'accordo con commenti e risposte qui. Dal punto di vista pratico, i pensieri che Robert Martin scrive nei suoi libri sono sempre ottimi orientamenti e cerco di avvicinarmi il più possibile a queste "regole" e in effetti i metodi a 5 righe non sono per lo più negativi.

Ai miei occhi il modo migliore per evitare il codice spaghetti è scrivere classi (piccole) con un valore alto Cohesion. Lo svantaggio è che diventi un intero gruppo di classi, il che rende talvolta un po 'più difficile per i nuovi dipendenti entrare nel progetto.

+1

Grazie per il collegamento a Coesione. Questa è una mia preoccupazione: creare classi piccole che rendano una classe più leggibile ma più difficile da mantenere da parte dei collaboratori. Anche se i commenti farebbero molto per spiegare lo scopo delle classi e delle funzioni. I tasti di scelta rapida degli IDE aiutano anche gli sviluppatori a saltare un progetto abbastanza velocemente, come Command + Left Mouse Fare clic su una classe o un metodo per accedere al suo contesto originale in Xcode ed Eclipse. Grazie per la vostra risposta. – Chris

1

Capisco l'idea di mantenere le funzioni piccole, tuttavia, suggerisce che dovrebbero essere circa 5 righe.

Che suona ideale :)

mentre le classi certamente diventano più leggibili, ho paura di creare spaghetti code scrivendo piccole funzioni.

Il codice degli spaghetti è causato dal salto di codice da un posto all'altro con (con diversi livelli di astrazione nella stessa funzione - codice IO di basso livello e logica dell'applicazione di alto livello). Se estrai piccole funzioni, il tuo risultato si sta allontanando dal codice spaghetti, non più vicino).

A che punto il codice diventa codice spaghetti?

Quando il codice obbliga (il programmatore) a fare salti mentali (cambiare contesto) da linea a linea, il codice è codice spaghetti. Questo è vero sia che tu usi GOTO o meno (ma GOTO può peggiorare il problema).

Problemi correlati