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

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

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

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

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

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

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

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

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

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

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

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.