Frage:
Tool zum Extrahieren von Methodenempfehlungen
durron597
2014-04-30 20:03:12 UTC
view on stackexchange narkive permalink

Gibt es ein Tool, das Code durchsucht und Empfehlungen zum Extrahieren von Methodenkandidaten mit doppeltem Code abgibt? Hier ist ein wirklich erfundenes Beispiel:

  import java.util.List; öffentliche Klasse ExtractMethod {public boolean mode; public String getFirst (List<String> eins, List<String> zwei) {if (mode) {StringBuilder sb = new StringBuilder (); für (String-Elemente: eins) {sb.append (elements.charAt (0)); } return sb.toString (); } else {StringBuilder sb = neuer StringBuilder (); for (String-Elemente: zwei) {sb.append (elements.charAt (0)); } return sb.toString (); }}}  

Wenn Sie die duplizierten Zeilen in Eclipse auswählen und Methode extrahieren auswählen, erhalten Sie Folgendes:

  import java.util.List; public Klasse ExtractMethod {öffentlicher boolescher Modus; public String getFirst (List<String> eins, List<String> zwei) {if (mode) {return getFirstFromList (eins); } else {return getFirstFromList (zwei); }} privater String getFirstFromList (List<String> one) {StringBuilder sb = new StringBuilder (); für (String-Elemente: eins) {sb.append (elements.charAt (0)); } return sb.toString (); }}  

Ziemlich gut. Gibt es ein Tool, das eine Klasse durchblättert und Empfehlungen zu guten Kandidaten dafür gibt?

Zwei antworten:
Konstantin V. Salikhov
2014-05-01 20:47:36 UTC
view on stackexchange narkive permalink

Der beliebte kostenlose Open-Source-PMD-Code-Analysator verfügt über einen Copy-Paste-Detektor CPD - er kann ähnliche Codefragmente finden, die gute Kandidaten für das Refactoring von "Extraktionsmethoden" sind. Es ist plattformübergreifend und kann auf jedem System ausgeführt werden, auf dem JRE implementiert ist. Es gibt auch eine Vielzahl von Plugins für beliebte Build-Tools und IDEs wie Maven, Eclipse, Ant usw.

Ein bisschen mehr Informationen hinzugefügt.
+1 Das scheint großartig! Ich werde akzeptieren, nachdem ich es ausprobiert habe.
Sieht jetzt gut aus :)
Okay, eigentlich ist dies nicht das, wonach ich suche, soweit ich das beurteilen kann, sucht dies nur nach genauen Übereinstimmungen, nicht nach "ähnlichem Code".
Außerdem muss die Kachelgröße mindestens 25 betragen. In dem im OP bereitgestellten Beispiel werden keine Duplikate gefunden.
Sehen Sie sich Konfigurationsoptionen wie Ignorieren von Literalen, Ignorieren von Bezeichnern usw. an. Dieses Tool ist nicht nur ein exakter Übereinstimmungs-Locator.
Die minimale doppelte Größe ist ebenfalls konfigurierbar, AFAIK
@KonstantinV.Salikhov Ich habe das integrierte Eclipse-Tool heruntergeladen. Ich habe versucht, die Größe zu verringern, aber es ließ mich nicht. Ist es möglich, dass sich das Eclipse-Tool hinter dem Kofferraum befindet?
Ich weiß nichts über Eclipse, die Befehlszeilenversion wäre so etwas wie "java net.sourceforge.pmd.cpd.CPD --minimum-tokens 10 --files / mysourcesdir"
Ira Baxter
2015-06-02 07:12:07 UTC
view on stackexchange narkive permalink

Unser CloneDR -Tool erkennt dazu Klone in Tausenden von Dateien. Sie geben nichts anderes als die Dateien; es bestimmt die Klone automatisch.

Ein Klonsatz ist ein Satz von Codeblöcken, die als ähnlich angesehen werden. Oft sind Klonsätze nur Paare, manchmal Tausende von Zeilen. Dies geschieht, wenn Quelldateien massenhaft in die Codebasis kopiert werden. Bemerkenswerterweise können Klonsätze 3, 100 bis zu mehreren hundert Instanzen ähnlichen Codes enthalten. Normalerweise besteht der einzelne Klon im letzteren Fall aus 4 bis 10 Zeilen und stellt eine Redewendung dar, die überall in der Codebasis verwendet wird (z. B. eine Routine zur Konvertierung von Zeichenfolgen in Zahlen).

Unter den fast 10.000 Klonen wird sie festgelegt Findet in dem Code über 1MSLOC, der eine Version des Eclipse JDT enthält, diese beiden Klone: ​​

  this.declaringQualification = isCaseSensitive ()? Deklarieren der Qualität: CharOperation.toLowerCase (Deklarieren der Qualität); this.declaringSimpleName = isCaseSensitive ()? declaringSimpleName: CharOperation.toLowerCase (declaringSimpleName); this.typeQualification = isCaseSensitive ()? typeQualification: CharOperation.toLowerCase (typeQualification);  

und

  this.declaringQualification = isCaseSensitive ()? Deklarieren der Qualität: CharOperation.toLowerCase (Deklarieren der Qualität); this.declaringSimpleName = isCaseSensitive ()? declaringSimpleName: CharOperation.toLowerCase (declaringSimpleName); this.returnQualification = isCaseSensitive ()? returnQualification: CharOperation.toLowerCase (returnQualification);  

und schlagen diese parametrisierte Abstraktion vor (keine Methode, aber ziemlich nah:

  this.declaringQualification = isCaseSensitive ()? declaringQualification: CharOperation.toLowerCase (declaringQualification); this.declaringSimpleName = isCaseSensitive ()? declaringSimpleName: CharOperation.toLowerCase (declaringSimpleName);
Dies. [[# variable5a6b82a0]] = isCaseSensitive ()? [[# variable5a6b82a0]]: CharOperation.toLowerCase ([[# variable5a6b82a0]]);  

Beachten Sie, dass der Code nur einen Parameter hat, nicht zwei .

Es werden größere Ausdrücke, sogar Anweisungen, als Parameter gefunden. Im letzteren Fall wird effektiv vorgeschlagen, dass Sie ein Lambda als Parameter benötigen.

Sie können die Größe eines Klons steuern, wie viele Parameter zulässig sind und wie ähnlich die Codeblöcke sein müssen als Klone betrachtet. In dem von OP erfundenen Beispiel in einer Datei mit den richtigen Einstellungen sollten die inneren Blöcke als Klone mit einem einzigen Parameter erkannt werden. (Niemand führt Beispiele aus, die in der Praxis so klein sind.)

(Die Site enthält viele Beispiele aus vielen Sprachen.)

This is pretty cool, I'll have to take a look at it later. By the way, please don't create new tags that don't add to the question. See the [help center](http://softwarerecs.stackexchange.com/help/privileges/create-tags)
"copy-paste-detection" is a widely known term for clone-detection tools. (I always thought "clone detection" was a fine term, but the world seems to think otherwise).


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...