Come faresti a sapere se hai scritto codice leggibile e facilmente gestibile?


336

Come si può sapere se il codice creato è facilmente leggibile, comprensibile e gestibile? Naturalmente dal punto di vista dell'autore, il codice è leggibile e gestibile, perché l'autore lo ha scritto e modificato, per cominciare. Tuttavia, ci deve essere uno standard oggettivo e quantificabile in base al quale la nostra professione può misurare il codice.

Questi obiettivi vengono raggiunti quando si può fare quanto segue con il codice senza il parere di un esperto dell'autore originale:

  • È possibile leggere il codice e comprendere a livello base il flusso della logica.

  • È possibile comprendere a un livello più profondo cosa sta facendo il codice per includere input, output e algoritmi.

  • Altri sviluppatori possono apportare modifiche significative al codice originale come correzioni di errori o refactoring.

  • Si può scrivere un nuovo codice come una classe o un modulo che sfrutta il codice originale.

Come possiamo quantificare o misurare la qualità del codice in modo da conoscerlo leggibile, comprensibile e gestibile?


154
Link obbligatorio (per una volta non per xkcd): osnews.com/images/comics/wtfm.jpg
Jerry Coffin

3
Direi solo che lo sai quando lo vedi, ma questo argomento era fondamentalmente imperfetto e imbarazzante anche nella sua forma originale, non importa se applicato al codice sorgente.
Konrad Rudolph,

6
"Naturalmente dal tuo punto di vista il tuo codice è leggibile" - non è così ovvio!
ZioZeiv,

24
Direi che lo sai quando lo vedi qualche mese dopo averlo scritto.
JeffO,

2
@asfallows: ho mostrato un po 'di codice a mia moglie, e lei ha pensato che fosse davvero un brutto codice, perché poteva leggerlo! (Troppe parole inglesi, e non abbastanza @ [! ^ $ & *) Caratteri ...)
gnasher729

Risposte:


370

Il tuo peer ti dice dopo aver esaminato il codice.

Non puoi determinarlo da solo perché come autore, sai più di quanto il codice dice da solo. Un computer non può dirti, per gli stessi motivi che non può dire se un dipinto è arte o no. Quindi, hai bisogno di un altro essere umano - in grado di mantenere il software - per guardare ciò che hai scritto e dare la sua opinione. Il nome formale di detto processo è peer review .


6
Niente batte il test empirico.
Ingegnere mondiale

25
+1 Il tuo pubblico più importante sono i tuoi coetanei che sono immersi, con te, nel conoscere i perché e i come del problema a cui stai lavorando e le sue soluzioni. Un buon codice riflette l'attuale comprensione del tuo gruppo di pari. Supponendo che il team sia capace, ponderato e aperto a nuove idee, "il tuo pari ti dice che è buono / mantenibile" è, nella mia esperienza, una definizione migliore di gran lunga rispetto a qualsiasi altra.
Doug T.

69
Nella mia esperienza, questo funziona solo quando il tuo collega sa cosa è buono e cosa è cattivo. Altrimenti suona così: "Dovresti scrivere quel codice con lo stesso metodo, è più facile trovare il codice"
Rangi Lin

12
@RangiLin, beh, il tuo collega potrebbe avere ragione.

11
@Rangi Devi lavorare con i colleghi che hai. se trovano difficile il tuo codice, questo è un problema con il tuo codice. A più lungo termine, è possibile educare, o cercare di ottenere i colleghi migliori (è possibile spostare o si può influenzare il processo di assunzione) ... Oh sì, e farlo ricorda sempre che essi possono essere di destra.
MarkJ

220

A volte, il modo migliore per sapere è tornare al codice che hai scritto sei mesi fa e cercare di capire cosa è stato scritto.

Se lo capisci rapidamente, è leggibile.


28
Sì, suona bene (ed è vero), ma non è un ottimo approccio per decidere cosa / come fare oggi ...
Michael Durrant

10
La dissezione suggerisce che ci vuole un po 'di tempo e devi farlo con attenzione ...
Deworde

3
Potrei perdere tempo per la revisione fino a un mese, o anche meno, per una prima visita. Penso che dipenda dalla complessità del progetto e del dominio, nonché dal tuo approccio mentale. Trovo che in sei mesi, mi distraggo vedendo opportunità di refactoring o ottimizzazione usando strumenti o tecniche che ho imparato da quando ho scritto il codice, invece della vera leggibilità.
Chris Bye,

