Che cosa rende esattamente il codice "pulito"? [duplicare]

20

Sono uno stagista in una piccola azienda di software, che fa un tipico lavoro da grugnito. Molti compiti che gli sviluppatori stanno facendo sono sopra la mia testa, ma alla fine ho potuto vedere alcune "azioni" reali e scrivere un codice da solo. Ammetto che il compito è stato forse un po 'troppo difficile per me, ma alla fine sono riuscito e il mio codice funzionava. Quando il mio mentore stava facendo una revisione del codice, mi aveva detto "Uomo, questa parte è brutta". Quando ho detto, "Perché? C'è qualcosa di sbagliato in questo?" lui rispose: "No, il codice funziona, ma non è solo codice pulito". Il concetto di codice pulito è quello che ho incontrato alcune volte in passato, soprattutto ora che riesco ad aggirare gli sviluppatori professionisti. Ma cos'è esattamente che rende il codice "pulito"? In altre parole, qual è il criterio?

Ho sentito parlare in matematica formale, una prova "bella", è idealmente il più chiaro e il più breve possibile e utilizza tecniche creative. Molte persone sanno che in letteratura, la letteratura "buona" è quella che può esprimere i sentimenti senza sforzo ed elegante nella misura in cui si può "sentirla". Ma non si può "sentire" il codice (almeno io non posso) e penso che la maggior parte sarebbe d'accordo sul fatto che il codice breve non sia necessariamente il migliore (dato che potrebbe essere molto inefficiente) o anche che il modo più efficiente sia sempre preferito ( come potrebbe essere molto lungo e complesso). Quindi, cos'è! Per favore, prova a spiegarmi cosa rende esattamente il codice "pulito".

    
posta Eric 30.05.2013 - 05:12
fonte

9 risposte

34

Secondo me, il codice pulito ha le seguenti caratteristiche:

  1. È chiaro e facile da capire,
  2. È accoppiato liberamente,
  3. Ha una complessità ciclomatica relativamente bassa,
  4. Ha un'architettura ragionevole e flessibile,
  5. È facilmente individuabile,
  6. È ben progettato e
  7. È testabile

Si noti che questi sono tutti soggettivi, sebbene principi come SOLID e pratiche come TDD possano fare molto per raggiungere questi obiettivi. Si noti inoltre che, come per la maggior parte delle dinamiche software, non sono necessariamente compatibili tra loro; ci sono sempre dei compromessi.

Nota anche che non ho menzionato affatto le prestazioni, perché il codice che è altamente performante è spesso l'opposto di pulito.

    
risposta data 30.05.2013 - 05:23
fonte
13

Penso che Robert Harvey abbia un'ottima risposta, ma mi piacerebbe espandere quella che credo sia la parte più importante:

  1. It is clear and easy to understand

Molto sta scrivendo un buon codice. Ma più avanti scopriremo che spendiamo più o più volte il codice che legge , quindi lo scriviamo. Scrivere un codice chiaro e facile da capire è di fondamentale importanza per il concetto di codice pulito, perché in definitiva rende tutto il tempo che passiamo a leggere più facilmente e richiede meno tempo.

  1. Dovrebbe essere ben formattato. Scegli gli standard ed essere coerenti. Guardati attorno ad altre guide di stile nella lingua che preferisci. Scegli ciò che funziona meglio per te o il tuo team, documentalo e sii coerente .

  2. I nomi delle classi, i nomi dei membri, i nomi delle variabili dovrebbero essere espressivi e descrittivi di ciò che stanno facendo. Evita nomi privi di significato. Il naming è davvero una delle cose più difficili da ottenere nella programmazione e spesso sarà specifico per il dominio in cui stai lavorando.

  3. Resta breve. Il ragazzo / ragazza che legge il tuo codice non vuole leggere un romanzo. Vogliono capire come funziona la funzionalità o come hai risolto un problema. Rendi ciò chiaro a tutti. Estratti di funzionalità ridotte in metodi espressivi e crea una breve "storia" descrittiva per loro su come funziona il pezzo più grande.

Un sacco di cose vanno a scrivere codice pulito. Ma, a mio parere, rendere chiara e facile da capire è la singola cosa più importante che puoi fare.

Leggi anche il libro di Robert Martin.

    
risposta data 30.05.2013 - 06:41
fonte
2

Oltre alle altre risposte, ci possono essere modi reali di sentire sul codice. Per sentirsi, intendo istintivamente interagire con il codice.

In primo luogo, la formattazione del codice stesso può essere più facile da leggere e comprendere utilizzando alcuni principi di base che ci aiutano a leggere il codice. I Principi della Gestalt possono aiutare qualsiasi cosa a essere più rapidamente e facilmente compresa dagli umani (applicata pesantemente visualizzazione dati). L'utilizzo di questi principi per cose semplici come l'allineamento di commenti, l'inserimento di spazi e righe vuote nel posto giusto aiuta tutti a leggere il codice più facilmente a livello istintivo.

