XML web szolgáltatások fejlesztése objektum-orientált és funkcionális paradigmák alkalmazásával


Sallai János – Dr. Charaf Hassan



Napjaink nyílt elosztott rendszereinek fejlesztésében kulcsfontosságú szerepet játszanak az XML web szolgáltatások. Mivel a web szolgáltatások XML adatok HTTP protokollon keresztül történõ átvitelén alapulnak, segítségükkel rövid idõ alatt költséghatékony módon jól integrálható szoftver hozható létre.

Web szolgáltatások alkalmazása révén azért lehetséges idõt megtakarítani, mert nincs szükség kommunikációs interfészek tervezésére és implementálására. Ugyanakkor, komplex algoritmusokat tartalmazó alkalmazások esetén, a fejlesztési idõ túlnyomó többsége az üzleti logika tervezésével, megvalósításával és tesztelésével telik el.

Véleményünk szerint, algoritmikus problémák egy bizonyos csoportja funkcionális programozási nyelvekben hatékonyabban valósítható meg, mint a megszokott procedurális illetve objektum-orientált megközelítéssel, OO metodológiák segítségével.

A cikkben egy objektum-orientált és funkcionális programnyelvekben létrehozott XML web szolgáltatás tervezését és megvalósítását tárgyaljuk. Példánkban egy Haskellben implementált algoritmust és a hozzá tartozó C# nyelvben elkészített wrappert mutatunk be Microsoft .NET környezetben.

Kifejtjük, hogyan particionálható a project funkcionális és objektum-orientált nyelvekben implementálandó részfeladatokra, majd bemutatjuk az alkalmazott fejlesztési technikát. Végezetül pedig értékeljük a több paradigmát együttesen alkalmazó web szolgáltatás fejlesztési modelljét, és szót ejtünk gyakorlati alkalmazási lehetõségeirõl.

Web szolgáltatások jelentõsége

Napjainkban a web szolgáltatások szerepe rohamosan nõ az elosztott rendszerek fejlesztésekor. Nagy elõnyük, hogy olyan nyílt szabványokon alapul a technológia, mint az XML, a SOAP és a HTTP. A web szolgáltatások minden olyan eszközrõl és operációs rendszerbõl elérhetõk, amelyek Internet kapcsolattal rendelkeznek, illetve Internet protokollokat támogatnak. Mindemellett a web szolgáltatások a rendszerintegráció területén is hatalmas jelentõséggel bírnak.

A fejlesztés hatékonysága

A Web szolgáltatások XML formátumú adatok HTTP protokollon keresztül történõ átvitelén alapulnak. A SOAP (Simple Object Access Protocol) segítségével az üzleti logika web szolgáltatások által elérhetõvé tett objektumain végezhetünk el mûveleteket, konkrétan metódus hívásokat.

A web szolgáltatások alkalmazásának hatékonysága elsõsorban abban rejlik, hogy a fejlesztõknek nem kell bajlódniuk a kommunikációs intefészek definiálásával és implementációjával. Az interfész definíciót a web szolgáltatások specifikációja tartalmazza, az implementációjuk pedig a web szolgáltatásokat támogató fejlesztõ eszközök könyvtáraiban van megvalósítva.

Web szolgáltatások alkalmazása révén tehát idõhatékony módon egy megbízható, (a fejlesztõeszköz gyártója által) garantáltan hibamentes kommunikációs megoldáshoz jutnak a felhasználók. Emellett, a fejlesztett rendszer késõbbi imtegrációs igényei is könnyedén kielégíthetõek lesznek, mivel egy szabványt alkalmaztunk.

A kommunikációs felület megvalósításakor megtakarított idõ így tehát a konkrét probléma megoldására fordítható.

Funkcionális programozás web szolgáltatásokban

Véleményünk szerint, algoritmikus problémák egy bizonyos csoportja funkcionális programozási nyelvekben hatékonyabban valósítható meg, mint a megszokott procedurális illetve objektum-orientált megközelítéssel, OO metodológiák segítségével.

A szoftverfejlesztés hatékonysága érdekében ésszerû lenne, ha web szolgáltatások megvalósításakor mind objektum-orientált, mind procedurális eszközöket is használhatnánk, és a megoldandó probléma elemzése után úgy particionálhatnánk a feladatot, hogy az objektum-orientált nyelv végezné a vezérléssel és a kommunikációval kapcsolatos feladatokat, a funkcionális nyelvvel pedig az algoritmust valósíthatnánk meg.


