Mágikus szám (programozás)

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2019. december 10-én felülvizsgált verziótól ; az ellenőrzésekhez 10 szerkesztés szükséges .

A " mágikus szám " fogalmának a programozásban három jelentése van:

Adataláírás

A mágikus szám vagy aláírás egy egész szám vagy szövegállandó , amelyet egy erőforrás vagy adat egyedi azonosítására használnak . Egy ilyen szám önmagában nem hordoz semmilyen jelentést, és zavart okozhat, ha a megfelelő kontextus vagy megjegyzés nélkül fordul elő a programkódban , míg egy másik, akár közeli értékűre történő megváltoztatási kísérlet abszolút beláthatatlan következményekkel járhat. Emiatt az ilyen számokat ironikusan mágikus számoknak nevezik . Jelenleg ez a név szilárdan beépült kifejezés . Például bármely lefordított Java nyelvosztály hexadecimális "varázsszámmal" kezdődik . A második jól ismert példa, hogy bármely .exe kiterjesztésű Microsoft Windows futtatható fájl egy bájtsorozattal kezdődik (amely megfelel az MZ ASCII karaktereknek - Mark Zbikowski  kezdőbetűinek , az MS-DOS egyik alkotójának ). Egy kevésbé ismert példa a Microsoft Visual C++ (a Microsoft Visual Studio 2005-ös verziója óta) inicializálatlan mutatója, amely hibakeresési módban a . 0xCAFEBABE0x4D5A0xDEADBEEF

UNIX-szerű operációs rendszereken a fájl típusát általában a fájl aláírása határozza meg, függetlenül a névkiterjesztéstől. Szabványos segédprogramot biztosítanak a fájl aláírásának értelmezéséhez file.

Rossz programozási gyakorlat

Ezenkívül a „varázsszámok” rossz programozási gyakorlat, ha a forrásszövegben numerikus érték szerepel, és annak jelentése nem nyilvánvaló. Például egy ilyen, Java nyelven írt részlet rossz lenne:

drawSprite ( 53 , 320 , 240 );

Aki nem írt programot, annak nehéz megérteni, hogy mi az 53, 320 vagy 240. De ha ezt a kódot átírják, minden a helyére kerül.

végső int SCREEN_WIDTH = 640 ; végső int KÉPERNYŐ_MAGASSÁG = 480 ; final int SCREEN_X_CENTER = SCREEN_WIDTH / 2 ; final int SCREEN_Y_CENTER = SCREEN_HEIGHT / 2 ; végső int SPRITE_CROSSHAIR = 53 ; ... drawSprite ( SPRITE_CROSSHAIR , SCREEN_X_CENTER , SCREEN_Y_CENTER );

Most már világos: ez a kód egy sprite -ot jelenít meg a képernyő közepén  - a célkeresztet. A legtöbb programozási nyelvben az ilyen konstansokhoz használt összes értéket a fordításkor kiszámítják, és behelyettesítik azokra a helyekre, ahol az értékeket használják ( konstans hajtás ). Ezért a forrásszöveg ilyen változtatása nem rontja a program teljesítményét.

Ezenkívül a mágikus számok potenciális hibaforrások a programban:

  • Ha ugyanazt a bűvös számot egynél többször használjuk egy programban (vagy potenciálisan használható), akkor a megváltoztatásához minden egyes előfordulást szerkeszteni kell (a megnevezett állandó értékének szerkesztése helyett). Ha nem minden előfordulást javítanak ki, legalább egy hiba lép fel.
  • Legalább egy esetben előfordulhat, hogy a mágikus szám eleinte rosszul van írva, és ezt meglehetősen nehéz észlelni.
  • A mágikus szám függhet egy implicit paramétertől vagy egy másik varázsszámtól. Ha ezek a függőségek, amelyeket kifejezetten nem azonosítottak, nem teljesülnek, legalább egy hiba lép fel.
  • Egy mágikus szám előfordulásának módosításakor lehetséges egy másik, független, de azonos numerikus értékű varázsszám hibás megváltoztatása.

Mágikus számok és többplatformos

Néha a mágikus számok bántják a platformok közötti kódot [1] . A lényeg az, hogy C -ben 32 bites és 64 bites operációs rendszerekben a char, shortés típusok mérete garantált long long, míg a int, long, size_tés mérete ptrdiff_tváltozhat (az első kettőnél a fordítófejlesztők preferenciáitól függően pl. az utolsó kettő, a célrendszer bitmélységétől függően). A régi vagy rosszul megírt kódban előfordulhatnak "bűvös számok", amelyek egy típus méretét jelzik – ha eltérő bitmélységű gépekre költözünk, ezek finom hibákhoz vezethetnek.

Például:

const size_t ELEMEK SZÁMA = 10 ; hosszú a [ NUMBER_OF_ELEMENTS ]; memset ( a , 0 , 10 * 4 ); // rossz - a long 4 bájtot feltételez, az elemek bűvös számú memsetjét használja ( a , 0 , NUMBER_OF_ELEMENTS * 4 ); // rossz - a long 4 byte -os memset ( a , 0 , NUMBER_OF_ELEMENTS * sizeof ( long )); // nem teljesen helyes - a típusnév megkettőzése (ha a típus megváltozik, itt is módosítani kell) memset ( a , 0 , NUMBER_OF_ELEMENTS * sizeof ( a [ 0 ])); // helyes, optimális a nullától eltérő méretű memkészlet dinamikus tömbjéhez ( a , 0 , sizeof ( a )); // helyes, statikus tömbökhöz optimális

Számok, amelyek nem varázslatosak

Nem kell minden számot konstanssá konvertálni. Például a Delphi kódja :

for i := 0 to Count - 1 do ...

A 0 és 1 számok jelentése világos, és nincs szükség további magyarázatra.

Lásd még

Jegyzetek

  1. 20 buktató a C++ kód 64 bites platformra történő portolásakor . Letöltve: 2008. október 31. Az eredetiből archiválva : 2010. augusztus 15..