Skip to end of metadata
Go to start of metadata

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:

  • egytől kezdjük a ciklusban a számolást
  • egyet adunk hozzá a kártyák számához
  • egyet vonunk le a kiszámolt indexből

 

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ű:

  • -2, -1, 0, 1, 2

 

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:

 

      
      
Page viewed times

2 Comments

  1. A -2 -> +2 tartományt jelöltem be, de azt még hozzátenném, hogy a sonarban lehetőség van egy hibatalálatot fals pozitívnak jelölni.
    Szóval én szeretem, ha figyelmeztet ezekre, legfeljebb bejelölöm, hogy jó az úgy és a következő build-nél már nem jelzi hibának (de csak azon az egy helyen nem). 

    1. Auth Gábor AUTHOR

      Nem arról van szó, hogy legyen kikapcsolva teljesen a 'Magic Number', hanem arról, hogy a gyakori számok esetén ne legyen felesleges false positive issue. Ha szinte mindig bejelölöd a '3'-as vagy a '16' -os számot, akkor inkább legyen fixen kivétellistán, kevesebb a munka és kevesebb a hibás false positive beállítás is... (smile)

      Arról lehetne külön vita, hogy az önkényes false positive mennyire hasznos eszköz, inkább maradjon-e nyitott issue egy másképp hatékonyan meg nem oldható körbeprogramozott probléma kapcsán vagy vállaljuk be, hogy lesznek szubjektív számok a statisztikában... (smile)