A funkcionális programozási paradigma


A programozási nyelvek a legfontosabb eszközök a szofverfejlesztõk kezében: annak ellenére, hogy használunk CASE, projekt menedzsment, forráskód- és verziókezelõ és egyéb eszközöket is, elõbb-utóbb a programozási nyelvhez kell nyúlnunk.

A funkcionális nyelvek egy sajátságos, de potenciálisan hatékony részhalmazát képezik a programozási nyelveknek. A program végrehajtását egy függvény kiértékeléseként tekintik: a legtisztább funkcionális nyelvekben nincsenek változók, nincs értékadás, a függvényeknek nincs egyáltalán semmi mellékhatásuk. A függvények nem tesznek mást, mint a bemeneti paraméterek egy halmaza alapján kiszámítanak egy outputot.

A változók, értékadások és mellékhatások hiánya azt eredményezi, hogy funkcionális programokkal kiküszöbölhetõvé válnak a hagyományos programozási paradigmákból eredõ potenciális problémaforrások. Mivel nem használhatunk változókat, nem fordulhat elõ, hogy helytelenül felülírunk egy értéket. Hasonlóan: nincs ciklust, így nem fordulhat elõ, hogy egy ciklus helytelenül értékelõdik ki.

A viszonylag kötött, szigorú szintaktika révén a funkcionális programozási nyelvek alkalmazásával a hibaarány csökkenthetõ, a funkcionális paradigma ugyanakkor egyszerûbb programhelyesség-bizonyítást tesz lehetõvé.

Az elõzõekben felsorolt imperatív nyelvi eszközök hiánya azt eredményezi, hogy a funkcionális programozási nyelvekben a vezérlési folyamatok nehezebben érthetõek az imperatív programozásban jártas programozók számára, különösen interaktív programok esetén.

A funkcionális paradigma azt diktálja, hogy a megoldandó problémát funkcionális egységekre kell bontanunk – olyan függvényekre, amelyek egy megadott bemenethez egy kimenetet rendelnek.

Tapasztalatok alapján láthatjuk, hogy funkcionális programnyelvek alkalmazása esetén a forráskód hossza a procedurális nyelvekben írt megoldásnál lényegesen rövidebb lehet, ugyanakkor, a hibaarány is radikálisan csökkenthetõ. Ellenben, bizonyos problémák, amelyek procedurális nyelvekben kézenfekvõen megoldhatók, funkcionális nyelvekkel nehezen kezelhetõk.

A funkcionális nyelvek az alkalmazási területükön kimagaslóan hatékonyak lehetnek. Nagyon hasznos lenne, ha ugyanazon alkalmazásban – esetünkben egy web szolgáltatásról van szó – a funkcionális nyelvek tiszta, magasabb rendû függvényekeit használhatnánk, és ezeket hagyományos imperatív objektum-orientált nyelvekbõl elérhetõvé tehetnénk.

Haskell kód Microsoft .NET alapon megvalósított web szolgáltatásban

A Microsoft .NET keretrendszere megoldást biztosít arra, hogy különbözõ programozási nyelvekben írt programok együttmûködhessenek. A nyelvi átlátszósággal leküzdhetõk a paradigmák közti éles határok.

A .NET keretrendszer két fõ komponensbõl áll: a köztes kódra lefordított programokat futtató Common Language Runtime-ból (CLR) és .NET osztálykönyvtárból.

A CLR egy végrehajtási környezet, amely kezeli a kódot futásidõben, ellátja a tárgazdálkodással kapcsolatos feladatokat (memória allokáció, szemétgyûjtés), menedzseli a szálakat, távoli eljáráshívást tesz lehetõvé, ugyanakkor felel a kód biztonságos futásáért.

A köztes kód elméletileg bármilyen programozási nyelvõl elõállítható. Jelenleg több. mint 20 nyelv támogatja a CLR-t, mint célplatformot.Ezek egyike a tisztán funkcionális alapokon nyugvó Haskell.