1
@MichaelDurrant Ogni volta che rivedi il vecchio codice troverai pezzi che avrebbero dovuto essere scritti in modo diverso e poi tieni conto di ciò per il codice che stai scrivendo "oggi". Sì, ci vuole tempo per imparare a scrivere un buon codice.
dj18

1
@MichaelDurrant è ancora, dato che puoi imparare quali cose poco chiare stavi facendo sei mesi fa e non fare quelle cose oggi.
Djechlin,

94

È:

  1. gestibile se è possibile mantenerlo .
  2. facilmente gestibile se qualcun altro può mantenerlo senza chiederti aiuto
  3. leggibile se qualcun altro , leggendolo, comprende correttamente il design, il layout e l'intento

Il vero test per 1. è (come dicono Alex a Parigi e quant_dev ) che puoi riprenderlo dopo qualche mese facendo qualcos'altro.

Il test per 2. e 3. è che qualcun altro può raccoglierlo e capire come estendere o correggere il codice seguendo le linee guida del progetto. Se non riescono a capire il design, come si collega allo spazio problematico o come il tuo codice è destinato a essere utilizzato, invece hackereranno una soluzione attraverso il grano.

Ci sono regole empiriche, principi (cioè regole empiriche che qualcuno ha scritto bene e ha dato un nome) e tutti i tipi di suggerimenti che possono condurti nella giusta direzione o lontano da insidie ​​comuni. Nessuno di loro garantirà le qualità che stai chiedendo, però.


2
Che ne dite di considerare la quantità di tempo da dedicare alla correzione di un bug o alla modifica del comportamento esistente come fattore di manutenibilità? Un pezzo di codice che richiede meno tempo per fare la stessa modifica dovrebbe essere più mantenibile, giusto?
VCD

1
dipende; a volte fare bene una modifica richiederà il refactoring (cosa che puoi dire è necessaria perché il codice leggibile chiarisce che non è destinato a essere usato in quel modo), che richiede più tempo dell'hacking in un caso speciale (che il codice illeggibile incoraggia perché l'intento non è chiaro ).
Inutile

30

Se il codice segue i principi di SOLID e DRY e ha una buona serie di test unitari, è probabilmente mantenibile.

È leggibile? Leggilo. I nomi dei metodi e delle variabili hanno senso? Riesci a seguire la logica del programma senza problemi? Se la risposta è sì, il codice è leggibile.


8
... e dopo averlo letto, passalo a qualcun altro per provare a leggere.
jcmeloni,

19
Questo non è un test particolarmente valido. Molte applicazioni di queste regole sono soggettive e puoi quasi sempre leggere il tuo codice subito dopo che è stato scritto.
DeadMG

1
"Se la risposta è sì, allora il codice è leggibile" ... da te . Per vedere se è leggibile da altri, gli altri devono provare a leggerlo.

2
IMO, SOLID è sopravvalutato. Soprattutto il 'S.' Questo o tutti lo fraintendono.
Erik Reppen,

Ho eseguito innumerevoli volte nel codice DRY e SOLID e tuttavia orribile. I seguenti principi possono dare una falsa impressione che ciò che stai scrivendo non sia una schifezza.
Jakub Arnold,

24

Leggere come scrivere un codice non mantenibile - Garantire un lavoro per tutta la vita di Roedy Green, ridendo e imparando.

... come scrivere codice che è così difficile da mantenere, che le persone che verranno dopo di te impiegheranno anni per apportare anche le modifiche più semplici. Inoltre, se segui tutte queste regole religiosamente, ti garantirai persino una vita di lavoro, dal momento che nessuno, tranne te, ha una speranza all'inferno di mantenere il codice ...

Il saggio fornisce numerosi esempi di come scrivere codici errati, usando molti esempi divertenti. Continua a spiegare come utilizzare Creative Miss-spelling , Reuse of Names , la tecnica molto apprezzata di Reuse of Global Names come Private .

In modo divertente il saggio ti insegna come evitare tutti gli esempi di codice illeggibile e non realizzabile.

In realtà, ho trovato difficile credere che qualcuno avrebbe scritto codice con somiglianze con gli esempi nel testo. Fu allora che ero fresco di scuola. Ma, dopo aver lavorato per alcuni anni, vedo il codice dal testo ogni giorno ...


