Den Code elegant zu halten und keine Code-Klone zu erzeugen, während man eine umfangreiche Rails-Anwendung aufbaut, kann eine große Herausforderung sein, auch für einen versierten Entwickler. Glücklicherweise gibt es einen Edelstein, der dieses Code-Refactoring viel einfacher macht. Für viele Menschen wird sich nach einiger Zeit toter/verschwendeter Code entwickeln. Für den Fall, dass Sie Ihren Code wartbar und optimiert halten müssen, werfen Sie einen Blick auf ein Gem, das diese Aufgabe für mich erledigt hat.
Flay prüft den Code auf strukturelle Ähnlichkeiten. Unterschiede in literalen Werten, Variablen-, Klassen- und Methodennamen, Whitespace, Programmierstil, geschweiften Klammern vs. do/end, props vs. do/end und so weiter werden alle übersehen, was das Programm absolut genial macht. Es ist in der Lage, sowohl korrekte als auch enge Übereinstimmungen zu erkennen, und entdeckt mit Sicherheit einige Stellen in Active Record, an denen sich Muster wiederholen. In seinem jetzigen Zustand ist die Ausgabe von Flay sehr primitiv: eine Liste von sich wiederholenden Code-Knoten, zusammen mit einer Gewichtung, nach der man sie einstufen kann, sowie Zeilennummern und Dateinamen, in denen der wiederholte Code vorkommt. Code, den Flay als vergleichend ausgibt, ist eine gute Möglichkeit für das Refactoring.
Befehl zur Installation
sudo gem install flay
Befehl zur Anzeige der Ausgabe
Cd "Pfad zu Ihrem Projektordner"
flay "Pfad des Ordners"
Beispiel: flay ./app/controllers - Identifiziert die Code-Duplikation in allen Controllern.
flay ./app - Identifiziert die Code-Duplikation im gesamten Projekt
flay ./app/controllers/example_controler.rb - Identifiziert die Code-Duplikation im angegebenen Controller.
Beispiel für eine Ausgabe
Es wird eine Ausgabe des Codes der duplizierten Bereiche wie folgt generiert:
sridevi@carmatec-MS-7788$ flay ./app/models/*.rb
Gesamtpunktzahl (niedriger ist besser) = 1666
1) Ähnlicher Code gefunden in :call (Masse = 170)
./app/models/example.rb:8
./app/models/example.rb:9
./app/models/example.rb:10
./app/models/example.rb:11
./app/models/example.rb:15
./app/models/example.rb:17
./app/models/example.rb:19
./app/models/example.rb:20
./app/models/example.rb:22
./app/models/example.rb:23
2) Ähnlicher Code findet sich in :defs (Masse = 154)
./app/models/example.rb:260
./app/models/result.rb:195
3) Ähnlicher Code gefunden in :defs (Masse = 138)
./app/models/feedback.rb:62
./app/models/example.rb:54
./app/models/result.rb:51
4) Ähnlicher Code gefunden in :call (Masse = 136)
./app/models/example.rb:12
./app/models/example.rb:13
./app/models/example.rb:14
./app/models/example.rb:16
./app/models/example.rb:18
./app/models/example.rb:21
./app/models/example.rb:24
./app/models/example.rb:25
5) IDENTISCHER Code gefunden in :defn (Masse*2 = 128)
./app/models/result.rb:7
./app/models/summary_report.rb:7
6) IDENTISCHER Code gefunden in :defn (masse*2 = 120)
./app/models/example.rb:17
./app/models/example.rb:23
Die Gesamtpunktzahl der App von 1666 (der Ratschlag "niedriger ist besser" gilt) kann in ihren einzelnen Komponenten betrachtet werden, die die Bereiche mit dem besten Preis-Leistungs-Verhältnis zeigen. Für erfahrene Entwickler, die allein oder in einem kleinen Team arbeiten, ist Flay möglicherweise unnötig. Bei größeren Projekten (wie dem, bei dem ich es eingesetzt habe) oder solchen mit Anfängern oder fortgeschrittenen Programmierern kann es jedoch dazu beitragen, die Wartbarkeit Ihrer Codebasis zu verbessern.
Im Folgenden finden Sie eine bildliche Darstellung, wie Sie den Code in einer Rails-App refaktorisieren können. Zum Beispiel, wenn der gleiche Code in vielen Controllern duplizieren halten Sie es in ApplicationController und rufen Sie die Methode durch die Verwendung von Filtern.