A Microsoft .NET keretrendszer nagy elõnye, hogy a köztes nyelvre lefordított oszályok – függetlenül attól, hogy milyen nyelvben íródtak – az alkalmazott programozási nyelv különbözõsége esetén is képesek együttmûködni: nemcsak egymás metódusait képesek meghívni, hanem – bizonyos kötöttségek mellett – közöttük öröklésre is lehetõség nyílik.

Probléma partícionálása

A következõkben egy objektum-orientált és funkcionális programnyelvekben létrehozott XML Web szolgáltatás megvalósítását tárgyaljuk. Példánkban egy Haskellben implementált algoritmust és a hozzá tartozó C# nyelvben elkészített wrappert mutatunk be Microsoft .NET környezetben.

A vezérlési szerkezeteket, az interfészek kezelését, rendszerközeli hívásokat mindig célszerû procedurális nyelvben megvalósítani. Esetünkben a web szolgáltatás vázát C#-ban valósítjuk meg.

Alacsonyabb szintû, egyszerûbb problémákra visszavezethetõ feladatokat célszerû Haskellben implementálnunk. Bizonyos algoritmikus probémákra funkcionális nyelvekben – rekurziót alkalmazva – frappáns megoldások adhatók.

Konkrét példa

A fentiek figyelembe vételével olyan példaprogramot mutatunk be, amely jól szemlélteti a funkcionális paradigma alkalmazásában rejlõ elõnyöket.

A feldadat

A feladat egy lineáris interpolációt végzõ web szolgáltatás elkészítése, amely bemenetként historikus adatokat kap, majd az input adatok alapján kiszámítja a lineáris interpoláció paramétereit.

Maga az algoritmus eléggé egyszerû: C# nyelven körülbelül 40 sorban megvalósítható. Ugyanakkor, az objektum-orientált és a funkcionális paradigma ezen problémaosztályra vonatkozó különbségeit jól szemlélteti, hogy ugyanazt a funkcionalitást Haskell használatával akár nyolc sorban is megvalósíthatjuk.

A megvalósítás

Az implementációs folyamat elsõ lépése az interpolácós algoritmus elkészítése Haskell nyelven.

Második lépésként C# nyelven megvalósítjuk a web szolgáltatás vázát. A web szolgáltatásunkat HaskellWebService-nek nevezve, egy .ASMX kiterjesztésû fájba írjuk a kódot. A program elsõ sorában a

<%@ WebService Language="C#" class="HaskellWebService" %>

információ utasítja a fordítóprogramot, hogy web szolgáltatás módban fusson és megadja a web szolgáltatás nevét.

A C# kódban a System.Web.Services.WebService õstõl kell származtatnunk az osztályunkat, melybõl minden különösebb probléma nélkül meghívhatjuk a Haskellben megvalósított függvényt.

Már csak a funkcionalitás kipróbálása van hátra. A .NET generál egy alapértelmezett felhasználói felületet a frissen létrehozott web szolgáltatáskoz, melyet a http://localhost/work/aspx/HaskellWebService.asmx URL-en érhetünk el. A bemeneti paramétereket kitöltve az ûrlapon, az Invoke gomb lenyomása után a web szolgáltatás outputját kapjuk meg a böngészõben.

Értékelés

Ahogy a fentiekbõl látszik, a Microsoft .NET keretrendszer segítségével egyszerûen kombinálhatunk különbözõ programozási nyelvekben implementált modulokat egy alkalmazáson belül, függetlenül attól, hogy az alkalmazott nyelvek milyen programozási paradigmát képviselnek.

E fejlesztési modell elõnyei közül kiemelnénk, hogy a funkcionális progamozási nyelvben megvalósított algoritmusban kisebb a hibák elõfordulásának valószínûsége, köszönhetõen a funkcionális nyelvek szigorú szintaktikájának. A kód lényegesen átláthatóbb, mint ha imperatív nyelvben implementáltuk volna, ugyanakkor a program helyessége is könnyebben bizonyítható.

Tapasztalataink alapján leszögezhetjük, hogy .NET alatt lehetõség nyílik funkcionális kódnak web szolgáltatásokba történõ integrálásra, mely más platformon csak körülményesen lenne lehetséges.

Irodalomjegyzék

Humphrey, W. S.: A Discipline of Software Engineering. Addison-Wesley, 1995

Putz, V.: ePolyglot Documentation, http://epolyglot.sourcforge.net

Microsoft Development Network, http://msdn.microsoft.com