Vedi anche waterfall2006.com/gorman.html Il refuctoring è il processo di prendere un pezzo di codice ben progettato e, attraverso una serie di piccoli cambiamenti reversibili, che lo rende completamente non mantenibile da chiunque tranne te stesso.
Sjoerd,

22

Nonostante ciò sembri, ci sono alcune misure abbastanza oggettive che puoi prendere in considerazione. Libri come C ++ Coding Standards , Refactoring e Clean Code hanno una lunga lista di criteri per giudicare il tuo codice, osservando cose come nomi significativi, dimensioni delle funzioni, principi come accoppiamento e coesione, progettazione di oggetti, unit test, perfezionamento successivo, ecc.

L'elenco è troppo grande per essere trasformabile in un elenco di controllo, ma leggi il libro e scegli alcune cose chiave su cui lavorare, quindi dopo diversi mesi rileggilo per migliorare ulteriormente.


4
+1 per l'apprendimento incrementale e non cercare di diventare perfetto dall'oggi al
domani

19

La prova è nel budino. Guarda cosa succede dopo averlo consegnato a una persona ragionevolmente competente. Se non hanno bisogno di porre molte domande relative alla difficoltà del codice, hai fatto un buon lavoro.

Questa è stata una lezione iniziale della mia carriera. Un mentore disse: "Documenta tutto, in modo da poter sfuggire al programma in seguito. Se non anticipi le domande quando le risposte sono fresche nella tua mente, dovrai capirle quando non lo sono."


10
Attenzione che le persone possono astenersi dal porre domande a causa della paura di rivelare la loro ignoranza. Potresti persino percepire quelle persone come "ragionevolmente competenti" in primo luogo a causa della loro tendenza ad astenersi dall'esporle. Quindi la mancanza di domande potrebbe non essere una buona cosa a meno che tu non sappia che entrambi siete sinceri.
Hermann Ingjaldsson,

1
@HermannIngjaldsson - Abbastanza giusto. Naturalmente se non sono competenti e qualcosa si rompe, ne sentirai abbastanza presto. "Aiuto!!!!"
MathAttack,

questo sembra semplicemente ripetere ciò che è stato affermato nella risposta migliore
moscerino del

17

Ho letto tutte le risposte e ho notato che nessuno ha menzionato la complessità del codice.

Esiste una stretta correlazione tra complessità del codice e leggibilità / manutenibilità. Esistono numerosi algoritmi di valutazione della complessità del codice, ma parlerò solo di come funziona la valutazione della complessità di McCabe.

Fondamentalmente, il punteggio di McCabe legge il tuo codice e calcola il numero di "percorsi" unici che ci sono attraverso. Se usi McCabe come numeratore e righe di codice come denominatore, otterrai anche una buona approssimazione della "leggibilità".

Se hai 10 righe di codice e ci sono 300 percorsi attraverso quel codice, questo è un codice piuttosto non mantenibile (difficile da cambiare in modo facile e sicuro), e probabilmente non è molto leggibile. Al contrario, se hai 300 righe di codice, ma c'è solo 1 percorso (non ha condizioni), è sia leggibile che facilmente gestibile.

Il punto in cui McCabe cade però è in quest'ultimo esempio. Se ho 300 righe di codice senza condizioni, c'è davvero una buona probabilità che io abbia fatto "copia / incolla riutilizzo", e ovviamente non è neanche una buona cosa. Quindi ci sono metriche a livello di sistema che si applicano oltre a McCabe, come il rilevamento di codice duplicato o quasi duplicato.


2
Questa dovrebbe essere la risposta. Misurare. Altre risposte sono più opinioni che fatti, se riesco a capirlo, deve essere buono? Prima misura usando l'analisi della complessità, poi refattore umano per cercare duplicazioni, ecc.
Jon Raynor,

1
Il tuo ultimo paragrafo che menziona gli svantaggi del punteggio di McCabe diviso per LOC tende piuttosto a invalidare l'intera idea. Se hai bisogno di 300 percorsi attraverso il tuo codice, perché mai pensi che renderà il codice più gestibile per usare più linee? È come dire che se un libro presenta idee complesse, dovrebbe essere un libro davvero grande piuttosto che cercare di comunicare in modo conciso. -1.
Wildcard il

8

Un punto che condividerei è se il codice è incorporato in "moduli" e quando dico che intendo che puoi cambiare una cosa in un modulo e farlo funzionare facilmente con il tutto. Elimina gli effetti tra cose non correlate. Anche:

  • Il codice è facile da riutilizzare
  • Il tuo codice è flessibile (questo si collega con la creazione di moduli)
  • ASCIUTTO - Non ripetere te stesso

