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.)