På temat ”Mitt bästa kodanalysverktyg” (Tack Per!) vill jag gärna slå ett slag för trotjänaren Simian – (Similarity Analyzer). Simian löser en enda uppgift: Hitta dupliceringar i koden.

Generellt tycker jag att man skall använda automatiserad kodanalys så mycket och ofta man bara kan, och verktyg som t.ex. Checkstyle, PMD, och FindBugs gör livet bra mycket lättare för oss utvecklare. Men om jag bara fick använda ett kodanalysverktyg så skulle det bli Simian.
Varför? För att jag anser att sambandet mellan en bra/snygg design och ett lågt antal dupliceringar är extremt starkt. Duplicering är roten till allt ont :-)

Som alla vet är det ofta väldigt lockande – på kort sikt – att syssla med copypaste-programmering. Man kan snabbt smacka upp en lätt modifierad variant av en befintlig funktionalitet utan att riskera att ändra/förstöra något som funkar. Men förr eller senare (oftast förr) får man betala mångdubbelt för den tekniska skulden man har infört:

* Koden blir mer komplex.
* Kodbasen blir större och svår att överblicka.
* Samma bugg kan finnas på flera ställen.
* Man uppfinner hjulet om och om igen för att det blir svårt att hitta/veta vad som redan är byggt.
* osv., osv.

Ett verktyg som varnar när man överstiger ett visst antal dupliceringar i koden kan förhindra att den tekniska skulden ökar exponentiellt. Så där finns många sköna timmar och kronor att spara.

Det finns också en Simian-plugin för Checkstyle, så det är mycket smidigt att koppla på Simian på ett befintligt antskript med Checkstyle.

Några pros and cons om Simian:

+ Smart. Ignorerar whitespace/kommentarer m.m. (konfigurerbart).
+ Lätt att automatisera via plugin eller command-line.
+ Imponerande prestanda, även för stora kodbaser.
+ Kan jobba med flera språk, inte bara Java.

- Inte gratis för kommersiellt bruk (men fullversion är tillgänglig).
- Closed source. Osäker framtid?
- Kunde vara ännu smartare. Jag har ännu inte hittat ett verktyg som är riktigt bra på att hitta duplicerad logik (utöver duplicerade LOC).

(PMD har f.ö. sin egen dupliceringsjägare: CPD, men den har jag inte testat. Verkar bra dock! Någon som har erfarenhet av CPD?)