Consiglio vivamente di leggere The Pragmatic Programmer.


8

Alcuni test / indicatori:

  • Disattiva l'IDE. Riesci ancora a leggere il tuo codice? Quando c'è un bug è abbastanza facile rintracciarlo manualmente e capire in quale classe è necessario un punto di interruzione per capire dove si trova il problema? O quando usi l'IDE, non ti preoccupi nemmeno e fai solo dall'inizio?

  • Il debug diventa spesso un gioco di Wack-a-Mole in cui la correzione di un bug crea altri 2+.

  • Da trigger trigger a qualcosa di utile che sta realmente accadendo, quante chiamate di metodo sono necessarie? Quanti metodi trasmettono esattamente gli stessi o la maggior parte degli stessi parametri a un'altra chiamata di metodo?

  • Quanti file devi aprire per aggiungere un semplice nuovo metodo a una classe?

  • Pensa ai modelli e alle pratiche che hai adottato. L'hai fatto perché avevano perfettamente senso o perché qualcuno ti ha convinto che "è l'unico modo per farlo?" o perché lo volevi sul tuo curriculum o perché alcuni sviluppatori di rockstar lo hanno detto.


3
Leggere il codice senza un IDE sembra stupido, soprattutto come misura della leggibilità. Questo tipo di metrica ha come risultato "soluzioni" in stile notazione ungherese che alla fine minano davvero la leggibilità.
rubenvb,

8

Come si può sapere se il codice che ha creato è facilmente gestibile e leggibile?

Puoi individuare il codice facile da mantenere e leggibile cercando queste proprietà:

  1. Oggetti, metodi e / o funzioni fanno sempre una cosa.
  2. I metodi e / o le funzioni sono concisi (come in "breve ma completo").
  3. Gli oggetti, i metodi e / o le funzioni fanno essenzialmente quello che pensi che dovrebbero fare in base ai loro nomi.
  4. Il codice destinato al riutilizzo è in realtà riutilizzabile.
  5. Ultimo ma non meno importante, se puoi immediatamente testare l'unità del codice, probabilmente hai scritto almeno un codice modulare a responsabilità singola.

Come potremmo sapere se abbiamo scritto un codice piuttosto disordinato e non modificabile? Ci sono costrutti o linee guida per sapere se abbiamo sviluppato software disordinato?

  1. Se stai leggendo un metodo e non è chiaro quale fosse l'intento, questo è inelegante nella migliore delle ipotesi e probabilmente non realizzabile nella peggiore.
  2. Se non sembra semplice, probabilmente non è semplice e questo è un segno di codice non mantenibile o codice che diventerà presto non mantenibile.
  3. Se c'è una mancanza di simmetria (coerenza) attraverso la base di codice, è probabile che tu stia guardando un codice non mantenibile.

Non sono d'accordo sul fatto che il tuo esempio di refactoring sia più chiaro. Sono d'accordo che il codice originale debba funzionare, ma puramente in termini di chiarezza e intento comunicativo, penso che l'originale sia molto meglio. Sono molto sospetto di qualsiasi refactoring che afferma che migliora la chiarezza mentre introduce regex.
Roy,

1
@Roy, sì, abbastanza giusto. Probabilmente non avrei mai dovuto aggiungere quel codice di esempio. Certo, è stato quasi 3 anni fa, ma anche allora, probabilmente non avrei dovuto usare PHP (sto facendo il crating solo guardandolo ora), e non avrei dovuto usare una regex poiché è una di quelle cose che alcune persone può guardarlo e ottenerlo immediatamente, ma per gli altri, non importa quanto sia succinto, le regex sono una disattivazione immediata. Ho intenzione di modificare la risposta e rilasciare l'esempio di codice. Grazie per il commento.
Wil Moore III,

Come può un oggetto fare una cosa?
Koray Tugay,

@KorayTugay Pensaci in questo modo. Se un oggetto descrive più di un singolo concetto coesivo, hai un odore.
Wil Moore III,

6

In una sola parola, esperienza .

