2009.X.16

Gyomlálás


Van egy furcsa dolog az informatikában: a forráskód idővel elgyomosodik. Erre a jelenségre van ugyan magyarázat, de a magyarázat egyrészt bonyolult, másrészt nem segít a gyomosodást megakadályozni. Gyomosodás egyszerűen van.

Mivel a gyomosodásra nincs ellenszerünk, viszont mégse jó, ha a kertünk (forráskódunk) tele van dudvával, ezért a megoldás az, hogy a kertész (programozó) rendszeresen gyomlál. Ezt nem kampányszerűen kell csinálni, hanem nap mint nap, a normális fejlesztés részeként. Fejlesztesz, hopp, ott van egy kis gaz, gyorsan eltünteted, fejlesztesz tovább.

Erre mutatnék egy gyors példát most, a CitiesOfApocalypse közben jött elő. A rövid történet az, hogy Descant ötlete nyomán megcsináltam, hogy az iránygombokkal lehessen scrollozni a térképet; ehhez pedig elengedhetetlen volt, hogy a billentyűlenyomásokat elkapjam. De nem akarom őket elkapni mindig (pl amikor a játékos a chatbe írogat), hanem csak olyankor, amikor az egér a játék felett van.

Erre született a következő kódocska, ami a betöltéskor fut le:

this.gameDiv.onmouseover = function() { window.onkeydown = onkp; }; this.gameDiv.onmouseout = function() { window.onkeydown = null; };

Eddig szép és jó minden, működik minden* böngészőn, maga a csoda. Igenám, csakhogy van egy Internet Explorer nevű csapás a webfejlesztésre; a csapás részeként mindent másképp kell csinálni, hogy IE-n is működjön. Egy ponton nekiláttam IE-kompatibilissá tenni a játékot (ami végül nem sikerült), és sok egyéb mellett a következő változást eszközöltem:

this.gameDiv.onmouseover = function() { if (isInternetExplorer()) { document.body.onkeydown = onkp; } else { window.onkeydown = onkp; } }; this.gameDiv.onmouseout = function() { if (isInternetExplorer()) { document.body.onkeydown = null; } else { window.onkeydown = null; } };

Hurrá, most már IE-n is működik (a kódnak ez a része). Mentem is tovább sietve, mert még volt ötezer másik rész, amitől az IE fejreállt. Sajnos, azon igyekezetemben, hogy legyen IE változat, hagytam magam mögött egy kis gazt. Pár héttel később egy másik változtatás közben gyomláltam ki, íme:

if (isInternetExplorer()) { this.gameDiv.onmouseover = function() { document.body.onkeydown = onkp; } this.gameDiv.onmouseout = function() { document.body.onkeydown = null; } } else { this.gameDiv.onmouseover = function() { window.onkeydown = onkp; } this.gameDiv.onmouseout = function() { window.onkeydown = null; } }

Mi változott? Az eseménykezelő egyszerűbb lett, mert az if/else rész átkerült az inicializációs kódba; ettől lesz szebb (pontosabban, kevésbé gazos) ez a kódrészlet.

Tagek:
 
Utoljára módosította UPi 2009.X.16 11:24-n; 0 hozzászólás;
Új hozzászólás | PermaLink