Molte delle convenzioni di codifica e formattazione si basano sul rendere più facile la lettura prima a livello di subconscio.

Che sembra più leggibile?

int x; //This is an x
string foo; //Foo here
MyObject baz; //Instance of MyObject

int x;        //This is an x
string foo;   //Foo here
MyObject baz; //Instance of MyObject

Modifica

Al commento di Michael sull'avere una lunga dichiarazione. Le nostre menti perdonano, quindi le leggi non devono essere seguite esattamente.

int x;        //This is an x
string foo;   //Foo here
MyObject baz; //Instance of MyObject
MyTypeWithSomeAwfullyLongName bar;
long UUID;    //The Law can be broken and still help

La Legge di Prossimità dovrebbe significare che la maggior parte delle persone preferisce la seconda versione. È lo stesso motivo per cui abbiamo colonne e tabelle per organizzare i dati.

Un altro esempio, basato sulla Legge della simmetria

function fooBarLongMethodName() {
    return null;
}

function fooBarLongMethodName()
{
    return null;
}

The law of symmetry states that the mind perceives objects as being symmetrical and forming around a center point. It is perceptually pleasing to divide objects into an even number of symmetrical parts.

Quindi è più piacevole per la mente vedere la simmetria nel secondo esempio, essere in grado di vedere sia le parentesi aperte che quelle vicine in linea.

Questi esempi dovrebbero rendere istintivamente più semplice la lettura del codice. Ma ci sono anche modelli appresi che richiede tempo per trarne vantaggio, basati sulla Legge dell'esperienza passata .

Quindi, in secondo luogo, comprendere l'intento di un determinato codice e sapere quando viene usato in modo errato (specialmente senza dover indagare o sapere molto sul codice precedente). questo articolo parla delle variabili di denominazione in modo che tu possa vedere dai nomi quando sono " re vengono utilizzati in modo errato. Una volta che questo schema di denominazione e uso è diventato abituale, è possibile riconoscere un problema con il codice in base al sito e senza dover esaminare gran parte dell'altro codice.

Infine, portano a un'idea più ampia degli odori di codice. L'idea che determinati schemi che emergono nel codice possono comunemente segnalare un problema da qualche parte nel codice. Questo a volte si presenta come un sentimento "Questo codice di test unitario è brutto, perché è addirittura necessario?" e la risposta a questa domanda è forse "Oh, stai usando Singletons per tutto.". Questo è il più difficile da insegnare o imparare e probabilmente viene fornito solo con esperienza.

Quindi spero che questo aiuti ad ampliare le altre risposte sul perché o su come le persone possono considerare il codice "bello", "buono" o "brutto"

    
risposta data 30.05.2013 - 14:44
fonte
2

La mia risposta non è così costruttiva come la risposta di Robert Harvey. Ma posso aggiungere alcune opzioni che sto usando durante lo sviluppo. Considerando i problemi di prestazioni che alcuni di loro dovrebbero evitare o rimuovere quando pubblicano nel mondo reale.

  1. Utilizza i commenti nel tuo codice. Forse diversi supervisori potrebbero dover considerare il tuo lavoro dopo la codifica.
  2. Utilizza parole significative per variabili, funzioni e metodi. Non solo a, b, c, ecc.
  3. Evita di utilizzare più spazi bianchi tra il codice. È noioso.
  4. Le linee di codice dovrebbero essere in una sequenza. Rende il codice più leggibile.
risposta data 30.05.2013 - 05:24
fonte
1

Ho notato che diverse risposte qui toccano stile / layout, ad esempio i cosmetici del codice. Penso che ci sia una distinzione tra il codice che è clean e il codice che è tidy . Idealmente hai entrambi, ma il primo è più importante.

Come analogia potrei decidere di mettere in ordine la mia cucina (impilare i piatti, riorganizzare, ordinare i vasetti negli armadi, ecc.). Lo stesso con il codice: puoi allineare testo, formato, spazio bianco, convenzioni di denominazione, suddivisione in file più piccoli, ecc.

Nessuno di questi significherà che il tuo codice sarà pulito - e quando cucinerò più tardi / compilerò il mio codice, potrei comunque avere un bug (bug di stomaco / errore di segmentazione, la mia analogia sta andando bene ...)

Ovviamente puoi uccidere i bug (acqua bollente, sapone / cerotto, un hack), ma è molto meglio evitarli del tutto - cioè avere un codice pulito. Quindi progetti la tua cucina secondo i tuoi bisogni, un sacco di spazio, piani di lavoro chiari / un tagliere separato per carne e verdura, ecc. / Design a fattura singola, principio di responsabilità singola , KISS , YAGNI , ecc. L'analogia si rompe, perché ho bisogno che la mia cucina sia in ordine prima di poter cucinare. Mentre non hai bisogno del codice ordinato per farlo compilare e lavorare, purché il design sia pulito.

