User:LUCI5T/Előfeltétek a programozásban

A számítógépes programozásban az előfeltétel egy olyan feltétel vagy predikátum, amelynek mindig igaznak kell lennie közvetlenül egy kód részlet végrehajtása előtt vagy egy művelet előtt a formális specifikációban.

Ha egy előfeltétel sérül, a kód részlet hatása meghatározatlanná válik, és így előfordulhat, hogy nem hajtja végre a szándékolt feladatát. Azok az előfeltételek, amelyek hiányoznak, elégtelenek, nincsenek formálisan bizonyítva (vagy helytelen próbálkozással vannak bizonyítva), vagy nem ellenőrzik őket statikusan vagy dinamikusan, biztonsági problémákat okozhatnak, különösen olyan nem erősen típusos nyelvekben, amelyek nem biztonságosak.

Gyakran az előfeltételeket egyszerűen az érintett kódrész dokumentációjában tüntetik fel. Az előfeltételeket néha őrök kel vagy állításokkal tesztelik a kódban, és néhány nyelv specifikus szintaktikai szerkezeteket is biztosít erre a célra.

Példa
A faktoriális függvény csak akkor van definiálva, ha a paramétere nulla vagy annál nagyobb egész szám. Tehát egy faktoriális függvény implementációjának előfeltétele, hogy a paramétere egész szám legyen, és hogy a paraméter nagyobb vagy egyenlő legyen nullánál. Alternatív megoldásként a nyelv típusrendszere használható annak meghatározására, hogy a faktoriális függvény paramétere természetes szám (előjelnélküli egész), amelyet a fordító típusellenőrzője automatikusan formálisan igazolhat.

Továbbá, ahol a numerikus típusoknak korlátozott a tartományuk (mint a legtöbb programozási nyelvben), az előfeltételnek azt is meg kell határoznia, hogy a paraméter maximális értéke mekkora lehet, hogy elkerüljük a túlcsordulást. (Például, ha egy faktoriális függvény implementációja a 64 bites előjelnélküli egész számot adja vissza eredményként, akkor a paraméternek kisebbnek kell lennie, mint 21, mert a faktoriális(21) nagyobb, mint a maximális előjelnélküli egész szám, amit 64 biten tárolni lehet.) Ahol a nyelv támogatja a tartomány altípusokat (például Ada), az ilyen korlátokat a típusrendszer automatikusan igazolhatja. Bonyolultabb korlátokat formálisan lehet igazolni interaktívan egy verifikátorral.

Az objektum orientált programozásban
Az objektum-orientált szoftverfejlesztésben az előfeltételek a szerződés alapú tervezés lényeges részét képezik. A szerződés alapú tervezés magában foglalja a végrehajtási feltételeket (utófeltételek) és az osztály invariánsokat is.

Bármely rutin előfeltétele meghatározza azokat az objektumállapotra vonatkozó korlátozásokat, amelyek szükségesek a sikeres végrehajtáshoz. A programfejlesztő szempontjából ez képezi a rutin hívójának szerződésrészét. A hívónak kötelessége biztosítani, hogy az előfeltétel teljesüljön a rutin hívása előtt. A hívó erőfeszítéseinek jutalma a hívott rutin utófeltételében fejeződik ki.

Eiffel példa
A következő Eiffel példában szereplő rutin egy olyan egész számot vesz argumentumként, amelynek egy érvényes óraértéknek kell lennie a nap folyamán, azaz 0 és 23 között, beleértve mindkettőt. Az előfeltétel a require kulcsszót követi. Ez meghatározza, hogy az argumentumnak nagyobbnak vagy egyenlőnek kell lennie nullával, és kisebbnek vagy egyenlőnek kell lennie 23-mal. A "valid_argument:" címke leírja ezt az előfeltétel-kitételt, és azonosítja azt futásidejű előfeltétel-megsértés esetén.

Előfeltételek és öröklődés
Az öröklődés jelenlétében az utódosztályok (leszármazott osztályok) által örökölt rutinok az előfeltételeikkel együtt érvényesek. Ez azt jelenti, hogy az örökölt rutinok bármely implementációját vagy újradefiniálását úgy kell megírni, hogy azok megfeleljenek az örökölt szerződésnek. Az előfeltételek módosíthatók az újradefiniált rutinokban, de csak gyengíthetők. Ez azt jelenti, hogy az újradefiniált rutin csökkentheti az ügyfél kötelezettségét, de nem növelheti azt.

Lásd még

 * Tervezés szerződés alapján
 * Guard (számítástechnika)
 * Utófeltétel
 * Hoare logika
 * Feltételek által fenntartott invariánsok
 * Adatbázis trigger