Überarbeitetes GUI-Tool, das 2016 mit Java8 + JavaFX erstellt wurde
Inhalt
- Schreiben Sie vor 4 Jahren ab dem 4. Mai 2020 eine Geschichte über die Überarbeitung eines GUI-Tools, das ich als Student zu dieser Zeit als Hobby entwickelt habe.
- Klicken Sie hier für das überarbeitete Repository
- https://github.com/jiro4989/TKoolFacetileMaker2
Hintergrund
- Ein Tool namens TKoolFacetileMaker2 wurde im Juli 2016 im inoffiziellen Forum von RPG Tsukuru veröffentlicht
- https://github.com/jiro4989/TKoolFacetileMaker2
- Ich erinnere mich, als Java 8 noch neu war, als ich es erstellte.

- Vier Jahre später ist Java nun 14 Jahre alt.
- Ich habe bei der Arbeit aufgehört, Java zu schreiben, und mich mehr für Nim und Go interessiert
- Die Ergebniswartung wurde praktisch vernachlässigt
- Ich weiß aus E-Mail-Benachrichtigungen, dass einige Leute es nach 4 Jahren immer noch verwenden.
- Es besteht keine Verpflichtung zur Wartung, aber als Techniker bin ich immer weniger bereit, alte Dinge so zu belassen, wie sie sind.
- Es ist keine gute Idee mehr, Benutzer Java 8 installieren zu lassen
- Ich würde dieses Werkzeug selten verwenden, aber ich habe beschlossen, mein Gewicht zu heben und es beizubehalten.
Probleme hatte ich
- Ich war noch Student, als ich dieses Tool erstellt habe, daher hatte ich viele Probleme, es zu erstellen.
- Zum Beispiel
- Ich baue mit einem alten Build-Tool namens ant
- Paket- und Klassennamenskonventionen sind nicht definiert und in Java-Projekten nicht üblich
- Die umgekehrte Domäne des Paketnamens ist in Java üblich
- Es ist seltsam, dass es nicht passiert
- Nicht im MVC-Stil, die Logik ist überall verstreut
- Die Logik kann in der Controller-Klasse stecken bleiben oder nicht
- Verdammt, um es gelinde auszudrücken
- Die Projektstruktur ist nicht die allgemeine Struktur eines Java-Projekts und kann nicht in IntelliJ importiert werden.
- Es gibt kein "src / main / java"
Ressourcen
existiert mit dem Quellcode
- Kein Testcode
- ** Einige Codes abhängiger Bibliotheken bleiben nicht übrig und können gar nicht erst erstellt werden **
- Es hängt von meiner eigenen Oleore-Bibliothek ab, aber der Quellcode der Oleore-Bibliothek bleibt nicht erhalten
- Ich weiß nicht, wie ich bauen soll, da keine Build-Schritte mehr vorhanden sind
- Ich weiß nicht, wie ich bauen soll, weil die abhängige Bibliothek fehlt und ich nicht weiß, wie ich sie bekommen soll.
- Ich war frustriert, als ich 2018 versuchte, mich umzugestalten
- Ich habe versucht, es nach Kotlin zu portieren, während ich es auf Gradle verschoben habe, und es war schwierig
- Beim Upgrade von Oracle Java 8 auf Open JDK 11 ändert sich die Erstellungsmethode, da Java FX vom JDK getrennt ist.
- Aus verschiedenen Gründen frustriert
- Zwei Jahre später wurde aufgrund verschiedener Studien beschlossen, die Wartung mit Java zu überarbeiten und fortzusetzen.
Problemzerlegung
- Wir haben uns entschlossen, die oben genannten Probleme zu lösen und sie einzeln zu beseitigen.
- In GitHub-Problemen wurden Probleme und Aufgaben geklärt.)
- Wenn Sie versuchen, alles auf einmal zu tun, werden Sie sterben
- Ich werde es später tun, also werde ich es jetzt nicht tun
- issues
- Mit Gradle bauen lassen
- Manuelle Erstellung ist zunächst in Ordnung
- Mit CI erstellen lassen
- Machen Sie es bereit zum Erstellen / Freigeben
- Code-Format
- Folgen Sie dem Google-Codierungsstil
- Java aktualisieren
- Von Java 8 bis Java 14
- Refactor
- Angenommen, Testcode geschrieben
- Machen Sie es MVC
- Mit CI automatisch testen
- Testcode pflegen
- Dokumentenpflege
- Schreiben Sie eine Entwicklerdokumentation (für sich selbst)
Was war wichtig?
- Wie auch immer, "Aufrechterhaltung eines baubaren Zustands" hat höchste Priorität
- Beginnen Sie nach der Vorbereitung des automatischen Builds mit CI
- Stirb, wenn du es nicht früh kaputt findest
- Führen Sie keine Release-Erstellung auf einem lokalen PC durch
- Entwicklungsumgebung kann sich ändern
- Wenn Sie in einer CI-Umgebung erstellen und freigeben können, können Sie diese jederzeit freigeben
- Alles kann an eine andere Person übergeben werden
- Implementiert unter der Annahme, dass es automatisch mit CI getestet wird
- Separate Benutzeroberfläche und Logik
- Lassen Sie nur den logischen Teil testen
- Logikmodellierung
Was ich getan habe / was ich konnte
Endlich meinen Wunsch am 11. Mai 2020 erfüllt
Funktioniert jetzt mit benutzerdefiniertem JRE
- Da es mit einer benutzerdefinierten JRE verteilt wird, muss die JRE nicht mehr im Voraus auf dem Benutzer-PC installiert werden.
- Doppelklicken Sie auf das beiliegende Startskript, um die GUI zu starten
- Ich war beeindruckt, als ich es in einer Umgebung startete, in der Java nicht installiert war ...
- Die Dateigröße beträgt jetzt ca. 50 MB
- Es ist ziemlich groß, aber unvermeidlich
Automatische Erstellung und Freigabe mit CI
- Binärdateien werden veröffentlicht, wenn der Release-Entwurf auf GitHub Actions veröffentlicht wird
- https://github.com/jiro4989/TKoolFacetileMaker2/releases

