Aki használ Sonar-t (illetve mostanában már SonarQube a neve, mert lett egy támogatott és egy közösségi kiadás belőle), annak ismerős lehet a magas számosságú Magic number (jobban mondva Unnamed numerical constants) bejegyzés, mint Minor súlyosságú hiba. A Magic number – mint programozástechnikai hiba – elismert és létező jelenség, az alábbi (a Wikipedia linkről idézett) kódrészletben az 52 és az 53 tipikusan ilyen szám:
for i from 1 to 52 j := i + randomInt(53 - i) - 1 a.swapEntries(i, j) |
Logikus kicserélni arra egy változóra, amely megmagyarázza az értelmét:
constant int deckSize := 52 for i from 1 to deckSize j := i + randomInt(deckSize + 1 - i) - 1 a.swapEntries(i, j) |
Ettől egy kicsit javult a programunk olvashatósága és könnyebb érhetősége, de még maradt egy szám, amelyet nem magyaráztunk meg, az 1, amelynek ráadásul több értelmezése is van:
Nyilvánvaló, hogy ha kicserélnénk ezt a számot három különböző konstansra, akkor a könnyen olvasható és és érthető programunkból olvashatatlan és érthetetlen program lesz:
constant int deckSize := 52 constant int deckStart := 1 constant int deckOffset := 1 constant int randomOffset := 1 for i from deckStart to deckSize j := i + randomInt(deckSize + deckOffset - i) - randomOffset a.swapEntries(i, j) |
Ebből kifolyólag a Magic number ellenőrzésekor létezik egy kivétellista, amely ezeket a gyakori – és általában nem változtatott – számokat tartalmazza; SonarQube esetén ez öt elemű:
Ezzel sikerült átesni a ló másik oldalára, több száz Magic number hiba keletkezik a projektekben, amelyeknek a bűne alapvetően az, hogy a használt konstans például 3 vagy 4. Ha kicsit körülnézünk, akkor láthatunk több nagyobb projektet, ahol ezt a listát kibővítették azokkal a konstansokkal, amelyek gyakran előfordulnak és a hibák kijavítása többet ront a programon, például:
Mit gondoltok, melyik a követendőbb? |