Per iniziare, è necessario aver messo a posto il lavoro, quindi non posso raccomandare più caldamente che i programmatori dovrebbero prendere il tempo di leggere libri come Refactoring , che fornirà alcuni degli strumenti più essenziali in un arsenale di programmatori che miglioreranno la tua capacità di mantenere il codice e Clean Code che è stato scritto da alcuni dei talenti più altamente riconoscibili nel nostro campo e che descrive quasi tutto ciò che devi capire per garantire che il tuo codice sia pulito e leggibile.

Nessuna quantità di lettura tuttavia sostituisce l'esperienza acquisita duramente. Devi davvero aver lavorato con il codice per un po 'per apprezzare appieno la differenza che può fare l'attenzione alla qualità del codice. Provando il piacere di lavorare con un codice pulito e ben ponderato, così come il dolore di lavorare con il codice spaghetti, impari a capire meglio cosa gli autori di questi libri stavano davvero cercando di insegnarti, ma lo fai in un contesto più ampio del vero codice di produzione dal vivo, in cui la qualità di ciò che fai conta davvero e influisce sulla tua capacità di lavorare facilmente con il tuo codice su base giornaliera.

Aiuta anche ad avere un buon mentore o un pari con l'esperienza per confermare che stai mettendo lo sforzo di scrivere codice secondo standard elevati. Questo è solo uno dei motivi per cui le recensioni di codice possono essere così utili. L'uso degli strumenti di verifica e formattazione del codice può anche essere un aiuto molto utile per garantire che le cose vengano mantenute pulite. Nulla tuttavia è paragonabile all'esperienza acquisita attraverso anni di software di scrittura, in modo tale che ti ritrovi automaticamente a scrivere codice che sia pulito, leggibile e strutturato semplicemente per facilità di manutenzione, e tutto perché hai preso l'abitudine di applicare le migliori pratiche per lungo.


3

Senza essere puritani: preferisci lo stile funzionale. La maggior parte delle lingue in questi giorni (.NET, Ruby, Python, Javascript, ecc.) Lo supportano e lo promuovono (ad esempio LINQ, underscorejs).

È estremamente facile da leggere.

var recentTopCustomers = OrderList
    .Where(o => o.Date >= DateTime.Now.AddDays(-5))
    .Where(o => o.Amount > 1000)
    .OrderBy(o => -o.Amount)
    .Take(10)
    .Select(o => o.Customer);

Obbliga ogni nodo ad avere un singolo, concentrato intento prestando alla chiarezza di scopo. E poiché ogni attività discreta viene isolata spuntando, collegando e riorganizzando nodi (operazioni) a fini diversi è banale. Ciò si presta alla facilità di manutenzione.


2

Codice leggibile e mantenibile: codice che, a prima vista, un programmatore può capire abbastanza bene da poter facilmente:

  • riutilizzarlo tramite la sua interfaccia o
  • esegui il debug o
  • cambia il suo comportamento. (aggiungi / rimuovi una funzione) o
  • ottimizzalo
  • Provalo

Questo si riduce a "chiarezza". vale a dire quante domande il programmatore deve porre a un particolare segmento di codice prima di essere sicuro di "capire cosa fa abbastanza bene" per realizzare il compito attuale senza causare effetti collaterali imprevisti.

Il libro "Code Complete, di Steve McConnell" approfondisce questo argomento in modo molto dettagliato.

Esamina varie metriche che è possibile utilizzare per determinare se il codice è di buona qualità.

Vedi un esempio qui: http://books.google.co.uk/books?id=3JfE7TGUwvgC&lpg=PT376&pg=PT389#v=onepage&q&f=false


ciò non sembra aggiungere nulla di sostanziale rispetto ai punti formulati e spiegati nelle risposte precedenti
moscerino del

Penso che una delle cose più sostanziali che aggiunge sia un riferimento a Code Complete, che nessuna risposta precedente menziona. Quel libro è uno dei libri più significativi e influenti che si concentra sulla scrittura di codice leggibile e mantenibile. Chiunque abbia letto quel libro non avrebbe bisogno di chiedere "Come faresti a sapere se hai scritto un codice leggibile e facilmente gestibile?".
JW01,

... quindi, secondo me, credo che la cosa migliore che chiunque possa ottenere se sono veramente interessati a scrivere un codice gestibile è leggere quel libro. Quindi, con molti minuti di attenta riflessione (che spesso sono molti più pensieri dei moderatori SO), penso che questa non sia solo una risposta adeguata alla domanda del PO, ma la migliore .
JW01,

2

Riduci al minimo gli effetti collaterali (idealmente non ne hai)

