( uid_21365 | 2020. 09. 26., szo – 01:53 )

Ez a validálásos izémizé egy nagyon érdekes kérdés, amivel magam is rengeteget gyötrődtem a Furor megalkotása során. Előbb ugyanis egy saját librarycsomagot írtam, amit mindenféle másra is használhatok; a Furor csak egyetlen program ami reá épül.

Na és vegyünk egy olyan példát, hogy van egy függvény, ami egy stringre mutató pointert vár inputként, aztán ezzel a stringgel csinálnia kell valamit. A string amúgy egy hossztárolós string, gyakorlatilag tehát egy struktúra. Na most, kell-e validálnia a függvényemnek, és ha igen, akkor konkrétan mit is?

Ellenőrizze-e le, hogy az a pointer null pointer-e? Tegyük fel ez egy olyan függvény ami rengeteg helyen van meghívva a programban. Bár egyetlen összehasonlítás időszükséglete kicsinek tűnhet, ha egy ciklus mélyén van, a ciklus lefutásának száma nagy is lehet, s így már sok kicsi sokra megy...

Aztán, önmagában a pointer esetleges NULL voltának ellenőrzése nem elég. Mi van, ha a string hossza maga nulla? Ez is problémás lehet ugye bizonyos esetekben, mert lehet hogy az a művelet amit a függvény végezni akar a stringgel, nem értelmezhető nulla hosszúságú string esetén.

És még rengeteg mindenféle elképzelhető.

Na most ezen gondok mindegyikére persze ki lehet találni egy hibakódot, mondván hogy minket nem érdekel az időveszteség, a biztonságra megyünk rá, mindig mindent validálunk és kész, és pontosan tudni akarjuk a hibakódból, mi a hiba! Oké. De ezesetben megint felmerül a kérdés, hogyan legyen visszaadva a hibakód. Nem mindig lehetséges az, hogy ugyanott adjuk vissza ahol az „értékes” eredményt, mert mi van ha a visszatérési érték minden bitje egyaránt szükséges lehet az „értékes” eredmény számára is!

De ez még nem is minden, mert ha valamiképp vissza is adjuk itt a hibakódot, a hívó függvénynek is mindig ellenőriznie kéne hogy értékes eredményt kapott-e vissza vagy hibakódot. Na és ha mégse ellenőrzi, az legalább akkora sechole mint az, ha már a hívott függvény se validál, épp csak az utóbbi annyiból jobb hogy akkor legalább időveszteség sincs...

Márpedig tudjuk jól, az efféle függvények visszatérési értékét (hibakódját) nem mindig ellenőrzik ám le a programozók...

Szóval az egész kérdéskör tele van alattomos csapdákkal. Tudom. Tapasztaltam.

Még az se okvetlenül nyerő ötlet hogy validáljon ugyan a függvény, de hiba esetén ne visszatérési értékekkel meg hibakódokkal szórakozzon, hanem dobjon egy kivételt. Eleve, kivételkezelés nem is minden programnyelvben létezik, de most maradjunk annál hogy épp itt e példában igen. Nos, egy alacsonyrendű függvényt számos különböző helyről lehet meghívni, és nem mindig szerencsés ám az egész program-palotát összeomlasztani váratlanul csak mert valahol hiba lépett fel. A kivételgenerálás a szememben valamiféle atombomba, egy overkill, amit nem bölcs doloog alacsonyrendű függvények döntésére bízni, mert olyasmi mintha egy gyermek kezébe adnánk a nukleáris rakéták indítógombját...

Szóval itt lényegében arról van szó, hogy az oké hogy egy program legyen a lehető legintelligensebb, de az intelligenciának szintjei vannak, és azt kell eldönteni, mennyi „okosságot” sőt „okoskodást” bízunk rá egyik vagy másik függvényre.

Én végül úgy döntöttem, hogy foglalkozzék minden függvény a MAGA DOLGÁVAL, azaz eleve abból induljon ki, hogy aki őt meghívta, az mindent rendben bocsátott az ő rendelkezésére. Elvégre a hívó, az az ÚR, a hívott meg a SZOLGA, és a szolga kutyakötelessége megbíznia az ő urában!

Ha minden függvény pontosan és lelkiismeretesen csinál meg mindent ami TŐLE FÜGG, akkor ott baj nem lehet. (a hardware-hibát meg efféléket most ne bolygassuk).

Persze nyilván lesznek olyan függvények amik ezt-azt mégis elfelejtenek, mert egyetlen programozó se tökéletes, engem kivéve... de az nem csoda, én persze hogy tökéletes vagyok, mert nem is vagyok programozó. Mindazonáltal, e megközelítés szerintem még mindig a leggyümölcsözőbb.