V následujícím článku se budeme zaobírat programem PMD, který je určen pro programovací jazyk Java. Jelikož je práce s analyzátory kódu prakticky ve všech případech stejná, článek může být užitečný i pro ty, kteří Javu nevyužívají.
PMD je v mnoha ohledech výjimečný. Kromě toho, že se jedná o Open Source projekt, je PMD výborně navržen (jak už bývá u programů v Javě zvykem). Umožňuje velice snadno vytvářet vlastní pravidla formou XML značek a javovských tříd, které pak mohou být přijaty do oficiální distribuce. Proto toho umí PMD již dnes (verze 1.0.3) hodně a nová a nová pravidla se týden co týden přidávají.
Pokud používáte IDE prostředí (Eclipse, Netbeans…), jistě jste si již zvykli, že vás prostředí upozorňuje na nedostatky v kódu (nemám na mysli chyby, předpokládejme, že kód lze přeložit). Pokud preferujete příkazovou řádku, určitě jste se někdy setkali s varováním překladače. Taková neinicializovaná proměnná je klasickým případem, který obvykle generuje varování.
To je právě práce pro PMD. Umí lokalizovat a upozornit na takovéto problémy, přičemž řada z nich není až tak triviální. Instalace se provádí jednoduše (viz. články Instalujeme programy v Javě), spouštění pak probíhá z příkazové řádky. PMD umí odhalit přes 200 problémů a další na sebe nenechají dlouho čekat. Zejména v různých specifických oblastech (programování J2EE, MIDP atd) je ještě mnoho volného prostoru pro další pravidla.
Výstupem PMD je prostý text, XML nebo HTML dokument. Je snadné si PMD nastavit ve vašem oblíbeném IDE jako External Tool a poté se klikáním na vzniklé chyby přesouvat okamžitě na inkriminované oblasti. Kromě toho PMD nabízí také Ant Task, takže jej můžete směle používat s Antem, a navíc se PMD dodává s pluginy pro nejpoužívanější IDE (Eclipse, Netbeans, Sun ONE, JBuilder, IDEA, Emacs, JEdit atd). Výhoda těchto pluginů je zřejmá. Nalezené problémy se obvykle objevují přímo ve zdrojovém kódu, v TODO listech nebo kompilačních oknech daného prostředí. Abychom jenom neteoretizovali, ukážeme si na příkladu, jaké chyby například umí PMD zjistit.
import java.util.ArrayList; import java.util.HashSet; // nepouzity import import java.awt.color.ICC_ColorSpace; public class Test { // prilis kratky nazev clenske promenne // promenna navic neni pouzita private int i; // nepouzita clenska promenna // navic retezce je lepe inicializovat pomoci = a " private static String bar = new String("Test"); // proc vracet implementaci misto rozhrani? public ArrayList getList() { return new ArrayList(); } public static void main(String[] pars) { // zbytecne volani toString System.out.println(bar.toString()); } // pretizime pouze equals public boolean equals(Object arg0) { try { // je vyhodnejsi pouzivat rozhrani // misto implementacni tridy HashSet hs = new HashSet(); } catch (Exception e) { // prazdny blok catch } // vyhodnejsi je return (1 == 2) if (1 == 2) { return true; } else { return false; } } } |
Ukázkový příklad plný nemotorných obratů |
Po prozkoumání kódu PMD seřadí vzniklé problémy podle priorit a vrátí výsledek. V tomto případě je to snad desítka různých varování a doporučení. Vidíte, a přesto se program přeloží. Inu, i takhle lze programovat. Na obrázku vidíte IDE Eclipse (viz. článek Eclipse – IDE na všechno) s pluginem PMD v akci.
Skvělé je to, že díky kompilátoru JavaCC, který PMD používá, je přidání nového pravidla hračkou. Můžeme se tak těšit na sadu pravidel pro J2EE, které nás třeba upozorní na vytvoření třídy Socket v Enterprise JavaBeansu a podobně. Za zmínku stojí také to, že díky technologii XML byl PMD snadno integrován do automatického sestavovacího frameworku Maven, který např. používá většina projektů na Apache.org. Maven umožňuje pomocí Antu udělat CVS checkout, provést kompilaci, vytvořit API dokumentaci, generovat statické stránky nápověd a tutoriálů, spustit JUnit testy a code measuring programy, také provést kontrolu kódu pomocí PMD (!), vytvořit distribuční balíčky s binárkami a zdrojovými kódy (tzv. snapshots) a dělat jiné plně konfigurovatelné úkony.
Dnešní moderní integrovaná prostředí nabízejí mnoho a obvykle mají již nějakou statickou analýzu kódu implementovánu. Ve většině případů se však rozsah rozpoznaných problémů nemůže rovnat se specializovanými programy tohoto typu, jakým je například PMD.