Ich habe kürzlich ein Projekt mit einer großen Codebasis ausgewählt, das viele Duplikate enthält. Das Problem besteht darin, dass die duplizierte Funktionalität nicht von denselben Personen geschrieben oder zwischen ihnen kopiert wurde.
Gibt es also Werkzeuge, mit denen ich die tatsächliche Logik zweier Funktionen vergleichen kann? Hier sind einige Einschränkungen, die nützlich wären.
Idealerweise würde das Werkzeug eine einzige Funktionsausgabe erzeugen. Die tatsächlichen logischen Unterschiede würden in gewisser Weise hervorgehoben werden. Es kann sogar in einer Form sein, die separate Funktionen für die Unterschiede in der Logik definiert und sie in die Hauptfunktion übergibt, die die identische Logik enthält.
Das hört sich nach einer großen Aufgabe an, aber hat jemand Werkzeuge gefunden, die versuchen, eines dieser Dinge zu tun?
Bearbeiten
Obwohl einige coole Tools erwähnt werden, sieht es nicht so aus, als ob einer von ihnen den Inhalt der aufgerufenen Funktionen berücksichtigt, wenn er die Logik zweier Methoden vergleicht. Wenn ich falsch bin, lass es mich wissen!
Wenn Sie ReSharper haben, gibt es ein ReSharper-Plug-In Agent Ralf .
Zitat von Agent Ralf's Homepage:
In einigen Fällen können zwei gegebene Methoden funktional gleichwertig sein (gleiche Eingaben produzieren dieselben Ausgaben und Nebenwirkungen), aber nicht textgleich. Zum Beispiel können sich zwei Methoden nur in der Benennung lokaler Variablen unterscheiden und sind ansonsten identisch. Agent Ralph kann diese und andere Situationen erkennen und feststellen, dass die Methoden funktional äquivalent sind.
Auf CodeRush gibt es eine Funktion zur doppelten Erkennung und Konsolidierung. (http://devexxpress.com/Products/Visual_Studio_Add-in/Coding_Assistance/duplicate_code.xml)
Diese Funktion hat doppelten Code erkannt. Ich bin mir nicht sicher, ob es Logik ähnlicher Funktionen erkennen / vergleichen kann.
Hoffe diese Hilfe.
Sie können immer Ihre eigenen codieren. Dies gehört zu den richtigen Unit-Tests.
WENN Ihre ähnlichen Funktionen eine Zustandsinstanz / -klasse modifizieren, dann verwenden Sie reflection, um zu testen, ob die Eigenschaftswerte der resultierenden Klassen gleich sind.
WENN Ihre ähnlichen Funktionen eine Datenbank modifizieren, DANN machen Sie eine Kopie der Datenbank, um jede Funktion auf einer Kopie auszuführen und zu vergleichen.
Aber wahrscheinlich beginnt alles mit richtigen Komponententests. Wenn Sie alle möglichen "Anwendungsfälle" kennen, können Sie, wenn Sie feststellen, dass die Ausgabe von zwei (oder mehr) Funktionen für alle diese "Anwendungsfälle" gleich ist, eine Funktion beibehalten und die Wiederholungen als unnötig wegwerfen / p>
Eine andere Option besteht darin, tatsächliche Anforderungen für das, was der Code / die Funktionen tun, zu erhalten. Wenn Sie lernen, was Ihr System tatsächlich zu erreichen versucht, wird alter oder repetitiver Code viel einfacher refactoring.
Die Werkzeuge, die nach logischer Duplizierung suchen, bringen Sie nur soweit Sie bereit sind zu arbeiten. Wenn Sie sagen, dass die aktuellen Tools geschachtelte Funktionen oder Funktionen, die andere Funktionen aufrufen, nicht berücksichtigen, warum sollte der Code nicht so umgestaltet werden, dass er diese aufgerufenen Funktionen in eine Linie bringt, damit Ihr Tool funktioniert? Sie suchen nur nach einem Allheilmittel, wenn Sie Methode A (die die Methoden B, C, D aufruft) nicht einmal in die Methode AA umformulieren wollen, die den Code von B, C, D einbindet.
KURZ Mit etwas "Arbeit" können Sie die aktuellen Tools für sich arbeiten lassen. Sie möchten möglicherweise zu den Open-Source-Tools beitragen, um die von Ihnen genannten Fehler zu kompensieren.
Tags und Links c# static-analysis