2016-08-05 14 views
0

Ich habe eine aufgeblähte JDialog-Klasse (~ 2000 Zeilen), die zwei nicht verwandte JTables anzeigt. Ich möchte es in drei Klassen aufteilen (JDialog, Jtable1 und JTable2). Ich kann untersuchen, welche Variablen und welche Methoden von jeder Tabelle verwendet werden und sie in relevante Klassen verschieben, aber dieses manuelle Refactoring wird mühsam.Trennung von Code in verschiedene Klassen [Java]

Gibt es eine Möglichkeit, ein solches Refactoring zu automatisieren?


Um dies zu erreichen, sollte ein Skript einen Akkumulator von Token haben. Das erste Token ist zum Beispiel jTable2 von panel.add (jTable2). Überprüfen Sie nun alle Zeilen, in denen jTable2 enthalten ist, und fügen Sie Token zum Akkumulator hinzu. Wiederholen Sie die Suche nach relevanten Tokens, bis keine neuen Token mehr gefunden werden. Suchen Sie nun für jedes Token nach Zeilen, die es enthalten. Erweitern Sie die Auswahl um Klammern.

Es ist kaum zu glauben, dass Programmierer der wohl größten Sprache noch kein solches Werkzeug entwickelt haben. Dies sollte dem Usage-Tool in IDE sehr ähnlich sein.

+0

"Wahrscheinlich größte Sprache" - Ich dachte, das war eine gute Frage, bis ich diesen Zusatz gelesen habe. Ich glaube nicht, dass Sie verstehen, wie Refactoring durchgeführt wird. Wie viele der anderen Sprachen haben so etwas getan? Meine Vermutung ist "keine". – duffymo

Antwort

1

In NetBeans können Sie Refactor-> move verwenden. Es startet einen Assistenten, der relevante Methoden bequem anzeigt. Sie müssen sie auswählen, die Sie verschieben möchten, aber Sie müssen nicht im Code suchen. Andere IDEs haben ähnliche Funktionen.

Auf diese Weise müssen Sie immer noch nachdenken, aber der langweilige Teil der Suche wird von IDE erledigt.

+0

Das ist, was ich gesucht habe. Denken macht Spaß, das Extrahieren aller möglicherweise relevanten Codezeilen ist nicht möglich.Gut zu wissen, dass Refactor -> Move ist das schlau. – sixtytrees

+0

"Andere IDEs haben ähnliche Funktionen" - einschließlich IntelliJ. Es gibt nichts automatisches. – duffymo

6

Automatisch? Nein, Gott sei Dank. Refactoring erfordert Gedanken. Tiefes Lernen ist noch nicht da.

Die meisten IDEs (z. B. IntelliJ von JetBrains, die beste IDE auf dem Markt) haben eine ausgezeichnete Refactoring-Unterstützung.

Aber es wird nicht für Sie denken.

Ein Ratschlag: Sie haben mehr Glück, wenn Sie Komponententests haben, tun Sie es in kleinen inkrementellen Bissen, und verwenden Sie ein Versionskontrollsystem. Schreiben Sie einen Test, nehmen Sie eine Änderung vor, zeigen Sie, dass der Test noch besteht, bestätigen Sie die Änderung, wiederholen Sie.

Sie können jederzeit zur letzten funktionierenden Version zurückkehren. Sie werden kein größeres Durcheinander als ein einzelner inkrementeller Schritt machen.

Ich denke, dass Sie noch besser machen können: schauen Sie sich auch die Zuhörer und den Code aus der Benutzeroberfläche heraus. Swing-Apps enden mit großen Klassen, weil die Leute lernen, alles in die UI-Klassen zu stopfen. Wenn Sie es zerlegen, werden Sie feststellen, dass der Code leichter zu lesen, modularer und leichter zu testen ist.

+0

Ich benutze Mercurial. – sixtytrees

+0

Ausgezeichnete Wahl. Ich bin mir sicher, dass es dir gut geht. – duffymo

0

Werfen Sie einen Blick auf diesen Beitrag (How to refactor thousands of lines of Java code? Is there any tool available?), der eine ähnliche Frage stellt.

Grundsätzlich gibt es einige Produktionsqualitätswerkzeuge, die Ihnen helfen, Klassen zu extrahieren, sobald Sie wissen, was Sie in die Klassen einfügen möchten. Bemerkenswert ist, dass IntelliJs IDEA ein gutes Refactoring der "Extraktklasse" hat.

Der schwierigere Teil ist das Bestimmen, was in diese Klassen gehen soll. AFAIK, dafür gibt es nur Forschungswerkzeuge.