mi a tiszta funkció?
előnyök
a tiszta funkciók használatának számos előnye van, mind a teljesítmény, mind a használhatóság szempontjából.
olvashatóság
a tiszta függvények sokkal könnyebben olvashatók és indokolhatók. Az összes releváns bemenet és függőség paraméterként van megadva, így nem figyelhetők meg olyan hatások, amelyek megváltoztatnák a bemenetek halmazán kívüli változókat.
Ez azt jelenti, hogy gyorsan megérthetünk egy függvényt és annak függőségeit, csak a függvény deklarációjának elolvasásával. Tehát, ha EGY függvényt f(a, b, c)
akkor tudjuk, hogy csak a
b
, és c
függőségek f
.
hordozhatóság
mivel az összes függőség bemeneti paraméterként van megadva, és nem globális kontextuson keresztül érhető el, ezek a függőségek a függvény meghívásának kontextusától függően cserélhetők ki.
Ez azt jelenti, hogy ugyanaz a függvény működhet például ugyanazon erőforrás különböző megvalósításain.
Ez sokkal hordozhatóbbá és újrafelhasználhatóbbá teszi a kódot, mivel ugyanaz a függvény különböző kontextusokban használható, ahelyett, hogy más függvényt kellene írni, csak hogy ugyanazon osztály más implementációját használja.
például ahelyett, hogy két különböző tisztátalan függvényt kellene írni két különböző naplózó használatához, amelyeket globálisan tárolnak, egy tiszta függvény csak a kívánt naplózót veszi be bemenetként.
tesztelés
a mellékhatások hiánya miatt a pure funkciók nagyon könnyen tesztelhetők, mivel csak azt kell tesztelnünk, hogy a bemenetek a kívánt kimeneteket eredményezik-e. Nem kell ellenőriznünk a globális programállapot érvényességét az egyes funkciók tesztjei során.
ezenkívül, mivel minden függőség bemenetként van megadva, könnyen kigúnyolhatjuk a függőségeket. Tisztátalan környezetben az összes teszt során nyomon kell követnünk valamilyen globális függőség állapotát.
tiszta környezetben azonban egyszerűen megadnánk az összes függőséget bemenetként. Többé nem kell aggódnunk a globális állapot fenntartása miatt a tesztjeink során, és most már a függőségek különböző verzióit biztosíthatjuk a különböző tesztekhez.
Ez lehetővé teszi számunkra, hogy teszteljük a funkciókat, miközben kifejezetten ellenőrizzük az egyes tesztekben megadott függőségeket.
referenciális átláthatóság
a referenciális átláthatóság azt jelenti, hogy a függvény hívását a megfelelő kimeneti értékkel lehet helyettesíteni anélkül, hogy megváltoztatnánk a program viselkedését.
a referenciális átláthatóság eléréséhez a függvénynek tisztanak kell lennie. Ennek előnyei vannak az olvashatóság és a sebesség szempontjából. A fordítók gyakran képesek optimalizálni a referenciális átláthatóságot mutató kódot.
gyorsítótár
mivel a tiszta funkciók mindig ugyanazt a kimenetet adják vissza ugyanarra a bemenetre, gyorsítótárazhatjuk a tiszta függvényhívások eredményeit.
A gyorsítótár egy olyan technika használatára utal, mint például a memoizálás, a függvények eredményeinek tárolására, így csak egyszer kell kiszámolnunk őket.
általában egy függvényhezf: Input -> Output
ez egy térképen (például hash-térképen) keresztül valósul megInput -> Output
.
egy függvény végrehajtásakor először ellenőrizzük, hogy a térkép tartalmazza-e a bemenetet kulcsként. Ha igen, akkor visszaadjuk a térkép kimeneti értékét, különben kiszámítjuk a f(input)
értéket, majd a kimenetet a térképen tároljuk, mielőtt visszaadnánk.