Significa solo che ci vuole un po 'di più per lo sviluppatore medio per navigare nella cucina / codice e capire dove è tutto, ma almeno ciò è possibile, ma non è possibile per loro vedere una striscia di salmonella ed E -coli su una superficie da cucina. Possono solo fidarsi del fatto che non ci sono molte bottiglie evidenti di spray antibatterico nell'armadio sotto il lavandino dove normalmente si aspetterebbero di trovarlo / hai progettato il tuo codice in modo canonico per il problema che risolve.

Ora (un'opinione non adulterata): gli sviluppatori inesperti (non importa quale sia la loro anzianità) si distraggono in ordine quando dovrebbero essere più preoccupati per la sporcizia.

    
risposta data 30.05.2013 - 16:07
fonte
1

Aggiungerò una breve risposta sull'importanza del codice pulito, perché è stato evocato solo in modo tangenziale in altre risposte.

"Codice pulito" è importante, perché durante la vita totale del prodotto, o della linea di prodotti, hai forse trascorso alcune settimane a scrivere quel modulo, ma esso "vivrà" per anni o decenni nella tua base di codice.

Quindi forse in genere:

  • Tempo impiegato a scrivere codice: 10%
  • Tempo trascorso a mantenere il codice: 90%

Scrivendo codice pulito, stai alleggerendo il lavoro delle persone che dovranno rivederlo e aggiornarlo in cinque anni. E in alcuni casi, quella persona sarai tu!

(Mi sono già trovato a chiedermi "Scriveresti quel codice?" e verificando il sistema di controllo versione, in realtà ero io alcuni anni prima ...)

    
risposta data 30.05.2013 - 09:53
fonte
0

Se ti stai chiedendo cosa significhi tutto questo in pratica, beh per un cambiamento dalla programmazione accademica, avresti bisogno di avere in primo luogo variabili significative e nomi di funzioni.

In secondo luogo, i tuoi codici devono essere organizzati in modo tale che sia facile da seguire. Devi capire la separazione del codice (capisci perché le persone amano gli MVC), devi mettere le cose funzionali nei modelli e in vista avere solo cose che saranno usate per il frontend e Controller per collegarle tutte. Quindi, se una persona viene a leggere il tuo codice questa separazione in realtà li aiuterà a concentrarsi sul bit che vogliono per un aggiornamento rapido ecc.

In terzo luogo, devi anche essere organizzato a livello modulare, non dovresti avere funzioni per esempio algoritmo di ticketing in qualche altro modulo come libro paga o account ecc. Dovresti anche progettare moduli in modo tale che se puoi facilmente rimuovere modulo e il sistema dovrebbero funzionare anche senza le sue funzionalità (anche questo significa che puoi facilmente collegare anche i moduli).

Infine, anche una buona pratica penso che mantenga le funzioni di aiuto separate da tutti i moduli in modo che possano essere richiamati da qualsiasi luogo.

Dovrei anche dare un'occhiata a diversi modelli di design e imparare come usarli, in quanto aiutano i tuoi codici ad essere più organizzati e gestibili.

    
risposta data 30.05.2013 - 14:23
fonte
0

Si può già leggere (o meno) su S.O.L.I.D. modelli. Ma mi aspetto che una simile domanda richieda una risposta più specifica. Si prega di dare un'occhiata a recensione del codice sorgente Doom 3 . Anche se non hai familiarità con lo sviluppo del gioco, puoi ancora capire il codice. A mio parere, è un esempio del codice Clean.

    
risposta data 30.05.2013 - 15:52
fonte
0

Secondo me (e per molti altri) dipende completamente da la leggibilità del codice .

Se riesco a leggere il codice e a comprenderlo, è pulito oppure non è pulito. Una buona denominazione e altre cose sono ovviamente importanti. Ma sfortunatamente la leggibilità dipende principalmente dalla comprensione tecnica di una persona nella struttura dei dati o nel linguaggio di programmazione.

Un semplice esempio: immagina di aver scritto un programma in C ++. Sono rimasto affascinato dalle nuove funzionalità aggiunte nello standard C ++ 11 e ho scritto il mio programma usando programmazione funzionale . Quindi tutti i cicli e le iterazioni sui contenitori, ho sostituito da accumulare (ridurre, piegare), trasformare (mappa), qualsiasi (filtro), curry, ecc.

Ora questo programma è pulito e conciso per chiunque conosca i concetti e le funzionalità linguistiche . Sfortunatamente coloro che sono nuovi o non hanno nemmeno sentito parlare di programmazione funzionale, stanno andando a lottare. Diranno che il codice usa inutilmente le API confuse e complesso da comprendere . Queste cose possono essere fatte usando i loop, che sono più chiari e puliti. Hanno ancora ragione come stanno, ma il codice è in realtà migliore. Quindi la leggibilità e la pulizia dipendono dall'individuo.

    
risposta data 30.05.2013 - 10:41
fonte

Leggi altre domande sui tag