Kemény kód

A kemény kód egy olyan szoftverfejlesztési gyakorlat, ahol a programkód maga tartalmazza az általa használt adatokat, szemben azzal, hogy a felhasználótól kapná őket vagy futás időben generálná. A bekódolt adatok tipikusan úgy módosíthatók, hogy szerkesztik a forráskódot, és lefordítják, bár maga a futtatható fájl is módosítható hexa editorokkal a memóriában vagy a lemezen.

Megfelelő használat esetén a kemény kód olyan adatokat tartalmaz, amelyek csak ritkán vagy egyáltalán nem változnak, mint például a fizikai vagy matematikai konstansok (erre tipikus példa a pi), verziószámok vagy állandó szövegelemek. Ezzel szemben a puha kódnak olyan adatokat kell magába foglalnia, amik futásidőben keletkeznek, mint a felhasználótól bekért adatok, konfigurációs fájlokból olvasott információk, HTTP szerver válaszok.

Áttekintés

szerkesztés

A kemény kód azt jelenti, hogy az adatok megváltoztatásához a forrást kell szerkeszteni. Ám erre nem szabad hagyatkozni, mivel vannak olyan adatok, amelyeket célszerű a felhasználótól bekérni. A felhasználó viszonylag ritkán szerkeszti a forrást, mert az vagy zárt, vagy nem ért hozzá, vagy pedig nincs türelme vagy túl kényelmetlennek tartja, hogy a forrást piszkálja.

A kemény kód gyakran követelmény, de gyakran antimintává válhat. Nem biztos, hogy tartozik dinamikus felhasználói interfész a programhoz, de már szeretnék kiadni a programot vagy hozzáadni a szükséges képességet. A dinamikus interfészt később írják meg, hogy a felhasználó módosítani tudja a kimenetet vagy az eredményt.

A kemény kód kifejezés arra utal, ahogyan az áramköröket bedrótozzák, illetve arra, hogy nehezebben módosítható. A futásidejű kiterjeszthető együttműködő fejlesztési környezetek mint a MUD-ok kontextusában, a kemény kód a magra utal, ami értelmezőként alacsony szintű feladatokat hajt végre és szkripteket futtat, míg a puha kód a magas szintű szkripteket, melyeket a rendszer futás időben értelmez. Ebben a helyzetben sem a lágy, sem a puha kód nem tekinthető pejoratívnak.

Biztonság

szerkesztés

Egyes országok előírják, hogy hátsóajtókat tegyenek a programokba a titkosszolgálat számára. A hátsóajtók (backdoor) bekódolására kemény kódot használnak. A konfigurációs fájlokban nem látszódnak, nehogy a felhasználók ki tudják őket kapcsolni. Nem látszódnak a parancsok kimenetén. Csak akkor lehet ezeket bezárni, ha újrafordítják őket forrásból, visszafejtik a futtatható kódot, bináris szerkesztésével vagy az integritás ellenőrzésének elkerülésével. Ezeket azonban a licenc megtilthatja.

Digitális jogvédelem

szerkesztés

A digitális jogvédelemhez ellenőrző kódot tesznek a programba, ami a lefordított példány számára egyedi. Betehetnek kulcsgenerátort is, ami létrehozza az ellenőrző kódot, hogy ne lehessen az ellenőrző kódot megtalálni és kivenni.

A másik oldalon a crackerek bekódolhatnak egy érvényes ellenőrző kódot, amit a program elfogad, vagy megoldják, hogy a program ne ellenőrizzen. Így a tört változatok hitelesítés nélkül kerülnek ki, ugyanazzal az ellenőrző kóddal.

Installációs hely

szerkesztés

Ha egy Windows alatti programot úgy terveztek, hogy mindig a C:\Program Files\Appname (ahol az Appname a program neve) könyvtárba települjön, akkor azok a felhasználók, akik szervezési vagy helyfoglalási okok miatt másik partícióra tennék, nem biztos, hogy tudják használni. Erre nem biztos, hogy fény derül a tesztelés alatt, mivel a legtöbb felhasználó úgyis ide teszi, ezért nem biztos, hogy ezt vizsgálják. Ezzel szemben antimintának tekinthető az installáció helyének rögzítése a kódban, mivel az sok tényezőtől függ, így operációs rendszer típusától, verziójától, de a rendszergazdától is. Így a Microsoft Windows sokszor a C meghajtóra van telepítve, de ez nem biztos, hogy így van.

