Checkstyle to potężna biblioteka, która nie tylko pozwala ustandaryzować formatowanie kodu w projekcie, ale także wyłapać niektóre błędy w programie (np. czy implementując metodę equals zaimplementowano także metodę hashcode) oraz design kodu (np. maksymalny rozmiar metod lub złożoność cyklomatyczną).
To, iż narzędzia statycznej analizy kodu są niezwykle przydatne, traktuję jako pewnik. Warto ich używać, choćby jeżeli czasem uprzykrzą nieco życie. Ostatecznie z ich pomocą kod aplikacji jest lepszy. Zauważyłem też, iż wiele osób lepiej przyjmuje feedback na temat formatowania kodu od maszyny niż od innej osoby, a ewentualna złość skierowana jest w stronę komputera.
Własne reguły
Okazuje się, iż do checkstyle całkiem łatwo dodać własne reguły. Mam tu na myśli napisanie własnego checka i użycie go we własnym projekcie. Dodanie checka do głównej biblioteki to zupełnie inna bajka. Od zgłoszenia pomysłu i przedstawienia PoC do merge mogą minąć lata!
Checkstyle w moim projekcie
W projekcie nad którym pracuję, często (kilka razy w miesiącu) zdarzało się, iż naruszana była reguła formatowania parametrów metody – parametry w jednej linii lub każdy w osobnej linii. Kod wyglądał mniej więcej tak:
public int fun(int a, int b, int c) { ... }Po kilku razach, gdy wspomniałem o tym przy okazji code review, postanowiłem ustawić odpowiednią regułę w checkstyle. Niestety, okazało się, iż nie ma takiej reguły. Od przeszukania internetu, poprzez issue na github doszedłem do własnej biblioteki.
Własna biblioteka z regułami
Biblioteka na dzisiaj zawiera cztery checki związane z parametrami metod i konstruktorów zarówno w ich deklaracji jaki i przy wywołaniu. Użycie jest proste, wystarczy dodać bibliotekę jako zależność do pluginu. Poniżej przykład dla gradle kts:
plugins { java checkstyle } dependencies { checkstyle("pl.tfij:check-tfij-style:1.2.1") }Następnie dodać checki do konfiguracji checkstyle:
<module name="MethodParameterAlignment"/> <module name="MethodParameterLines"/> <module name="MethodCallParameterAlignment"/> <module name="MethodCallParameterLines"> <property name="ignoreMethods" value="Map.of"/> </module>Błędy w formatowaniu, takie jak wspomniane wyżej, wyłapywane są na etapie budowania projektu i nie muszę już o nich wspominać przy code review.
Więcej szczegółów na github: https://github.com/tfij/check-tfij-style
Przekaz na dziś
Używaj statycznej analizy kodu. Liczę też, iż checki z mojej biblioteki okażą się dla ciebie przydatne.