Una funzione che causa 3 cambiamenti in stati al di fuori del proprio ambito è molto più difficile da ragionare e mantenere rispetto a uno che semplicemente immette qualcosa e produce qualcos'altro. Non puoi semplicemente sapere cosa fa la funzione, devi ricordare cosa ha fatto e come ciò influisce su tutte le altre funzioni rilevanti.

Per OOP minimizzare gli effetti collaterali significa anche classi con un minor numero di membri, e in particolare un numero inferiore di membri che possono modificare lo stato della classe, poiché le funzioni membro possono modificare gli stati oltre i propri e avere effetti collaterali (possono manipolare gli interni della classe, ad es.). Significa anche classi con un minor numero di membri dei dati, in modo che ci sia meno stato per quei metodi da manomettere e meno effetti collaterali che possono causare.

Ad esempio, immagina di provare a progettare una struttura di dati elaborata in grado di mantenere uno sortedstato che utilizza per determinare se eseguire ricerche binarie o lineari. In tal caso, potrebbe essere utile separare il disegno in due classi. Chiamare sortedla classe non ordinata potrebbe quindi restituire una struttura di dati di un'altra classe che mantiene sempre i suoi contenuti ordinati. Ora hai meno effetti collaterali (quindi meno codice soggetto a errori e più facile da comprendere) e un codice più ampiamente applicabile (il primo progetto sarebbe dispendioso sia nell'elaborazione che nell'efficienza intellettuale umana per piccoli array che non devono mai essere ordinati).

Evitare dipendenze esterne superflue

Potresti essere in grado di implementare il codice più conciso che si possa immaginare con il massimo riutilizzo del codice utilizzando 13 librerie diverse per eseguire un'attività relativamente semplice. Tuttavia, ciò trasferisce un sovraccarico intellettuale ai tuoi lettori, costringendoli a comprendere almeno parti di 13 librerie diverse. Questa complessità intrinseca dovrebbe essere immediatamente apprezzata da chiunque abbia cercato di costruire e comprendere una libreria di terze parti che richiedesse il pull-in e la costruzione di una dozzina di altre librerie per funzionare.

Questa è probabilmente una visione molto controversa, ma preferirei una modesta duplicazione del codice all'estremo opposto, purché il risultato finale sia ben testato (niente di peggio del codice difettoso non testato duplicato più volte). Se la scelta è tra 3 righe di codice duplicato per calcolare un prodotto incrociato vettoriale o inserire una libreria matematica epica solo per radere via 3 righe di codice, suggerirei il primo a meno che l'intera squadra non sia a bordo con questa libreria matematica , a quel punto potresti considerare di scrivere solo 3 righe di codice anziché 1 se è abbastanza banale in cambio dei vantaggi del disaccoppiamento.

Il riutilizzo del codice è un atto di bilanciamento. Riutilizzi troppo e trasferisci la complessità intellettuale in un modo uno-a-molti, in quanto in quelle 3 righe di codice semplice che hai salvato sopra ha il costo di richiedere ai lettori e ai manutentori di comprendere molte più informazioni di 3 righe di codice . Inoltre, rende il codice meno stabile, poiché se la libreria matematica cambia, anche il codice potrebbe essere modificato. Riutilizzi troppo poco e moltiplichi anche il sovraccarico intellettuale e il tuo codice cessa di beneficiare di miglioramenti centrali, quindi è un atto di bilanciamento, ma l'idea che sia un atto di bilanciamento merita di essere menzionata dal momento che cercare di eliminare ogni piccola forma di duplicazione modesta può portare per un risultato difficile da mantenere, se non di più, dell'estremo opposto.

Metti alla prova la merda

Questo è un dato di fatto, ma se il tuo codice non gestisce tutti i casi di input e manca alcuni casi limite, come puoi aspettarti che gli altri mantengano il codice che hai scritto che non hai nemmeno ottenuto prima di trasferirlo ai loro occhi e mani? È abbastanza difficile apportare modifiche al codice che funziona perfettamente, per non parlare del codice che non era mai del tutto corretto in primo luogo.

Inoltre, il codice che supera i test approfonditi generalmente troverà meno motivi per cambiare. Ciò riguarda la stabilità che è ancora più un sacro graal da raggiungere rispetto alla manutenibilità, poiché il codice stabile che non deve mai essere modificato non comporta costi di manutenzione.