Hasonló probléma volt a mikroprocesszorokkal a korai számítógépekben, mivel a végrehajtást mindig egy előre adott memóriacímen kezdték.

Indítólemez

szerkesztés

Egyes másolásvédett programok indításkor floppyn vagy pendrive-on keresnek egy fájlt, hogy igazolják, nem kalózmásolatok-e. Ha a program ragaszkodik a floppyhoz, akkor nem indítható egy újabb gépen, amin nincs hajlékonylemezes meghajtó. Az 1980-as és az 1990-es években a számítógépek tartalmazták ezt az egységet, ami azóta már ritkává vált az újabb adathordozók miatt.

Ez a gyakorlat példa arra, hogy miért célszerűtlen hasonló esetekben kemény kódot használni. Hasonló esetben a program 15 év múlva használhatatlanná válhat, ha nem változtatnak ezen.

Speciális könyvtárak

szerkesztés

A Windows tartalmaz speciális könyvtárakat a fájlok logikai rendszerezésére. Ez problémákat okozhat.

Felhasználói könyvtár

szerkesztés

Egyes Windows programok feltételezik, hogy a felhasználó könyvtárának elérési útja nem lehet más, mint C:\Documents and Settings\Username. Ez többnyire teljesül a Windows 2000-től kezdődően, ám problémákat okozhat, ha a felhasználó könyvtára hálózaton vagy valahol máshol van. A probléma megoldása, hogy ehelyett a program a GetUserProfileDirectory függvényt hívja vagy használja a %userprofile% környezeti változót. Egy másik, hasonló feltevés az, hogy a felhasználói könyvtár valahol a lemezen van.

Dokumentumok

szerkesztés

Egyes programozók, akik angol Windowst használnak, fixen bekódolják a dokumentumok helyét mint ProfilePath\My Documents. Azonban a lokalizált Windowsok másként nevezik ezt, magyarul Dokumentumok, olaszul Documenti. Másfelől a Windows 2000-től a My documents is elköltöztethető linkek segítségével. Ha a program csak az egyik nyelvi verzió alatt fut, akkor feltételezhetően ez okozza. Segíteni azzal lehet, ha ehelyett az SHGetFolderPath függvényt hívják.

Versenyeken

szerkesztés

Versenyeken, mint az informatikai olimpia, a feladat tartalmazza a be- és a kimenet formáit. Ha a bemenetek száma erősen korlátozott, akkor a versenyzők választhatják azt, hogy minden lehetséges bemenetre a program lefut, és választ ad. Ez kemény kódnak tekinthető, szemben az algoritmikussal, aminek kimenete szintén lehet kemény kódú program.

Általános megoldás

szerkesztés

Először is meg kell gondolni, hogy tényleg nem tesz-e fel túl sokat a program a környezetéről. Azonban bárki bármikor hibázhat, megfeledkezhet valamiről.

Ha például egy fájlra van szükség, akkor inkább a felhasználótól kell bekérni a fájl nevét, akár konzolban, akár fájlkiválasztó ablakban. Így a program független maradhat a fájl elérési útjától.

A programban közvetlenül megadott szövegek a fordítás szempontjából is problémásak. A fordítónak a program szövegét kell szerkesztenie ahhoz, hogy munkáját elvégezze. Ezen segít a gettext eszköz, ami kivonatolja a szövegeket, és kicseréli őket a megfelelő helyen. Ekkor a fordító nem ronthatja el véletlenül a program többi részét.

A mágikus számok használata szintén tekinthető kemény kódnak. Mivel jelentésük tisztázatlan, azért nem egyszerű eldönteni, hogy hol éppen melyiket használják. Ez akadályozza a program módosítását, mivel minden helyen egyenként kell dönteni, nem lehet használni a szövegszerkesztő mindet cserél funkcióját.

Fordítás

szerkesztés

Ez a szócikk részben vagy egészben a Hard coding című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.