Automatisches Format
Vor dem Erstellen mit [google-java-format-gradle-plugin] in das Format geändert (https://github.com/sherter/google-java-format-gradle-plugin)
Visualisierung der Testabdeckung
- Aktiviert, um Testabdeckung mit dem Gradle-Plug-In namens [Jacoco] zu erhalten (https://github.com/jacoco/jacoco)
- Visualisierte Testabdeckung mit CodeCov
- Die Testabdeckungsrate von Logikteilen wie Modell wurde auf 90% oder mehr erhöht.
- https://codecov.io/gh/jiro4989/TKoolFacetileMaker2

- Ich habe aufgegeben, weil es schwierig schien, den UI-Teil zu testen
Code-Diät
- Die Anzahl der Codezeilen wurde stark reduziert, da die als unnötig erachteten Funktionen vollständig gelöscht wurden.
- Nutzen Sie die ursprüngliche Eigenschaftsbindungsfunktion von JavaFX voll aus
- Jetzt müssen Sie den Wert nicht mehr einstellen
Vor dem Refactoring
$ find src/ -name '*.java' | xargs wc -l
31 src/application/fileList/FileListHBox.java
189 src/application/fileList/FileListHBoxController.java
31 src/application/imageViewer/ImageViewerBorderPane.java
288 src/application/imageViewer/ImageViewerBorderPaneController.java
92 src/application/Main.java
471 src/application/MainController.java
44 src/application/options/Numberings.java
104 src/application/options/Options.java
40 src/application/options/OptionsStage.java
165 src/application/options/OptionsStageController.java
69 src/application/options/Separators.java
36 src/application/outputViewer/MyButton.java
122 src/application/outputViewer/MyImageView.java
33 src/application/outputViewer/OutputViewerAnchorPane.java
130 src/application/outputViewer/OutputViewerAnchorPaneController.java
25 src/application/TKoolVersion.java
29 src/application/version/VersionStage.java
42 src/application/version/VersionStageController.java
1941 total
Nach Fertigstellung
- Die Anzahl der Testfälle beträgt jetzt 90
# main
$ find src/main/java/ -name '*.java' | xargs wc -l
8 src/main/java/com/jiro4989/tkfm/data/CropSize.java
42 src/main/java/com/jiro4989/tkfm/data/Position.java
38 src/main/java/com/jiro4989/tkfm/data/Rectangle.java
67 src/main/java/com/jiro4989/tkfm/Main.java
422 src/main/java/com/jiro4989/tkfm/MainController.java
235 src/main/java/com/jiro4989/tkfm/model/CroppingImageModel.java
21 src/main/java/com/jiro4989/tkfm/model/ImageFileModel.java
52 src/main/java/com/jiro4989/tkfm/model/ImageFilesModel.java
211 src/main/java/com/jiro4989/tkfm/model/PropertiesModel.java
133 src/main/java/com/jiro4989/tkfm/model/TileImageModel.java
15 src/main/java/com/jiro4989/tkfm/util/ImageUtil.java
6 src/main/java/com/jiro4989/tkfm/Version.java
1250 total
# test
$ find src/test -name '*.java' | xargs wc -l
13 src/test/java/com/jiro4989/tkfm/data/CropSizeTest.java
29 src/test/java/com/jiro4989/tkfm/data/PositionTest.java
26 src/test/java/com/jiro4989/tkfm/data/RectangleTest.java
212 src/test/java/com/jiro4989/tkfm/model/CroppingImageModelTest.java
28 src/test/java/com/jiro4989/tkfm/model/ImageFileModelTest.java
64 src/test/java/com/jiro4989/tkfm/model/ImageFilesModelTest.java
143 src/test/java/com/jiro4989/tkfm/model/PropertiesModelTest.java
120 src/test/java/com/jiro4989/tkfm/model/TileImageModelTest.java
43 src/test/java/com/jiro4989/tkfm/util/ImageUtilTest.java
13 src/test/java/com/jiro4989/tkfm/VersionTest.java
691 total
Wartung des Testcodes
- Wie oben erwähnt, wurde die Testabdeckung des Logikteils auf 90% oder mehr erhöht.
- Einführung des Plugins TestFX zum Testen von JavaFX
- In der CI-Umgebung gibt es keine ANZEIGE, daher ist der Test Moos
- Vermeiden Sie mit dem Befehl "xvfb-run"
- Verwenden von JUnit 5
- Go schreibt einen tabellengesteuerten Test, also habe ich einen ähnlichen Test geschrieben
- Praktischer parametrisierter Test für Junit 5
Zeit genommen
- Es dauerte 66 Stunden einschließlich Entwurfszeit
- Ich hatte nicht erwartet, dass ein 2000-Zeilen-Programm höchstens 66 Stunden dauern würde ...
- Alle GW sind verschwunden + Ich habe es getan, auch nachdem GW vorbei war

Eine schwere Zeit haben
Ich bin nicht dumm, unter den Werkzeugen zu leiden, die ich gemacht habe (lächerlich)
gradle
- Ich hatte noch nie einen Gradle geschrieben
- Ich musste verstehen, wie man schreibt und das Konzept
- Ich habe Maven geschrieben, also war Maven in Ordnung, aber ich mag die Skriptsprache, also habe ich Gradle gewählt.
JavaFX-Trennungsproblem (jmods)
- JavaFX wurde in das JDK aufgenommen, als Oracle Java 8 verwendet wurde.
- Sie müssen OpenJDK verwenden, um in Java mit Java 9 oder höher kostenlos zu entwickeln
- OpenJDK enthält auch kein JavaFX im JDK
- Modulmechanismus muss mit JavaFX SDK und JavaFX JMODS verwendet werden
- Schwer zu verstehende Modulfunktionen, die zum Zeitpunkt des Schreibens in Java 8 noch nicht vorhanden waren
Benutzerdefinierte JRE
- Die Art der Installation und Ausführung von JRE auf einem PC ist alt
- Der Stil, der JRE für jede Anwendung enthält, wird in Zukunft häufiger verwendet
- Erstellen Sie eine benutzerdefinierte JRE, die nur die für die Arbeit erforderliche Mindestlaufzeit enthält, und verteilen Sie sie mit Ihrer Anwendung
- Verwenden Sie ein Tool namens jlink
- Musste in Verbindung mit den oben genannten Modulen gelernt werden
Ich habe keinen Quellcode für meine Bibliothek
- Ich habe die Klassendatei aus der ausführbaren JAR, die ich verteilt hatte, herausgezogen, mit jad dekompiliert und aus dem generierten Code wiederhergestellt.
- Der Tag wird kommen, an dem Sie Ihre Distribution dekompilieren werden ...
Impressionen
Ich bin froh, dass ich es getan habe
- Funktionell eher verringert als erhöht
- Die Wartbarkeit hat sich jedoch verbessert
- Automatische Tests sind jetzt möglich
- Jetzt jederzeit zur Veröffentlichung verfügbar
- Befreit vom Fluch, weiterhin Java 8 verwenden zu müssen
- Ich bin froh, dass ich Java14 gemacht habe
Reflexion vor 4 Jahren
- Implementieren Sie keine nicht verwendeten Funktionen
- Nicht gut, nur erhöhte Wartungskosten
- Vermeiden Sie eine enge Kopplung von Benutzeroberfläche und Logik
- Es ist nicht gut, dass Sie nicht testen können, ohne den Bildschirm manuell zu manipulieren
- Hemmt die Testautomatisierung
- Testcode schreiben
- Das korrekte Verhalten bleibt im Code
- Beachten Sie das Verhalten, das nicht berücksichtigt wurde
- Implementierung der Prämisse, einen Test zu schreiben
- Verbessert die Qualität
- Erhalten Sie Testabdeckung
- Durch Visualisierung mit CodeCov konnte ich einen nicht getesteten Zweig finden
- Erstellen Sie eine automatisierte Testumgebung
- Dieses Mal habe ich mit [GitHub Actions] eine automatische Build / Test-Umgebung erstellt, aber die Antwort war korrekt.
- Beachten Sie sofort, dass sich das Verhalten geändert hat
- Je früher Sie eine automatisierte Testumgebung erstellen, desto effektiver ist diese
- Erstellen Sie eine automatische Release-Umgebung
- Vergiss das Erstellen / Freigeben
- Die Umgebung, die freigegeben werden kann, ändert sich
- Änderungen am Host-PC auf Betriebssystemebene
- Wenn Sie nur auf dem Host-PC erstellen, besteht möglicherweise eine "unbewusste Abhängigkeit".
- Diesmal ist die "Oreore-Bibliothek ohne Quellcode" genau das.
- Ich konnte damals bauen, aber jetzt kann ich nicht
- Abhängigkeiten werden immer irgendwo codiert, wenn sie in einer CI-Umgebung freigegeben werden können
- Sollte auf der CI-Umgebung basieren, damit jeder jederzeit erstellen / freigeben kann
- Meine Implementierung vor vier Jahren war verdammt
- Müll
- Trottel
- Ja
von jetzt an
- Es gibt einige andere mit JavaFX erstellte Tools als dieses Tool, daher möchte ich das gleiche Refactoring durchführen.
- (Da es nur wenige Benutzer gibt, ist es nur Selbstzufriedenheit)
Zusammenfassung
- Lassen Sie uns von Anfang an richtig gestalten
- Lassen Sie uns den Test richtig schreiben
- Lassen Sie uns automatisieren
- Befolgen Sie den De-facto-Standard
Wenn ich das von Anfang an getan hätte, hätte ich kein so schmerzhaftes Gefühl gehabt ...
das ist alles