2012-02-14 5 views
8

Recentemente ho prelevato un progetto con una grande base di codice che contiene molte duplicazioni. Il problema è che la funzionalità duplicata non è stata scritta dalle stesse persone né copiata tra di loro.Strumento per analizzare e confrontare la logica di funzioni simili?

Quindi, ci sono strumenti che posso utilizzare per confrontare la logica effettiva di due funzioni? Ecco alcuni dei vincoli che potrebbero essere utili.

  • ordine in cui l'ordine è irrilevante (come impostazioni di proprietà) Ignorare
  • nomi delle variabili devono essere analizzati per similitudine, ma non necessaria per corrispondere se utilizzato per gli stessi motivi
  • sguardo profondo negli altri metodi chiamati dalle funzioni da confrontare e appiattire la logica per il confronto

Idealmente, lo strumento produrrebbe una singola uscita di funzione. Le reali differenze logiche sarebbero evidenziate in qualche modo. Può anche essere in una forma che definisce funzioni separate per le differenze nella logica, passandole nella funzione principale che contiene la logica che è identica.

Questo suona come un ordine alto, ma qualcuno ha incontrato strumenti che tentano di fare una di queste cose?

Modifica

Mentre ci sono alcuni interessanti strumenti citati, non assomiglia a nessun di loro prenderà il contenuto di dette funzioni in considerazione quando si confrontano la logica dei due metodi. Se non sono corretto, per favore fatemelo sapere!

+4

Penso che questo "strumento" esista ed è un programmatore umano :) – vulkanino

+4

@vulkanino: Significa che verrai ad analizzare il codice per me? Avrò solo bisogno di spendere $ 50 - $ 200 una volta e poter usare questo "strumento" ogni volta che ne ho bisogno? –

+0

:) Costano di più, ma sicuramente troverai uno strumento più economico su VWorker ad esempio;) – vulkanino

risposta

6

Se si scarica la developer preview di Visual Studio vNext ultimo, include una nuova funzionalità Codice Clone di rilevamento: http://msdn.microsoft.com/en-us/library/hh205279(v=vs.110).aspx

http://blogs.msdn.com/b/zainnab/archive/2011/12/13/visual-studio-11-developer-preview-code-clone-detection-aka-code-clone-analysis.aspx

il link per scaricare la Developer Preview di Visual Studio: http://www.microsoft.com/download/en/details.aspx?id=27543

+0

Sembra abbastanza vicino. Spero di avere la possibilità di provarlo. –

+0

A meno che non manchi qualcosa, questo ha la stessa difficoltà che hanno gli altri strumenti - non esamina il codice nelle funzioni chiamate. (Quindi se la funzione A chiama B, C e D allora il codice in B, C e D è irrilevante per il confronto delle funzioni A e Z.) –

+2

Non ho idea del motivo per cui questa risposta è stata aumentata e tanto meno contrassegnata con la taglia . Il rilevatore di cloni di Visual Studio corrisponde a sequenze di token. Non può trovare in modo affidabile i limiti delle funzioni, né tanto meno analizzare il codice, individuare nomi e tipi o determinare se le funzioni sono simili. Troverà il codice che è copiato e incollato; OP ha esplicitamente detto che il codice che voleva corrispondere NON è stato copiato e incollato. –

1

Esiste funzionalità di Rilevamento e consolidamento duplicati su CodeRush. (http://devexpress.com/Products/Visual_Studio_Add-in/Coding_Assistance/duplicate_code.xml)

Questa funzione ha rilevato il codice duplicato. non sono sicuro che sia in grado di rilevare/confrontare la logica di funzioni simili.

Spero che questo aiuto.

5

Se si dispone di ReSharper, è disponibile un plug-in ReSharper Agent Ralf.

preventivo della home dell'agente Ralf:

In alcuni casi due metodi possono essere trovati funzionalmente equivalente (stessi input producono gli stessi risultati e gli effetti collaterali), ma non testualmente equivalente. Ad esempio, due metodi potrebbero differire solo nella denominazione delle variabili locali e sono altrimenti identici. L'agente Ralph è in grado di rilevare questa situazione, e altri come esso, e di determinare che i metodi sono equivalenti dal punto di vista funzionale.

0

È sempre possibile programmare il proprio. Questo rientra nelle corrette prove dell'unità.

SE le funzioni simili modificano qualche istanza/classe di stato, POI utilizzare la riflessione per verificare se i valori di proprietà delle classi risultanti sono uguali.

SE le funzioni simili modificano un database, THEN crea una copia del database eseguendo ciascuna funzione su una copia e confrontandola.

Ma probabilmente tutto inizia con i test di unità adeguati. Se si conoscono tutti i possibili "casi d'uso", quando si scopre che l'uscita di due (o più) funzioni è la stessa per tutti questi "casi d'uso", si può tranquillamente mantenere una funzione e buttare via le ripetizioni come non necessarie.

Un'altra opzione è ottenere i requisiti effettivi per ciò che il codice/funzioni stanno facendo. Imparare ciò che il tuo sistema sta effettivamente cercando di realizzare rende molto più semplice il refactoring di codice vecchio o ripetitivo.


Gli strumenti che controllano la duplicazione logica ti porteranno solo quando sei disposto a lavorare. Se si dice che gli strumenti correnti non tengono conto di funzioni nidificate o funzioni che chiamano altre funzioni, allora perché non rifattorizzare il codice per incorporare quelle funzioni chiamate in modo che lo strumento funzioni? Stai solo cercando una panacea se non vuoi nemmeno il refactoring del metodo A (che chiama i metodi B, C, D) nel metodo AA che inline il codice da B, C, D.

IN BREVE con un po 'di "lavoro" puoi far funzionare gli strumenti attuali per te. Potresti voler contribuire agli strumenti open source per compensare la mancata menzione.

+0

+1 per il test dell'unità – deltree

+0

La spinta della risposta presuppone che le funzioni siano ** identiche **. Tuttavia, so che le funzioni sono diverse e sto cercando le somiglianze. –

+0

Naturalmente, ho potuto refactoring il codice per rendere più facile per gli strumenti di fare ciò che possono. Ma a quel punto ho già fatto la maggior parte del lavoro - non è questo il punto di ottenere uno strumento per farlo? –