A szoftverfejlesztés történelme során megfogalmazódott pár elv, tanács, amelyek nagymértékben hozzá tudnak ahhoz járulni, hogy karbantartható kódot készÃtsünk. Egy működÅ‘ kód nem sokat ér, ha nincs aki értené, hogy hogyan is működik és biztonsággal hozzá merne nyúlni. A tapasztalat pedig az, hogy elÅ‘bb-utóbb hozzá kell nyúlni, mert az igények változni fognak.
Éppen ezért a szoftverfejlesztés történelme során megfogalmazódott pár elv, amelyek követése segÃt abban, hogy karbantartható kódot Ãrjunk. Fontos megjegyezni, hogy ezek inkább ajánlások és nem feltétel nélkül követendÅ‘ törvények vagy szabályok, mert bármelyik megszegésére létezik nyomós indok.
DRY
Az egyik ilyen tervezési elv a DRY, ami a Don’t Repeat Yourself szavakat rövidÃti és arról szól, hogy ne ismételjük magunkat. Ez az elv arról szólna, hogy a szoftver bÅ‘vÃtése során a hasonló részeket használjuk újra, emeljük közös komponensbe ahelyett, hogy lemásolnánk és adaptálnánk Å‘ket. A másolással az a baj, hogy a kód összes okos megoldása mellett az összes hibáját is másolja az újak bevezetése mellett. A sok másolást, ismétlÅ‘dÅ‘ részeket tartalmazó kódbázist WET-nek nevezi a szakirodalom, ami a Write Everything Twice szavakból (mindent kétszer Ãrunk meg) jön. Egy ilyen kódbázisban egy hiba kijavÃtása nem egyszerű, mivel a másolások számától függÅ‘en N alkalommal kell ezt megtennünk.
A DRY elv követését segÃti, ha a közös részeket például örökléssel egy Å‘sosztályba szervezzük, vagy metódus szinten a közös részeket egy segéd metódusba kiemeljük, amit aztán újrahasználunk.
Van amikor a D.R.Y helyett jobb megoldás, ha a kiinduló kód inkább a W.E.T elvet követi. Tipikusan ez agilis fejlesztés során tud jól jönni, amikor a követelmények változhatnak, nem teljesen egyértelműek és kÅ‘bevésettek. Ilyen esetekben, amikor nem tudjuk, hogy mit hoz majd a jövÅ‘ és nem látjuk elÅ‘re, milyen hatásai lehetnek a kért változtatásoknak jobb, ha W.E.T megoldással állunk neki egy adott funkciónak. Azonban arra törekedjünk, hogy a megoldás ne sokáig maradjon a termékben. Amint a követelmények egyértelművé válnak, Ãrjuk át a kódot úgy, hogy a DRY elvet kövesse.
KISS
A KISS mozaikszó eredetileg nem a szoftverfejlesztés világából jön. Az eredete a haditengerészethez és a katonasághoz köthetÅ‘ és a Keep It Simple Stupid szavak rövidÃtése és talán úgy fordÃtható, hogy törekedjünk az egyszerűségre, mivel az egyszerű megoldások általában jobbak. A hadseregnél ez azért fogalmazódott meg, mert stresszhelyzetben egy bonyolult berendezés üzemeltetése igencsak nehéz feladat, illetve nem javÃtható egyszerűen. Ugyanez igaz a kódra és a programokra is. Egy bonyolultan használható szoftver nem lesz a felhasználók kedvence, illetve minél több bonyolult megoldás van benne, annál nehezebben lesz karbantartható és nagyobb az esélye, hogy egy módosÃtás nem várt következményekkel járhat. A KISS elv nem követésére véleményem szerint a Quake III fast inverse square root kódja ékes példa:
float q_rsqrt(float number)
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the fuck?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
return y;
}
A kód működésében zseniális és a maga idejében a leggyorsabb megoldás1 volt a problémára, ez vitathatatlan, de mivel külön Wikipedia szócikk magyarázza a működését2 és közel fél órán keresztül magyarázza valaki a YouTube-on, hogy miért működik a kód3, az számomra ékes példája annak, hogy ez sok minden, de nem egyszerű.
A fenti pár soros kódrészlet azt is szemlélteti egyébként, hogy a bonyolult és összetett problémák általában összetett megoldást fognak igényelni, valamint az olvasható és a gyors kód kifejezések általában egymás ellentettjei.
YAGNI
A YAGNI a You Ain’t Gona Need It kifejezés rövidÃtése, ami annyit jelent, hogy nem lesz rá szükséged. Ez azt jelenti, hogy ha a feladatunk egy egyszerű konzol alkalmazás implementálása egy adott probléma megoldására, ami 1x fordul elÅ‘, akkor ne bonyolÃtsuk túl feleslegesen az implementációt mintákkal és szofisztikált megoldások hegyével, mert valószÃnűleg többet számÃt, hogy gyorsan megoldja a problémát az alkalmazás ahelyett, hogy mennyire jól lett megÃrva.
Röviden: ne gondoljuk túl a követelményeket. Ha valami nem egyértelmű, akkor kérdezzünk rá kétszer, háromszor is inkább, mint hogy feltételezések alapján olyasmit is bele gondoljunk az elvárások közé, amire nincs és nem is lesz szükség.
A YAGNI elv igaz a kommentelt kód részletekre is. Fejlesztés közben okés, hogy a kódot ideiglenesen kommentekkel kikapcsoljuk, de ez ne maradjon a kódban, mert csak felesleges vizuális zaj és ha nincs tovább rá szükség, akkor valószÃnűleg a jövÅ‘ben sem lesz rá szükség, vagy ha mégis, akkor ott a verziókezelÅ‘, amibÅ‘l vissza lehet állÃtani a kódot.
-
A modern processzorok hardveresen tartalmaznak erre utasÃtást, de 1999-ben, amikor a játék megjelent, ez még nem volt elérhetÅ‘.↩