Domanda

Siamo tutti d'accordo sul fatto che la duplicazione è un male e dovrebbe essere evitata (principio Non ripeterti).Per garantire ciò, è necessario utilizzare il codice di analisi statica come scimmiesco (Multilingue) o Detective clone (Componente aggiuntivo di Visual Studio)

ho appena letto Il post di Ayende su Kobe dove sta dicendo che:

L'8,5% di Kobe è un codice copia e incolla.E cioè con la sensibilità composta in alto, se impostiamo la soglia su 3, che è ciò che faccio comunemente, è fino al 12,5%.

Penso che 3 come soglia sia molto basso.Nella mia azienda offriamo l'analisi del codice di qualità come servizio, la nostra soglia predefinita per la duplicazione è impostata su 20 e ci sono molte duplicazioni.Non riesco a immaginare che se lo impostassimo su 3, sarebbe impossibile per il nostro cliente anche solo pensare alla correzione.

Capisco l'opinione di Ayende su Kobe:È un campione ufficiale ed è commercializzato come "destinato a guidarti con la pianificazione, l'architettura e l'implementazione di applicazioni e servizi Web 2.0". Quindi l'aspettativa di qualità è alta.

Ma per il tuo progetto quale soglia minima usi per la duplicazione?

Domanda correlata: Con quanto fanatismo elimini la duplicazione del codice?

È stato utile?

Soluzione

Tre è una buona regola pratica, ma dipende.Il refactoring per eliminare la duplicazione spesso implica scambiare la semplicità concettuale della base di codice e dell'API con una base di codice più piccola che sia più gestibile una volta che qualcuno la capisce.In genere valuto le cose sotto questa luce.

Ad un estremo, se correggere la duplicazione rende il codice più leggibile e aggiunge poco o niente alla complessità concettuale del codice, allora qualsiasi duplicazione è inaccettabile.Un esempio di ciò potrebbe verificarsi ogni volta che il codice duplicato si trasforma in una semplice funzione referenzialmente trasparente che fa qualcosa che è facile da spiegare e nominare.

Quando una soluzione più complessa e pesante, come la metaprogrammazione, i modelli di progettazione OO, ecc.è necessario, posso consentire 4 o 5 istanze, soprattutto se lo snippet duplicato è piccolo.In questi casi ho l'impressione che la complessità concettuale della soluzione renda la cura peggiore del male finché i casi non sono davvero tanti.

Nel caso più estremo, dove la base di codice con cui sto lavorando è un prototipo in rapida evoluzione e non so abbastanza in quale direzione il progetto potrebbe evolversi per tracciare linee di astrazione che siano allo stesso tempo ragionevolmente semplici e ragionevolmente a prova di futuro, Mi arrendo e basta.In una base di codice come questa, penso che sia meglio concentrarsi solo sull'opportunità e sul portare a termine le cose piuttosto che su un buon design, anche se lo stesso pezzo di codice viene duplicato 20 volte.Spesso le parti del prototipo che creano tutta quella duplicazione sono quelle che verranno comunque scartate relativamente presto e, una volta che sai quali parti del prototipo verranno mantenute, puoi sempre rifattorizzarle.Senza i vincoli aggiuntivi creati dalle parti che verranno scartate, il refactoring è spesso più semplice in questa fase.

Altri suggerimenti

Non so quale sia un buon "metrico" per questo, ma direi che quello per cui di solito mi sforzo lo è

  • se hai lo stesso codice in due posti e
  • il codice è lo stesso intenzionalmente (piuttosto che semplicemente coincidentemente lo stesso)

quindi eseguire il refactoring per eliminare la duplicazione.Ogni duplicazione è dannosa.Raramente lascerò che il codice sia in due posti e in tre deve assolutamente andare.

Personalmente ne sono piuttosto fanatico.Cerco di progettare i miei progetti per evitare la duplicazione del codice.Ho l'obiettivo di ottenere la soglia nelle singole cifre inferiori, se non riesco ad arrivarci significa che il mio progetto non è abbastanza buono e devo tornare al tavolo da disegno o al refactoring.

Dipende dal linguaggio di programmazione.(Il ragazzo di "Clone Detective" sembra riconoscerlo:"vincoli del linguaggio di programmazione" è uno dei riquadri della sua prima presentazione.)

In un programma Lisp, Qualunque l'espressione duplicata è facilmente soggetta a refactoring: immagino che chiameresti quella soglia 2.Tutto è composto da espressioni e ci sono macro per tradurre le espressioni, quindi raramente c'è una scusa per duplicare qualcosa anche una volta.(L'unica cosa che mi viene in mente e che sarebbe difficile da estrarre sarebbe qualcosa come le clausole LOOP, e in effetti molte persone sostengono di evitare LOOP proprio per questo motivo.)

In molti altri linguaggi, i programmi sono costituiti da classi che hanno metodi che contengono istruzioni, quindi è più difficile estrarre semplicemente un'espressione e usarla in due file diversi.Spesso significa cambiare la struttura della cosa mentre la estrai.Spesso c'è anche un requisito di indipendenza dal tipo, che può essere limitante (a meno che non si voglia scrivere un file tutto di codice di riflessione continuamente per sfuggirlo, ma se lo fai, non dovresti usare un linguaggio statico).Se rendessi il mio attuale programma tipizzato staticamente perfettamente DRY, non sarebbe né più breve né più facile da mantenere.

Immagino che il risultato sia che ciò che vogliamo veramente sia "facile da mantenere".A volte, in alcune lingue, ciò significa "basta inserire un commento qui che dica cosa hai copiato e perché".DRY è un buon indicatore di codice manutenibile.Se ripeti molto, non è un buon segno.Ma inseguire ogni singola statistica tende anche a essere negativo, altrimenti risolveremmo tutti i nostri problemi semplicemente ottimizzandoli.

Penso che dobbiamo unirci

  • Numero di righe duplicate
  • Numero di volte in cui il duplicato è stato copiato
  • Quanto sono “vicini” i duplicati tra loro
    ad esempio, se sono presenti prodotti diversi che si trovano nello stesso sistema di controllo del codice sorgente, è molto diverso rispetto a quando si trovano nello stesso metodo.
  • Tempo trascorso da quando uno qualsiasi dei metodi che contengono il codice duplicato è stato modificato.

In modo da ottenere un buon compromesso tra costi/benefici della rimozione dei duplicati.

Nostro CloneDR trova codice duplicato, sia copie esatte che quasi mancati, su sistemi sorgente di grandi dimensioni, parametrizzato dalla sintassi del linguaggio.Supporta Java, C#, COBOL, C++, PHP e molti altri linguaggi.

Accetta una serie di parametri per definire "Cos'è un clone?", tra cui:a) soglia simile, controllando come devono essere simili due blocchi di codice cloni declamati (in genere il 95% è buono) B) Numero di linee Dimensione minima del clone (3 tende ad essere una buona scelta) C) Numero di parametri (cambiamenti distinti al testo;5 tende ad essere una buona scelta) con queste impostazioni, tende a trovare un codice ridondante del 10-15% praticamente in tutto ciò che elabora.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top