Documentazione dell'interfaccia

Dai la priorità a "cosa fanno le cose" rispetto a "come le fanno" se non puoi dedicare lo stesso tempo alla documentazione di entrambi. Un'interfaccia chiara che è ovvia nelle sue intenzioni su ciò che farà (o almeno ciò che dovrebbe fare) in tutti i possibili casi di input porterà una chiarezza di contesto alla propria implementazione che guiderà nella comprensione non solo di come per usare il codice, ma anche come funziona.

Nel frattempo il codice che manca di queste qualità in cui le persone non sanno nemmeno cosa dovrebbe fare è SOL, non importa quanto siano ben documentati i suoi dettagli di implementazione. Un manuale di 20 pagine su come viene implementato il codice sorgente è inutile per le persone che non riescono nemmeno a capire esattamente come dovrebbe essere usato in primo luogo e cosa dovrebbe persino fare in tutti i possibili scenari.

Per quanto riguarda l'implementazione, dai la priorità alla documentazione di ciò che fai diversamente dagli altri. Ad esempio, Intel ha una gerarchia di volumi limite per i suoi kernel raytracing. Dal momento che lavoro in questo campo, posso riconoscere la maggior parte di ciò che il loro codice sta facendo a colpo d'occhio senza setacciare la documentazione. Tuttavia, fanno qualcosa di unico che è l'idea di attraversare il BVH ed eseguire intersezioni in parallelo usando i pacchetti di raggi . È qui che voglio che diano la priorità alla loro documentazione perché quelle parti del codice sono esotiche e inusuali rispetto alla maggior parte delle implementazioni BVH storiche.

leggibilità

Questa parte è molto soggettiva. Non mi interessa molto della leggibilità di un genere vicino ai processi di pensiero umani. Il codice più ben documentato che descrive le cose al più alto livello è ancora difficile per me se l'autore utilizza processi di pensiero bizzarri e contorti per risolvere un problema. Nel frattempo il codice terse che usa nomi di 2 o 3 caratteri può spesso essere più facile per me capire se la logica è molto semplice. Immagino che potresti rivederti e vedere cosa preferiscono gli altri.

Sono principalmente interessato alla manutenibilità e, soprattutto, alla stabilità. Il codice che non trova motivi per cambiare è uno che non ha costi di manutenzione.


1

Direi che un modo per sapere sarebbe se i nuovi membri del team fossero in grado di raccogliere il codice, comprenderlo e modificarlo per correggere i difetti / soddisfare i nuovi requisiti con relativa facilità.


1

Ecco una tecnica che mi piace usare:

Mostra il codice a uno dei tuoi programmatori peer e fatti spiegare loro cosa fa. Guarda per queste cose.

1) Se non riescono a spiegare facilmente lo scopo di un blocco di refactoring del codice.
2) Se devono saltare ad un'altra sezione di codice per comprendere la sezione corrente, rifattorizzala.
4) Ogni volta che senti il ​​bisogno di parlare durante il processo, quella sezione di codice deve essere riformulata. (Il codice non parla da solo).


Supponendo che il programmatore alla pari sia almeno altrettanto esperto e letto nel linguaggio di programmazione e nei suoi modi di dire. Tutto a tecniche spesso come queste possono indurre le persone a scrivere codice in un sottoinsieme dell'espressività della lingua nel tentativo fuorviato di renderlo comprensibile anche al membro del team più giovane. Il risultato è un corpus di codice più ampio in un sottoinsieme offuscato della lingua. E non importa quanto tu possa smorzare il sottoinsieme della lingua, 500KLOC di codice del sottoinsieme di piccole lingue saranno sempre più lavoro da mantenere rispetto al codice 200KLOC che utilizza un sottoinsieme più espressivo.
user1703394,

questo sembra semplicemente ripetere ciò che è stato affermato nella risposta migliore
moscerino del

-1

Il codice più gestibile è il codice che non c'è. Quindi, invece di aggiungere al conteggio LOC, il nuovo codice che "riduce" il conteggio LOC (anche se leggermente meno gestibile se visualizzato in modo isolato) potrebbe rendere la base di codice totale più gestibile semplicemente riducendone le dimensioni. Quindi la regola principale per il codice gestibile:

  • massimizzare SECCO.

In secondo luogo, per la manutenibilità non c'è nulla di peggio delle dipendenze nascoste. Quindi per la regola numero 2:

  • Rendi esplicite tutte le tue dipendenze.

In terzo luogo, non tutti i programmatori sono ugualmente abili nel mantenere o scrivere usando specifiche funzionalità o linguaggi del linguaggio di tecniche più avanzate. Lo smorzamento dell'intera base di codice ti porterà a una grande base di codice che a causa delle sue dimensioni è difficile da mantenere. Consentire funzionalità e idiomi di tecniche avanzate in tutto il codice renderà tutto il codice gestibile solo dagli sviluppatori senior anche ciò che è male. La chiave per la manutenibilità è la stratificazione basata sul livello di abilità Ad esempio:

Librerie cross-project: sviluppatori senior, back back di trucchi codice / linguaggio / tecniche Librerie specifiche di progetto e backend di sistema: sviluppatori medi, evita le cose più avanzate e difficili da spiegare. Gli anziani esamineranno questo codice alla ricerca di opportunità di miglioramento SECCO.

Front-end: sviluppatori junior, utilizzare una guida di stile rigorosa e un insieme di tecniche costrutti linguistici e modi di dire da evitare. Gli sviluppatori di Medior analizzeranno questo codice alla ricerca di opportunità DRY e di una logica aziendale nascosta.

Quindi per la regola numero 3:

  • Livella il tuo codice in base al livello di abilità degli sviluppatori e scrivi di conseguenza un codice gestibile.

io


1
questo non sembra offrire nulla di sostanziale rispetto ai punti formulati e spiegati nelle precedenti 25 risposte
moscerino del

@gnat, speravo di aggiungere 'sfumature' a molte semplificazioni (potenzialmente dannose) in altre risposte. Soprattutto con il punto 3.
user1703394,

1
@ user1703394 questa domanda e le sue risposte sono wiki della comunità. Se ritieni che una risposta esistente possa essere migliorata, puoi modificarla anche senza il privilegio "modifica post di altri utenti".

-2

Non è mai troppo facile provare a scrivere un codice leggibile e facilmente gestibile, ma non è difficile scrivere un codice facile e mantenibile.

OOAD è una parola di quattro lettere ma è difficile da capire in una volta sola - segui l'analisi e la progettazione orientate agli oggetti

  1. Inizia sempre con una buona raccolta dei requisiti e l'esatta Dichiarazione dei problemi

    • iniziare con pochi casi d'uso, ad esempio; Interazione dialogo utente-sistema
  2. Devi mantenere i tuoi oggetti liberamente accoppiati e assicurarti che il codice non si ripeta - segui DRY [Non ripetere te stesso]

    • ogni volta che vedi un duplicato, cerca un luogo da incapsulare
  3. il tuo codice è aperto per l'estensione e chiuso per modifica - OCP [Principio aperto-chiuso]
  4. Quando si modifica il codice, ricordare sempre: non creare problemi per risolvere i problemi, semplicemente l'IT afferma di non modificare le funzionalità esistenti
  5. Unit test il tuo codice
    • testa sempre il tuo codice quando le cose vanno male
  6. Mentre lavori sulla funzionalità, ricorda sempre di seguire le OOP di base (principi orientati agli oggetti) e le tecniche per assicurarti che la tua applicazione sia ben progettata dall'inizio
    • Gli oggetti dovrebbero fare ciò che indica il loro nome
    • Ogni oggetto dovrebbe rappresentare un singolo concetto
  7. Ricorda sempre la dichiarazione del problema del sistema e in quale contesto / software di dominio funziona
  8. Fai anche un po 'di lavoro di carta, sì, questo funziona per me
    • avere alcune stampe di elementi correlati all'interfaccia utente e i diagrammi UML funzionano sempre
    • puoi anche avere le schermate della sessione di brainstorming dalla lavagna bianca
  9. Layout di architettura
  10. Applicare i principi di progettazione, se possibile
  11. Documentazione
    • documenta sempre il tuo codice
    • impostare il rientro nell'IDE e documentare anche quello

1
Questa è una teoria che non risponde al Come possiamo quantificare o misurare la qualità del codice in modo da conoscerlo leggibile, comprensibile e mantenibile? domanda
Jan Doggen,

D'accordo !! ma se seguiamo i principi sopra menzionati, è facile misurare la qualità del codice, leggibile, comprensibile e ovviamente mantenibile. Correggimi se sbaglio.
Narender Parmar,

Non so perché la mia risposta sia stata
sottoposta a downgrade
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.