Zagotavljanje trajnosti podatkov v ogrodju .Net

Velikost: px
Začni prikazovanje s strani:

Download "Zagotavljanje trajnosti podatkov v ogrodju .Net"

Transkripcija

1 Rok Žontar ZAGOTAVLJANJE TRAJNOSTI OBJEKTOV V OGRODJU.NET Diplomsko delo Maribor, marec 2009

2

3 I Diplomsko delo univerzitetnega študijskega programa ZAGOTAVLJANJE TRAJNOSTI OBJEKTOV V OGRODJU.NET Študent: Študijski program: Smer: Mentor: Somentor: Rok Žontar UN ŠP Računalništvo in informatika Informatika dr. Marjan Heričko, red. prof. mag. Boštjan Kežmah Maribor, marec 2009

4 II UNIVERZA V MARIBORU (ime fakultete oz. visoke strokovne šole) Številka: Datum: SKLEP O DIPLOMSKEM DELU 1., študent-ka univerzitetnega (visokošolskega strokovnega) študija, izpolnjuje pogoje, zato se mu dovoljuje izdelati diplomsko delo. 2. Tema diplomskega dela je s področja katedre/oddelka/inštituta, pri predmetu. Mentor-ica: Somentor-ica: 3. Naslov diplomskega dela: 4. Vsebina diplomskega dela: 5. Diplomsko delo je potrebno izdelati skladno z»navodili za izdelavo diplomskega dela«in ga oddati v izvodih do v referatu za študentske zadeve. Predstojnik katedre/oddelka/inštituta: Mentor: Dekan-ica:

5 III ZAHVALA Zahvaljujem se mentorju dr. Marjanu Heričku za pomoč in vodenje pri opravljanju diplomskega dela. Prav tako se zahvaljujem somentorju mag. Boštjanu Kežmahu. Zahvaljujem se tudi sodelavcem v Laboratoriju za informacijske sisteme za nesebično pomoč. Posebna zahvala velja staršem, ki so mi omogočili študij in me ves čas podpirali.

6 IV ZAGOTAVLJANJE TRAJNOSTI OBJEKTOV V OGRODJU.NET Ključne besede: objektno-relacijska preslikava, domensko usmerjeno načrtovanje, LINQ to SQL, NHibernate, ADO.NET Entity Framework, ogrodje.net, primerjava UDK: /.5(043.2) Povzetek V diplomskem delu smo predstavili impedančno nesorazmerje med objektno orientiranimi programskimi jeziki in relacijskimi podatkovnimi bazami. Preučili in raziskali smo objektno-relacijske preslikovalnike in ugotovili na kak način pomagajo razvijalcem pri premostitvi teh nesorazmerij. Pri tem smo izpostavili vzorce, ki jih uporabljajo objektno-relacijski preslikovalniki, in neodvisnost ogrodja od izbranega ponudnika podatkovne baze. Opisali smo tri ogrodja za objektno-relacijsko preslikavo, ki temeljijo na ogrodju.net. Na tej podlagi smo določili primerjalne kriterije in izvedli primerjavo ter podali končno analizo.

7 V OBJECT PERSISTENCE IN THE.NET FRAMEWORK Key words: object-relational mapping, domain driven design, LINQ to SQL, NHibernate, ADO.NET Entity Framework,.NET framework, comparison UDK: /.5(043.2) Abstract In this diploma we have presented the impedance mismatch between object-oriented programming languages and relational databases. We researched and presented object-relational mapping and found out how this technology helps developers to overcome the impedance mismatch. The main focus was on object-relational patterns and persistence ignorance. We described three object-relational mapping frameworks which rely on the.net framework. On this base we defined some comparison criteria, performed the comparison and concluded with an analysis.

8 VI VSEBINA 1 UVOD OBJEKTNO-RELACIJSKI PRESLIKOVALNIKI TRAJNOST PODATKOV RAZLIKE MED RELACIJSKIM IN OBJEKTNO ORIENTIRANIM SVETOM OBJEKTNO RELACIJSKO PRESLIKOVANJE PODATKOVNI SLOJ DOMENSKO USMERJENO NAČRTOVANJE IN VZORCI ORM Vzorci domenske logike Vzorci dostopa do podatkov Objektno-relacijsko vedenjski vzorci Objektno-relacijski strukturni vzorci Objektno-relacijski vzorci za preslikovanje z uporabo meta podatkov NEODVISNOST MODELA OD OGRODJA Princip POCO Kriteriji»Persistence Ignorance« PI ali ne PI? OGRODJA ORM OGRODJE LINQ TO SQL Dodatki v C# Arhitektura ogrodja LINQ Preslikava Posodabljanje, vstavljanje in brisanje OGRODJE NHIBERNATE Iz Jave na.net Povpraševanja Posodabljanje, vstavljanje in brisanje OGRODJE ADO.NET ENTITY FRAMEWORK Arhitektura ogrodja ADO.NET Entity Framework Entitetni podatkovni model... 46

9 VII Poizvedbe Posodabljanje, vstavljanje in brisanje PRIMERJAVA OGRODIJ KLASIFIKACIJA PRIMERJALNIH KRITERIJEV Grafična in pomožna orodja Podpora dedovanju in polimorfizmu Podpora različnim sistemom za upravljanje s podatkovno bazo Kriteriji»Persistence Ignorance« Dinamične poizvedbe Sprotno nalaganje in nalaganje na zahtevo Shranjene procedure Transakcije Predpomnjenje Zaklepanje Metrike programske kode Učinkovitost delovanja ANALIZA Grafična in pomožna orodja Podpora dedovanju in polimorfizmu Podpora različnim sistemom za upravljanje s podatkovno bazo Kriteriji»Persistence Ignorance« Dinamične poizvedbe Sprotno nalaganje in nalaganje na zahtevo Shranjene procedure Transakcije Predpomnjenje Zaklepanje Metrike programske kode Učinkovitost delovanja POVZETEK SKLEP... 83

10 6 LITERATURA IN VIRI VIII

11 IX SEZNAM SLIK Slika 2.1 Shematski prikaz ORM... 7 Slika 2.2 Trinivojska arhitektura [8]... 9 Slika 2.3 Domenski model [10] Slika 2.4 Modul tabele [10] Slika 2.5 Aktiven zapis [9] Slika 2.6 Preslikovalnik podatkov [10] Slika 2.7 Diagram zaporedja za vzorec enota dela [10] Slika 2.8 Diagram zaporedja za vzorec slovar identitet [10] Slika 2.9 Prikaz nalaganja na zahtevo [10] Slika 2.10 Preslikava asociacije ena-mnogo [10] Slika 2.11 Preslikovanje asociacije mnogo-mnogo [10] Slika 2.12 Ena tabela za vse razrede [12] Slika 2.13 Tabela na konkreten razred [12] Slika 2.14 Tabela na razred [12] Slika 2.15 Preslikovanje z uporabo meta podatkov [10] Slika 2.16 Zgradba povpraševalnega objekta [10] Slika 3.1 Arhitektura ogrodja LINQ [17] Slika 3.2 Grafično orodje za načrtovanje LINQ to SQL entitet znotraj Visual Studia Slika 3.3 Arhitektura ogrodja NHibernate [24] Slika 3.4 Arhitektura ogrodja ADO.NET Entity Framework Slika 3.5 Grafično orodje za načrtovanje entitetnega podatkovnega modela Slika 3.6 Struktura meta podatkov Slika 4.1 Primerjava hitrosti izvedbe povpraševanja Slika 4.2 Povprečen čas izvedbe vnosa, posodobitve in izbrisa... 79

12 X SEZNAM PRIMEROV Primer 2.1 Navigacija v C# in SQL... 5 Primer 2.2 Dostop do podatkov v ADO.NET z uporabo razreda DataReader... 6 Primer 2.3 Dedovanje od specifičnega nadrazreda Primer 2.4 Izdelava objekta s tovarniško metodo Primer 3.1 Sklepanje o tipu spremenljivke Primer 3.2 Inicializacija objektov in zbirk Primer 3.3 Lambda izraz Primer 3.4 Razširljiva metoda Primer 3.5 Razširljive proti statičnim metodam Primer 3.6 Anonimni tip Primer 3.7 Povpraševalni izraz Primer 3.8 Generiran razred Primer 3.9 Dodajanje in odstranjevanje zapisov z uporabo LINQ to SQL Primer 3.10 Opis preslikave v datoteki hbm Primer 3.11 Povpraševanje z jezikom HQL Primer 3.12 Poizvedba z uporabo»query by criteria« Primer 3.13 Poizvedba z uporabo»query by example« Primer 3.14 Izsek iz CSDL sheme Primer 3.15 Izsek iz SSDL sheme Primer 3.16 Izsek iz MSL sheme Primer 3.17 Generirana koda iz EDM Primer 3.18 Poizvedba LINQ to Entities Primer 3.19 Poizvedba z uporabo Entity SQL in objektnih storitev Primer 3.20 Poizvedba z uporabo Entity SQL in graditeljem poizvedb Primer 3.21 Poizvedba z uporabo Entity SQL in ponudnika podatkov na nivoju entitet 56 Primer 3.22 Posodabljanje, vstavljanje in brisanje v ogrodju ADO.NET Entity Framework Primer 4.1 Primer testa za meritev časovne učinkovitosti... 75

13 XI SEZNAM TABEL Tabela 3.1 Standardni povpraševalni operatorji [20] Tabela 3.2 Povpraševalni operatorji in pripadajoča C# sintaksa Tabela 3.3 Osnovni elementi preslikave in njihov pomen Tabela 4.1 Kriteriji»Persistence Ignorance« Tabela 4.2 Izračunane metrike programske kode Tabela 4.3 Primerjava hitrosti izvedbe povpraševanja Tabela 4.4 Primerjava hitrosti izvedbe kompleksnega povpraševanja Tabela 4.5 Primerjava hitrosti nalaganja na zahtevo Tabela 4.6 Učinkovitost izrabe procesorja in pomnilnika Tabela 4.7 Povzetek primerjalnih kriterijev... 80

14 XII UPORABLJENE KRATICE ORM - Object-Relational Mapping DDD - Domain Driven Design ER - Entity-Relationship XML - Extensible Markup Language CLR - Common Language Runtime ADO - ActiveX Data Object SQL - Structured Query Language LINQ - Language Integrated Query HBM - Hibernate Mapping HQL - Hibernate Query Language CQ - Criteria Queries LOC - Lines of Code UML - Unified Modeling Language GoF - Gang of Four POCO - Plain old CLR Object POJO - Plain old Java Object EJB - Entity Java Bean PI - Persistence Ignorance GUID - Global Unique Identifier API - Application Programming Interface LTS - LINQ to SQL CSDL - Conceptual Schema Definition Language SSDL - Storage Schema Definition Language MSL - Mapping Specification Language SUPB - Sistem za upravljanje s podatkovno bazo ESQL - Entity SQL EC - Entity Client

15 Zagotavljanje trajnosti objektov v ogrodju.net Stran 1 1 UVOD Danes si ne moremo predstavljati informacijskih sistemov, ki ne bi bili odvisni od podatkov. V nekaterih primerih so podatki samo začasni in niso shranjeni v podatkovnih bazah, večinoma pa so hranjeni v relacijskih podatkovnih bazah. Za dostop do podatkovne baze obstaja več bolj ali manj uveljavljenih vzorcev in dobrih praks, kako zgraditi robusten, nadgradljiv in preverjen arhitekturni sloj za dostop do podatkov. Eden od teh vzorcev so objektno-relacijski preslikovalniki. Cilj diplomske naloge je razložiti problematiko dostopa do podatkov, ki jih hranimo v relacijskih podatkovnih bazah, in prikazati, kako ta problem naslavljajo objektno-relacijski preslikovalniki. V nadaljevanju diplomske naloge bomo predstavili strukturo OR-preslikovalnikov, pogoste vzorce, ki so uporabljeni pri implementaciji le-teh, in jih umestili v standardno tronivojsko arhitekturo informacijskih sistemov. Poleg tega bomo predstavili domensko usmerjeno načrtovanje in ugotovili, kako OR-preslikovalniki omogočajo tak način razvoja informacijskih sistemov. Po uvodu v teorijo OR-preslikovalnikov bomo predstavili tri ogrodja na programskem ogrodju.net, ki omogočajo objektno relacijsko preslikavo. Izbrali smo tri ogrodja za katera menimo, da so trenutno na tržišču najbolj zrela. Ta tri ogrodja sestavljajo Microsoftov LINQ to SQL, odprtokodni NHibernate in še eno Microsoftovo ogrodje ADO.NET Entity Framework. V tretjem poglavju bomo podrobneje opisali vsako od teh ogrodij in izpostavili njihove pozitivne in negativne lastnosti. Podrobneje si bomo pogledali nekatere novosti, ki so prišle z ogrodjem.net različice 3.5, in kako te pomagajo izdelati boljša povpraševanja. V praktičnem delu smo si zastavili cilj klasificirati kriterije na podlagi katerih bomo izvedli primerjavo. Pri tem se ne bomo omejili samo na kvantitativne kazalnike, ampak bomo upoštevali predvsem kvalitativne lastnosti primerjanih ogrodij. Ti kazalniki bodo služili kot osnova za primerjavo, ki jo bomo izvedli za zaključek praktičnega dela diplomske naloge.

16 Zagotavljanje trajnosti objektov v ogrodju.net Stran 2 2 OBJEKTNO-RELACIJSKI PRESLIKOVALNIKI 2.1 Trajnost podatkov Poenostavljeno lahko trajnost opišemo kot lastnost, da podatki»preživijo«izvajanje aplikacije, ki jih je ustvarila.[1] To je lahko urejevalnik besedil, ki shrani vsebino na trdi disk, in omogoča kasnejše uporabo in spreminjanje. V svetu informacijskih sistemov govorimo o trajnosti podatkov oz. objektov (angl.»object persistence«). Zmožnost hrambe in kasnejšega pridobivanja objektov je ključnega pomena za delovanje sodobnih informacijskih sistemov. Na voljo imamo različne načine, kako in kje hraniti podatke, izpostavili bomo le štiri najpogostejše: [2] pomnilnik, datotečni sistem, objektna podatkovna baza in relacijska podatkovna baza. Pomnilnik Hramba podatkov v pomnilniku mogoče ni tako nesmiselna, kot bi ocenili na prvi pogled. V primeru, da imamo mali podatkovni model, je prednost hrambe podatkov v pomnilniku, da ne potrebujemo orodij za preslikavo objektov v karkoli drugega, kajti že sami objekti in relacije med njimi so shranjeni v pomnilniku. Ne glede na to, kaj hranimo v pomnilniku, vedno obstaja nevarnost prekoračitve velikosti pomnilnika. V večjem podatkovnem modelu in veliki količini podatkov lahko dokaj hitro pride do občutne upočasnitve sistema, ko podatki prekoračijo predvideno velikost. Drugi problem predstavlja izguba podatkov ob izpadu sistema. Načini, kako preprečiti izgubo podatkov, so različni. Lahko zapisujemo vsako spremembo na objektu v dnevnik sprememb in ob ponovni vzpostavitvi sistema preberemo dnevnik, da vzpostavimo prejšnje stanje. To pa je zamudno opravilo in porabi veliko časa in sistemskih virov. Drugi način, kako se obvarujemo pred izgubo, je, da aplikacija v rednih intervalih izdela posnetek

17 Zagotavljanje trajnosti objektov v ogrodju.net Stran 3 podatkov in jih zapiše na datotečni sistem. Ob ponovnem zagonu se naloži zadnji posnetek, ob tem pa tvegamo izgubo podatkov, ki so nastali med zadnjim posnetkom in izpadom sistema. Največji problem predstavlja nezmožnost spreminjanja objektnega podatkovnega modela, kajti za spremembo strukture objekta je potrebno shraniti podatke, odstraniti aplikacijo iz pomnilnika, prevesti izvorno kodo in vzpostaviti prejšnje stanje, pri tem pa upoštevati spremembe, ki so bile narejene. Datotečni sistem Datotečni sistem je dobra izbira za hrambo podatkov, če želimo imeti prenosnost podatkov. Objekte lahko serializiramo v binarni obliki ali z uporabo označevalnega jezika XML (angl.»extensible Markup Language«) in jih prenašamo med različnimi sistemi ali aplikacijami. Serializacija je ena lažje izvedljivih načinov trajne hrambe podatkov, ker razredov ni potrebno prilagajati za namen hrambe. Pri serializaciji se binarni objekt pretvori v strukturiran niz znakov in zapiše v datoteko, od koder ga lahko rekonstruiramo oz. deserializiramo. XML-serializacija je posebna vrsta serializacije, ki zapiše objekt ali drevo objektov v dokument XML. Takšen način se je uveljavil predvsem pri delitvi podatkov preko spleta. Serializirani objekti vsebujejo le vrednosti atributov, ne pa tudi izvedljive kode metod. Tudi tukaj se srečamo s podobnimi problemi, kot pri rešitvi z uporabo pomnilnika, z izjemo velikosti. Trdi diski, CD- ali DVD-ploščki imajo mnogokrat večjo kapaciteto kot pomnilnik, zato omogočajo hrambo večje količine podatkov. Objektne podatkovne baze Objektne podatkovne baze so poizkušale olajšati zagotavljanje trajnosti objektov s tem, da so se izognile preslikavi objektov v neki drug format za hrambo. V objektni podatkovni bazi so shranjeni objekti, ki jih zna podatkovna baza prikazati kot objekte specifičnega objektno orientiranega programskega jezika. [3] Čeprav objektne podatkovne baze zmanjšujejo razmak med objektno orientiranimi programskimi jeziki in načinom hrambe, so vendar zaradi pomanjkanja standardov,

18 Zagotavljanje trajnosti objektov v ogrodju.net Stran 4 povpraševalnih jezikov, integracije in zrelosti ter razširjenosti relacijskih podatkovnih baz še vedno nišni proizvod. Relacijske podatkovne baze Že v uvodu smo omenili, da so kot rešitev za trajno hrambo podatkov danes najbolj razširjene relacijske baze. Razlogi za to so najverjetneje v uveljavljenosti, zaupanju in velikem tržišču, ki ga zasedajo te podatkovne baze. V relacijskih bazah so podatki shranjeni v tabelarični obliki, relacije pa so prikazane kot par primarnega in tujega ključa. [4] Tak način je preverjeno enostaven in dovolj učinkovit za potrebe večine aplikacij. Relacijske podatkovne baze ponujajo vse prednosti, ki jih prejšnje rešitve niso imele. Imajo visok nivo standardizacije, dodelan način povpraševanja z uporabo strukturiranega povpraševalnega jezika (angl.»structured Query Language«ali SQL), podporo transakcijam, možnost hkratnega dostopa do podatkov in še bi lahko naštevali. 2.2 Razlike med relacijskim in objektno orientiranim svetom V prejšnjem poglavju smo ugotovili, da so, kot način trajne hrambe podatkov, še vedno najbolj razširjene relacijske podatkovne baze. Vendar se pri razvoju informacijskih sistemov hitro srečamo z razlikami med objektno orientiranimi programskimi jeziki in relacijsko bazo, kar v literaturi zasledimo pod pojmom objektno-relacijsko impedančno nesorazmerje (angl.»object-relational Impedance mismatch«).[5] [12] Najprej bi izpostavili podatkovne tipe. Podatkovni tipi v ogrodju.net imajo svoje predstavnike v relacijskih bazah, vendar tukaj velikokrat pride do razlik. Za primer naj navedemo niz znakov, ki je v ogrodju.net predstavljen kot System.String. V relacijskih bazah je niz znakov implementiran na različne načine, kot so char, nchar, nvarchar ali text, katerim pa, razen v primeru text, moramo podati še dolžino. Drug tak primer je podatkovni tip za datum in čas System.DateTime, ki ima v relacijskih bazah več tipov, npr. date, time, datetime.

19 Zagotavljanje trajnosti objektov v ogrodju.net Stran 5 Podatkovni tipi v relacijskih bazah so lahko obvezni ali neobvezni. To pomeni, da lahko vstavimo vrednost ali null. Na drugi strani so v ogrodju.net primitivni tipi vrednostni, kar pomeni, da dobijo privzeto vrednost že ob deklaraciji. To pomanjkljivost so razvijalci odpravili z izidom ogrodja.net 2.0, kjer so dodali podporo za neobvezne tipe v programski jezik. Tako lahko uporabimo rezerviran znak? pred deklaracijo spremenljivke in s tem povemo prevajalniku, da tip lahko vsebuje null. Vendar to kasneje zahteva, da pred uporabo spremenljivke preverjamo, ali ima vrednost.[6] Do sedaj opisane razlike so vedno prisotne pri povezovanju z relacijsko podatkovno bazo, ne glede na proizvajalca ali izbrano ogrodje. Še večja razlika se pojavi že pri uporabi osnovnih konceptov objektno orientiranega razvoja. Kot smo opisali že v prejšnjem poglavju, so relacijske podatkovne baze organizirane v tabele. Relacije med njimi so implementirane s parom podvojenih ključev, primarnega in tujega. Podrejeni zapisi imajo, kot tuj ključ, zapisan primarni ključ glavnega zapisa, in tako»kažejo«na njim nadrejen zapis. V programskem jeziku imamo objekte, ki imajo relacije do drugih objektov, to pa je doseženo tako, da ima objekt referenco na vse z njim povezane objekte. Prav tako je razlika v navigaciji. Medtem ko so v relacijskem modelu vse povezave dvosmerne (za vsak podrejen zapis lahko pridobimo glavnega in obratno), lahko v objektnem modelu sami določimo tip relacije. Relacije so privzeto enosmerne, lahko pa dodamo povratno referenco in tako dobimo dvosmerno relacijo. Primer 2.1 prikazuje različno navigacijo v programskem jeziku C# in relacijsko povpraševalnem jeziku SQL. C#: narocilo.narocnik.naziv SQL: SELECT Naziv FROM Narocniki WHERE NarocnikId = ( SELECT NarocnikId FROM Narocila WHERE NarociloId Primer 2.1 Navigacija v C# in SQL Nazadnje moramo omeniti še dedovanje kot enega od osnovnih konceptov OO-razvoja. Relacijske podatkovne baze ne podpirajo dedovanja v takšnem pomenu, kot ga poznamo iz

20 Zagotavljanje trajnosti objektov v ogrodju.net Stran 6 programskih jezikov, obstajajo pa vzorci, kako to razreševati. Te vzorce bomo opisali v kasnejšem poglavju. Kot smo spoznali, obstaja velika razlika med objektnim in relacijskim svetom. Zaradi tega so bili razvijalci prisiljeni v objektne modele vnašati specifike relacijskih podatkovnih baz in obratno. Tipičen primer tega so relacije mnogo-mnogo in dedovanje. Tako je trpel ali podatkovni ali razredni model informacijskega sistema. 2.3 Objektno relacijsko preslikovanje Običajno se v arhitekturi informacijskih sistemov zgradi poseben nivo, ki je zadolžen za komunikacijo z viri podatkov in pretvarjanjem surovih podatkov v objekte. V ogrodju.net se ta nivo najpogosteje gradi s pomočjo programskega modela ADO.NET. Modelno ogrodje ADO.NET ali»activex Data Objects za ogrodje.net«je osnovni način dostopa do podatkov, vključuje vse potrebne razrede in knjižnice za povezavo s podatkovnim virom in pridobivanje ter manipulacijo podatkov.[7] Primer 2.2 prikazuje dostop do podatkov z uporabo razreda DataReader, ključnega dela ogrodja ADO.NET. SqlConnection c = new SqlConnection( ); c.open(); SqlCommand cmd = new c.name, c.phone, c.dateofbirth FROM Customers c WHERE c.city ); cmd.parameters.addwithvalue("@po", "London"); DataReader dr = c.execute(cmd); while (dr.read()) { string name = dr.getstring(0); string phone = dr.getstring(1); DateTime date = dr.getdatetime(2); } dr.close(); Primer 2.2 Dostop do podatkov v ADO.NET z uporabo razreda DataReader Pri tem načinu dostopa do podatkov morajo razvijalci slej ko prej zapisati SQL-stavek, ki dostopa do podatkov. Pri tem naletimo na težavo, saj so SQL-poizvedbe zapisane v nizu, kjer nimamo podpore prevajalnika. Tako ne moremo preveriti, ali atribut v tabeli zares

21 Zagotavljanje trajnosti objektov v ogrodju.net Stran 7 obstaja, kajti sintaktične napake se pojavijo komaj pri izvajanju kode, kar otežuje testiranje in odpravo napak. Nadaljnja težava so parametri, ki jih prejme SQL-poizvedba, saj ti niso strogo tipizirani. Lahko se zgodi, da razvijalec pozabi vpisati parameter, ali pa vpiše napačno ime. Tudi tukaj aplikacija proži napako šele v času izvajanja. Zadnji problem, ki ga vidimo pri tem pristopu, je podatkovni tip, ki ga vrača razred DataReader. Le-ta se mora namreč ujemati s podatkovnim tipom v tabeli in smo spet odvisni od natančnosti razvijalca, ali uporablja metodo, ki vrača ustrezen tip. Rešitev za te probleme ponujajo objektno relacijski preslikovalniki (angl.»object relational mapping«). Po definiciji so objektno relacijski preslikovalniki, ali ORM programska tehnika za avtomatsko preslikavo podatkov med relacijski podatkovnimi bazami in objekti, z uporabo meta podatkov, ki opisujejo povezavo med objekti in tabelami, kot prikazuje slika 2.1 Slika 2.1[8]. Ogrodja ORM transformirajo podatke iz ene oblike v drugo in obratno, pri tem avtomatsko izdelajo SQL na podlagi meta podatkov. Slika 2.1 Shematski prikaz ORM Ogrodje ORM je sestavljeno iz naslednjih komponent: [8] Knjižnice za izvajanje osnovnih operacij, kot so ustvari, preberi, uredi in briši. Jezika ali knjižnice za izvajanje povpraševanj. Vmesnika za urejanje meta podatkov. Načina, kako omogočiti različne načine optimizacije, kot so nalaganje na zahtevo, transakcije, Zakaj torej izbrati rešitev ORM? Razlogov je več, našteli bomo samo najpomembnejše: Produktivnost Ročno kodiranje dostopa do podatkovne baze je delovno intenzivno. V [8] avtorji navajajo, da je približno 30 % celotne kode potrebne samo za dostop do podatkov, ki so shranjeni v podatkovni bazi. Če ob tem upoštevamo, da so to ponavljajoči se vzorci SQL-poizvedb in

22 Zagotavljanje trajnosti objektov v ogrodju.net Stran 8 manipulacij, ter da je navadno pokritost tega dela kode s testi nizka, lahko predpostavimo, da bodo ogrodja ORM zmanjšala vnos napak in zvišala produktivnost. Vzdrževanje Sistem z manjšim številom vrstic kode ali LOC (angl.»line of Code«) je zagotovo lažje vzdrževati. Ogrodja ORM omogočajo osredotočenje razvijalcev in načrtovalcev na domeno in problem, ki ga rešujejo. Pri tem spodbujajo uporabo vzorcev, vse to pa pripelje do preglednejše kode, ki jo je lažje vzdrževati. Poleg tega so sistemi, ki uporabljajo vmesni sloj ORM, bolj neodvisni od sprememb na obeh slojih. Tako lahko normaliziramo podatkovno bazo in to ne vpliva na objektni model in obratno, spremembe na objektnem nivoju ne pomenijo takojšne spremembe podatkovnega modela. Potrebno je spremeniti le meta podatke, ki povedo, kako se objekti preslikajo v tabele. Hitrost Pogost pomislek pri odločitvi o uporabi ORM je hitrost. Seveda, ročno kodiran dostop do podatkovne baze je zagotovo hitrejši od preslikovalnika, vendar je to enako, kot bi rekli, da je program, napisan v zbirnem jeziku, hitrejši od programa, napisanega v C#. To je seveda res, ampak če pogledamo trud, ki je potreben za pisanje programov v zbirnem jeziku in višjem programskem jeziku, ugotovimo, da je prevelik za majhno razliko, ki jo pridobimo pri hitrosti. Enako velja za ogrodja ORM. Zagotovo ne bodo nikoli tako hitra, kot ročno kodiran dostop, a moramo upoštevati trud, ki ga prihranijo. V tem poglavju smo spoznali koncept objektno relacijskih preslikovalnikov, njihovo zgradbo in lastnosti. V naslednjem poglavju bomo predstavili, kako se ORM ogrodja vključujejo v trinivojsko arhitekturo informacijskih sistemov. 2.4 Podatkovni sloj Trinivojska arhitektura temelji na ločevanju informacijskih sistemov na nivoje. Ti nivoji so med seboj šibko sklopljeni, kar pomeni, da posamezen nivo komunicira le s spodaj ležečim nivojem, pri čemer je odvisen le od vmesnika. To zagotavlja šibko sklopljenost med nivoji,

23 Zagotavljanje trajnosti objektov v ogrodju.net Stran 9 kar pomeni, da sprememba programske kode enega nivoja ne zahteva sprememb v drugih nivojih. Nivoji, kot prikazuje slika 2.2, so tipično razdeljeni na: [8] Predstavitveni nivo vsebuje razrede za delo z uporabniškim vmesnikom. Nivo poslovne logike vključuje poslovna pravila in operacije nad poslovnimi entitetami. Podatkovni nivo je odgovoren za shranjevanje in pridobivanje podatkov iz ene ali več podatkovnih zbirk. Ta nivo vsebuje tudi model poslovnih entitet. Podatkovna zbirka obstaja zunaj informacijskega sistema. Če je to relacijska podatkovna baza, potem vsebuje relacijske tabele in shranjene procedure. Pomožni razredi vsaka aplikacija ima nabor pomožnih razredov, ki niso v nobenem horizontalnem nivoju, ampak so na voljo vsem nivojem. Sem na primer spadajo razredi za beleženje in izjeme. Predstavitveni nivo Nivo poslovne logike Pomožni razredi Podatkovni nivo Podatkovna baza Slika 2.2 Trinivojska arhitektura [8] Ogrodja ORM in z njimi povezan objektni model se uvrščajo v spodnji podatkovni nivo. 2.5 Domensko usmerjeno načrtovanje in vzorci ORM Govoriti o ORM, ne da bi omenili domensko usmerjeno načrtovanje (angl.»domain Driven Design«) ali DDD, je skorajda nemogoče, kajti ta dva pojma sta tesno povezana. Z uporabo ogrodij ORM preselimo velik del načrtovanja, ki je bil prej usmerjen v podatkovni model (entitetno-relacijski model), nazaj na domeno, ki jo z aplikacijo naslavljamo. Ni se

24 Zagotavljanje trajnosti objektov v ogrodju.net Stran 10 treba ubadati z vprašanji, kako bo normalizacija vplivala na razredni diagram ali kako bo nova relacija med objekti vplivala na entitetno-relacijski model. Domensko usmerjeno načrtovanje je zbirka konceptov in vzorcev, ki pomagajo strukturirati domenski model aplikacije, ki je jedro vsakega informacijskega sistema in predstavlja abstrakcijo poslovnega sveta s pripadajočimi pravili in omejitvami. [9] Fokus razvoja se tako preseli na domeno, ki jo z rešitvijo naslavljamo. To omogoča, da ustvarjamo fleksibilne, nadgradljive in kakovostne rešitve. Poleg tega dober model domene omogoča lažjo komunikacijo z naročnikom. Razvijalci se že od nekdaj poslužujejo diagramov in modelov za lažje razumevanje in komunikacijo z naročniki. Tako tudi DDD dopolnjuje že znane tehnike, kot so primeri uporabe v modelirnem jeziku UML (angl.»unified Modeling Language«). Razvijalci le redko poznajo poslovno področje tako natančno, da ne bi potrebovali nobenega modela, v večini primerov si šele pridobivajo potrebna znanja in pri tem so modeli nepogrešljivi. V nadaljevanju bomo predstavili nekaj vzorcev objektno-relacijskih preslikovalnikov, povzetih po [10] in [9]. Razdeljeni so v pet skupin, glede na njihovo področje uporabe Vzorci domenske logike Domenska logika je najpomembnejši del informacijskega sistema, kajti tam je zajeto poslovanje podjetja. V tem delu sta opisana vzorca za delo in organizacijo domenske logike. Domenski model Pri razvoju informacijskih sistemov se srečujemo s kompleksnostjo poslovnega področja, ki ga sistem naslavlja. Za abstrakcijo tega se uporablja vzorec domenski model, ki predstavlja objektni model. Ta vključuje tako vedenjske vzorce, kot tudi podatke s katerimi operira.

25 Zagotavljanje trajnosti objektov v ogrodju.net Stran 11 Pogodba PriznaniPrihodki(in datum) IzračunPremij() * 1 Proizvod IzračunPremij(in Pogodba) 1 Strategija Izračuna Strategija Celostnega Izračuna Slika 2.3 Domenski model [10] Če se pri razvoju odločimo za uporabo vzorca domenski model, to pomeni, da v arhitekturo informacijskega sistema vnesemo nov sloj objektov, ki posnemajo podatke in poslovna pravila, ki operirajo z njimi. Domenski model je večinoma zelo podoben podatkovnemu, a vseeno obstajajo poglavitne razlike. Domenski model namreč spoji podatke in procese, ima večvrednostne atribute, kompleksno mrežo povezav in uporablja dedovanje in polimorfizem. Ločimo dva tipa domenskih modelov. Enostavnega, ki je zelo podoben podatkovnemu modelu in večinoma vsebuje samo en objekt na tabelo, in bogatega, kjer se model močno razlikuje od podatkovnega. V takem modelu srečamo dedovanje, gosto prepletanje objektov, strategijo in druge vzorce iz kataloga Gang of Four. V prvem primeru se za dostop do baze uporablja vzorec aktiven zapis, medtem ko je v bogatem modelu treba uporabiti vzorec preslikovalnik, ki omogoča neodvisnost domenskega od podatkovnega modela. V domenskem modelu najdemo naslednje konstrukte: [9] entitete, vrednostne objekte, storitve, agregate,

26 Zagotavljanje trajnosti objektov v ogrodju.net Stran 12 tovarne in repozitorije. Entitete so osnovni gradniki domenskega modela in predstavljajo abstrakcijo predmetov v realnem svetu. Njihova glavna značilnost je identiteta, ki ločuje posamezne primerke med seboj, in ne vrednost atributov. Tako tudi v realnem življenju človeške identitete ne določajo ime, priimek in naslov, ampak nekaj več. Kljub enakemu poimenovanju besede entiteta v entitetno-relacijskem modelu, ta ne predstavlja enakega pojma. Kajti v ERmodelu je vsaka konceptualna predstavitev tabele entiteta. V domenskem modelu je entiteta lahko le abstrakcija neke stvari v realnem svetu. Pogosto želimo entitete podrobneje opisati, a ne želimo dodati neskončnega števila atributov v entiteto, kajti zaradi tega bi lahko postal model nepregleden. Rešitev za to so vrednostni objekti. To so objekti, ki so zelo podobni entitetam, vendar jim manjka poglavitna značilnost, to je identiteta. Ti objekti služijo za podrobnejši opis entitet in so brez njih neuporabni, saj jim komaj identiteta entitete da pomen. Tako si lahko predstavljamo entiteto vozilo v informacijskem sistemu proizvajalca avtomobilov in vrednostni objekt dodatna oprema. Dodatna oprema v tem primeru podrobneje opisuje vozilo, a brez vozila ostane popolnoma brez pomena. Storitve ali (angl.»services«) so objekti, ki ne hranijo stanja, a so vseeno nepogrešljivi v domenskem modelu, saj izvajajo neko aktivnost. To so po navadi statični objekti, katerih funkcionalnost ne sodi v entitete ali vrednostne objekte. Poleg navadnih povezav med objekti, ki jim pravimo asociacije, zasledimo v domenskem modelu tudi močnejše asociacije, to so agregacije. Agregacija pove, da en objekt pripada drugemu in le tako lahko tvorita celoto oz. agregat. Tako lahko za prejšnji primer vozila izpeljemo agregat vozilo, ki je sestavljeno iz motorja, menjalnika, podvozja in koles. Agregati so pogosto povezani s tovarnami, saj je izdelava agregatov lahko težavno. Tovarna ali tovarniška metoda (angl.»factory method«) je uveljavljen vzorec GoF, ki je namenjen izdelavi objektov oz. skupine objektov. Kadar želimo skriti kompleksnost izdelave objektov ali želimo manjšo sklopljenost med entitetami, uporabimo tovarno.

27 Zagotavljanje trajnosti objektov v ogrodju.net Stran 13 Repozitoriji so uveljavljen način, kako pridobivamo podatke iz podatkovnega vira. Služijo kot vmesni sloj do podatkovne baze. Če imamo domenski model, neodvisen od podatkovne baze, v njem zagotovo zasledimo veliko število repozitorijev, saj ti služijo kot enkapsulacija dostopa do podatkovnega vira. Repozitorij mora vključevati funkcionalnost za iskanje in rekonstrukcijo objektov iz podatkovnega vira ter popravljanje in brisanje podatkov v podatkovni vir. Modul tabele Pogodba IzračunPremij(in ID) Proizvod TipProizvoda(in ID) Izračun Vstavi(in ID, in Vsota, in datum) PriznaniPrihodki(in kontaktid, in datum) Slika 2.4 Modul tabele [10] Ena glavnih prednosti pri objektno orientiranih jezikih je, da združimo podatke in operacije, ki se izvajajo nad njimi. Problem pri domenskih modelih je vmesnik do relacijskih podatkovnih virov. Posledično je potrebno vložiti mnogo truda, da transformiramo podatke iz ene oblike v drugo. Zato vzorec modul tabele organizira domenska pravila z enim razredom na tabelo v podatkovni bazi. Tako ena instanca razreda vsebuje vse potrebne operacije, ki se bodo izvajale nad podatki. Poglavitna razlika med tem vzorcem in domenskim modelom je v tem, da če imamo več naročil, bomo v domenskem modelu imeli več objektov, kjer bo vsak predstavljal eno naročilo, medtem ko bomo imeli v modulu tabele samo en objekt, ki bo skrbel za vsa naročila. To ima za posledico, da moramo pri klicu metode podati neki argument, po navadi identifikator oz. primarni ključ tabele, ki enolično določa podatke, nad katerimi operiramo.

28 Zagotavljanje trajnosti objektov v ogrodju.net Stran 14 Modul tabele je preprostejši vzorec in ne omogoča uporabe vseh konceptov objektno orientiranega razvoja, zato če želimo reševati kompleksnost poslovnega področja z uporabo polimorfizma in dedovanja, ta vzorec ni primeren in se priporoča uporaba domenskega modela v kombinaciji z vzorcem aktiven zapis. Če delujemo večinoma nad tabelaričnimi podatki in imamo enostavno poslovno področje, se lahko poslužimo modula tabele Vzorci dostopa do podatkov V tem poglavju bomo opisali vzorca, kako dostopati do podatkovne baze. To sta aktiven zapis in preslikovalnik podatkov. Aktiven zapis Oseba Ime Priimek DatumRojstva Vstavi() Posodobi() Izbriši() SocialniPrispevek() DavčneDajatve() Slika 2.5 Aktiven zapis [9] Vzorec aktiven zapis (angl.»active Record«) je zelo podoben modulu tabele, le da to ni načrtovalski vzorec, ampak spada v kategorijo vzorcev za dostop do podatkov. Aktiven zapis združuje podatke, operacije poslovne logike in metode za nalaganje in shranjevanje podatkov iz podatkovnega vira. Funkcionalnosti, ki jih premore aktiven zapis, so: [10] Konstruiranje instanc objekta iz zapisa tabele; izdelava primerkov objekta za kasnejše vstavljanje v PB; statična iskalna metoda, ki združuje pogosto uporabljena povpraševanja in vrača primerke objektov; izvajanje osnovnih operacij nad podatkovno bazo, kot so vstavi, posodobi in izbriši; pridobi in nastavi vrednost atributov; implementacija dela poslovne logike.

29 Zagotavljanje trajnosti objektov v ogrodju.net Stran 15 Pri implementaciji tega vzorca je potrebno natančno ujemanje strukture razreda s strukturo relacijske tabele, tako naj ima vsak atribut v tabeli svoj par v atributu razreda. Tuji ključi so lahko predstavljeni kot podatek, lahko pa vračajo ustrezen aktiven zapis referencirane tabele, kot je opisano v vzorcu preslikovalnik asociacij. V tem vzorcu so razredi preprosti in ne skrivajo pogleda na podatkovno bazo, zato se tudi ne uporabljajo z drugimi objektno orientiranimi vzorci. Poleg tega tak pristop ne omogoča šibke sklopljenosti, saj je objektni model zelo odvisen od podatkovnega. Preslikovalnik podatkov Oseba Ime Priimek DatumRojstva SocialniPrispevek() DavčneDajatve() Oseba Preslikovalnik Vstavi() Posodobi() Izbriši() Slika 2.6 Preslikovalnik podatkov [10] Vzorec preslikovalnik je osrčje vsakega ORM, ne glede na to, katero ogrodje izberemo. Preslikovalnik ustvari vmesni sloj med objekti domenskega modela in podatkovno bazo ter ju tako naredi neodvisna drug od drugega. Z ločitvijo teh slojev dosežemo večjo neodvisnost in manjšo odvisnost od sprememb, na primer normalizacijo tabel v podatkovni bazi, uporabo zbirk ali dedovanja v programskem jeziku. Ločitev objektnega modela od podatkovnega vira je torej glavna naloga preslikovalnika, pri tem pa se pojavi kar nekaj težav. Preprosti preslikovalnik bi preslikal tabelo v ekvivalenten razred, vendar stvari pogosto niso tako enostavne. Preslikovalnik potrebuje vrsto strategij, kako preslikati razrede, ki se preslikajo v več tabel, ali razrede, ki uporabljajo dedovanje. Pri vstavljanju in posodabljanju podatkov mora preslikovalnik zaznati, kateri objekti so se spremenili in kateri so bili na novo izdelani, ter spremembe ustrezno izvesti nad podatkovnim virom. Pri tem lahko uporabi vzorec enota dela, ki je primeren za reševanje tega problema.

30 Zagotavljanje trajnosti objektov v ogrodju.net Stran 16 Preslikovalnik potrebuje dostop do podatkov v domenskih objektih. Pogosto to predstavlja težavo, kajti za to potrebujemo javno dostopne atribute, kar pa je v lahko v nasprotju s poslovno logiko. Preproste rešitve za ta problem ni, se pa pogosto rešuje z uporabo refleksije, a ta močno upočasni delovanje sistema. V glavnem poznamo dva načina, kako je implementiran preslikovalnik in shranjevanje podatkov o preslikavi. Enostavnejši način je, da v kodi zapišemo preslikavo. To zahteva, da imamo preslikovalnik za vsak domenski objekt. Tak preslikovalnik ima v kodi zapisane poizvedbe SQL, ki jih polni z ustreznimi podatki iz objekta. Alternativa je uporaba preslikovanja z uporabo meta podatkov, ki jih hranimo v razredu ali posebni datoteki. Ta vzorec, ki je podrobneje opisan kasneje, omogoča, da imamo samo en preslikovalnik za vse domenske objekte Objektno-relacijsko vedenjski vzorci Objektno-relacijski vedenjski vzorci opisujejo obnašanje ogrodij ORM in vsebujejo napotke, kako implementirati določeno funkcionalnost. Enota dela Pri delu s podatkovnim virom, kjer pridobivamo, spreminjamo, brišemo in dodajamo objekte, je pomembno, da sledimo spremembam in jih nato vse shranimo. Za to skrbi vzorec enota dela (angl.»unit of Work«). Seveda lahko prožimo spremembo na podatkovni bazi ob vsaki spremembi objekta, vendar tak način privede do velike količine dostopov do podatkovne baze, kar se izkaže kot zelo počasno. Poleg tega bi pri uporabi transakcij morali držati to odprto za daljši čas, kar bi pomenilo, da nekateri zapisi ostajajo zaklenjeni.

31 Zagotavljanje trajnosti objektov v ogrodju.net Stran 17 Odjemalec Podatkovna baza Enota dela new (ID) : Kupec select nastavi limit objekt spremenjen shrani vse update shrani Slika 2.7 Diagram zaporedja za vzorec enota dela [10] Enota dela beleži vse, kar delamo z objekti v okviru poslovne transakcije. Ko smo končali, ugotovi vse spremembe in jih posreduje podatkovni bazi. Slovar identitet Slovar identitet je pomemben vzorec, saj skrbi, da se objekt, ki predstavlja en zapis v podatkovni bazi, naloži samo enkrat. Vzrok za to je različno razumevanje identitete. V relacijskem svetu je identiteta zapisa določena s primarnim ključem, na drugi strani v objektnem svetu se objekti med seboj ločijo glede na pomnilniški naslov v pomnilniku. Če bi dopustili, da se objekt izdela več kot enkrat, bi prišlo do konceptualne napake, saj bi različna objekta predstavljala konceptualno enak zapis.

32 Zagotavljanje trajnosti objektov v ogrodju.net Stran 18 Iskalec Slovar identitet Podatkovna baza najdi(1) najdeno = vrni(1) [najdeno!= null] najdeno [najdeno == null] select where ID = 1 Slika 2.8 Diagram zaporedja za vzorec slovar identitet [10] Da bi zagotovili samo enkratno ustvarjanje objektov, uporabimo vzorec slovar identitet. Ta vzorec hrani referenco na vse objekte, ki jih je preslikovalnik prebral iz baze. Tako preslikovalnik najprej preveri slovar, ali že objekt obstaja, in takrat vrne referenco, če ne, poišče ustrezen zapis v bazi, izdela objekt in ga shrani v slovar. Nalaganje na zahtevo Pri nalaganju podatkov iz podatkovne baze v pomnilnik je včasih dobro, da naložimo objekte komaj, ko jih zares potrebujemo. Zgodi se lahko, da želimo operirati samo z nekaj objekti in ne s celotnim drevesom objektov. Tako zmanjšamo obremenjenost podatkovne baze in zagotovimo koristnejšo porabo pomnilnika. pridobi naročila : Kupec Podatkovna baza [naročina niso naložena] select naročila naročila Slika 2.9 Prikaz nalaganja na zahtevo [10]

33 Zagotavljanje trajnosti objektov v ogrodju.net Stran 19 Za implementacijo tega vzorca se lahko uporablja inicializacija na zahtevo. Pri tem načinu so privzeto vse reference nastavljene na null. Ko zahtevamo objekt, se preveri ali ima objekt vrednost, če ne, se naloži iz podatkovne baze. Tak pristop se zdi enostavnejši, vendar ima svoje pomanjkljivosti. Tako moramo enkapsulirati dostop do podatkov samo z metodami ali atributi tudi znotraj razreda, saj lahko samo tako naložimo potrebne objekte. Drug problem se pojavi, če je vrednosti null dovoljena ali celo predvidena. V tem primeru moramo uvesti posebno vrednost, ki predstavlja vrednost null. Druga rešitev, ki je morda bolj primerna, je uporaba vzorca namestnika iz kataloga Gang of Four. Namestnik je objekt, ki zgleda kot objekt, ki naj bi ga predstavljal, a ne vsebuje nič. Podatki se iz baze naložijo šele ob prvem proženju. [11] Objektno-relacijski strukturni vzorci V tem predelu bomo opisali vzorce, kako se preslikajo določene strukture iz objektnega sveta v relacijskega. Preslikovanje asociacij Asociacije so osnovna značilnost objektnih jezikov. V splošnem poznamo tri vrste asociacij, ki jih ločimo glede na števnost. Tako lahko imamo asociacije ena proti ena, ena proti mnogo in mnogo proti mnogo. Le-te se dajo preprosto implementirati z uporabo referenc ali zbirk. V svetu relacijskih podatkov smo žal bolj omenjeni. Tu imamo samo povezavo primarnega in tujega ključa, ki predstavljata relacijo ena proti mnogo. Naloga vzorca preslikovanje asociacij je torej zagotoviti transparenten prenos relacij med tabelami v podatkovni bazi v ustrezne zbirke ali reference v razredih in obratno. Pri relaciji ena proti mnogo to naredimo z zamenjavo tujega ključa z referenco na objekt, ki mu ta ključ pripada, ali izdelamo zbirko podrejenih objektov, ki jih dobimo s povpraševanjem po tujem ključu.

34 Zagotavljanje trajnosti objektov v ogrodju.net Stran 20 Album Naslov : string 1 * Skladba Naslov : string Albumi PK ID Naslov Skladbe PK ID Naslov FK1 AlbumID Slika 2.10 Preslikava asociacije ena-mnogo [10] Večji problem se pojavlja pri relacijah mnogo proti mnogo, saj te v relacijski bazi ne moremo predstaviti tako enostavno. Zato moramo izdelati vmesno tabelo, ki vsebuje tuja ključa povezanih tabel. V tem primeru mora preslikovalnik poskrbeti, da se relacije med objekti ustrezno pretvorijo v zapise vmesne tabele. Pri tem ni treba, da ima vmesna tabela objektno predstavitev v pomnilniku. Zaposlen Področje * * Zaposleni PK ID ZaposlenPodročje PK,FK1 ZaposlenID PK,FK2 PodročjeID Področje PK ID Slika 2.11 Preslikovanje asociacije mnogo-mnogo [10] Preslikovanje generalizacije Dedovanje ali generalizacija je prvina objektno orientiranih programskih jezikov. Omogoča gradnjo hierarhije razredov, pri čemer podrejeni razredi podedujejo atribute in metode nadrazredov. To je učinkovit način zagotavljanja ponovne uporabe kode in nepogrešljiv v sodobnih informacijskih sistemih. Skozi zgodovino so se uveljavili trije načini, kako razreševati dedovanje v relacijskih bazah. Ti so: Ena tabela za vse razrede

35 Zagotavljanje trajnosti objektov v ogrodju.net Stran 21 Račun Račun Transakcijski račun Varčevalni račun Elektronski račun Slika 2.12 Ena tabela za vse razrede [12] Pri tej rešitvi imamo v podatkovni bazi samo eno tabelo za vse objekte iz hierarhije dedovanja. Ta tabela vsebuje atribute ob vseh razredov in še dodaten ločilni atribut. Ta atribut loči med različnimi tipi objektov, tako da se preslikovalnik na podlagi te vsebine odloči, kateri objekt izdela in s katerimi podatki ga napolni. Razlog za uporabo te rešitve v ogrodjih ORM je preprostost, kajti v tem primeru ne potrebujemo povezovanja tabel med seboj. Čeprav je ta rešitev najpogosteje uporabljena, ima vseeno svoje pomanjkljivosti. Kot prvo bi omenili hitro naraščanje števila atributov z večanjem števila razredov v strukturi. Poleg tega opazimo, da so vsa polja nadrazredov označena kot neobvezna. Tabela na konkreten razred Račun Varčevalni račun Elektronski račun Transakcijski račun Transakcijski račun Varčevalni račun Elektronski račun Slika 2.13 Tabela na konkreten razred [12] Ta način preslikovanja razredov v tabele je najpogosteje uporabljen pri ogrodjih ORM. Prednost te rešitve je predvsem preprostost implementacije, saj naredimo tabelo za vsak konkreten razred. V primerjavi s prejšnjo rešitvijo je ta manj občutljiva na spremembe. Na primer, če želimo dodati nov razred v hierarhijo, je potrebno izdelati novo tabelo.

36 Zagotavljanje trajnosti objektov v ogrodju.net Stran 22 Težava te rešitve je podvajanje podatkov in polimorfizem. Tako moramo podatke iz abstraktnega razreda prepisati v vsako konkretno tabelo. Še večji problem se pojavi pri relacijah, ki so vezane ne abstraktni razred, saj je lahko teh kar hitro nepregledno mnogo. Tabela na razred Račun Račun Transakcijski račun Elektronski račun Varčevalni račun Transakcijski račun Varčevalni račun Elektronski račun Slika 2.14 Tabela na razred [12] Kot je razvidno iz imena, je pristop tabela na razred zelo podoben prejšnjem pristopu, le da imamo za vsak razred v hierarhiji svojo tabelo. Podrazredi so z abstraktnim razredom povezani z relacijo. Ta pristop je dober, ker omogoča polimorfizem ter ne podvaja podatkov, je pa težji implementacijo v ogrodju ORM, saj zahteva večjo kompleksnost pri povpraševanju Objektno-relacijski vzorci za preslikovanje z uporabo meta podatkov Naslednji del opisuje OR-preslikovalnike, ki za preslikavo uporabljajo meta podatke. Ti podatki so lahko implementirani na različne načine, kot so dokumenti XML ali v obliki programske kode. Preslikovanje z uporabo meta podatkov Preslikava podatkov Ime razreda Ime tabele 1 * Preslikava atributov Ime atributa razreda Ime atributa tabele Slika 2.15 Preslikovanje z uporabo meta podatkov [10]

37 Zagotavljanje trajnosti objektov v ogrodju.net Stran 23 Večina kode v ORM ogrodjih skrbi za preslikavo atributov tabel v atribute objektov in obratno. Vzorec preslikovalnik z uporabo meta podatkov zmanjšuje obseg te kode, saj omogoča razvijalcu, da opiše preslikavo v obliki meta podatkov. Načina uporabe meta podatkov sta dva. Prvi uporablja generator kode, ki kot vhodni parameter prejme meta podatke in na njihovi podlagi generira kodo, ki izvaja preslikavo. To je preprostejši način, a pomeni, da je ob spremembi meta podatkov potrebno na novo generirati in prevesti vsaj del izvorne kode informacijskega sistema. Drug način je uporaba refleksije. Tak preslikovalnik prejme meta podatke, ki vsebujejo ime objekta in pripadajoče atribute ter njihovo preslikavo, in iz njih ustrezno napolni objekte s podatki. V tem primeru lahko polno izkoristimo funkcionalnosti, ki jih omogoča refleksija, žal pa se ne moremo izogniti njeni veliki časovni zahtevnosti. Nadaljnja prednost tega načina je, da lahko tak generični preslikovalnik uporabimo na več projektih, brez spremembe izvorne kode. Povpraševalni objekt : Povpraševanje 1 * * : Kriterij Operator = ">" Atribut = "Zaposleni" Vrednost = 0 : Kriterij Operator = "=" Atribut = "Priimek" Vrednost = "Novak" Slika 2.16 Zgradba povpraševalnega objekta [10] Povpraševanja so uveljavljen način, kako pridobimo podatke iz podatkovne baze. Iz relacijskih podatkovnih baz je poznan jezik SQL (angl.»structured Query Language«), ki je namenjen prav temu. Slabost tega jezika je, da operira nad relacijskimi tabelami, kar pomeni, da mora razvijalec poznati strukturo podatkovne baze. Zaradi tega želimo imeti možnost izvajanja povpraševanj na ravni objektov in prav to nudi vzorec povpraševalni objekt (angl.»query Object«).

38 Zagotavljanje trajnosti objektov v ogrodju.net Stran 24 Povpraševalni objekt je implementacija vzorca interpreter iz kataloga GoF, to je struktura objektov, ki se je zmožna preslikati v SQL-poizvedbo. Poizvedbo lahko naredimo z referenciranjem razredov in atributov, ne pa tabel in atributov. Na tak način zagotovimo neodvisnost povpraševanja od podatkovnega modela. 2.6 Neodvisnost modela od ogrodja Princip POCO Zadnje poglavje tega dela bomo posvetili neodvisnosti domenskega modela od izbranega ogrodja za ORM. To je pomembno predvsem glede šibke sklopljenosti med posameznimi nivoji. Če želimo graditi informacijski sistem z uporabo domenskega modela in po načelih domensko usmerjenega načrtovanja, moramo odločitev o izbiri ogrodja preložiti čim bolj na konec. Tako lahko večino časa posvetimo razvoju in izboljšanju domenskega modela. Zaradi tega želimo tudi čim večjo neodvisnost modela od izbranega ogrodja ORM. Že iz javanskih časov je uveljavljen pojem POJO, kar je angleški akronim za»plain Old Java Object«in pomeni, da želimo imeti»čiste«objekte, brez dodatnih vmesnikov, atributov, anotacij ali metod, ki jih vsiljuje ogrodje. Ta termin je našel tudi svojo inačico v ogrodju.net, in sicer POCO. POCO pomeni»plain Old CRL Object«in ima enak pomen kot javanska sopomenka, samo da se nanaša na objekte ogrodja.net.[12] Zagovorniki pristopa POJO oziroma POCO poudarjajo, da želijo razvijati domenski model čisto neodvisno od katerega koli ogrodja. Le s tem bi lahko zagotovili kakovosten in nadgradljiv informacijski sistem, ki bi bil enostavnejši za vzdrževanje.[2] Z nadaljnjim razvojem ogrodij za objektno relacijsko preslikovanje se je pojavila potreba po novem pojmu, ki bi označeval neodvisnost modela od ogrodja. Razlog je tudi v tem, da termin POJO izvira še iz časov pred ORM in se je v preteklosti nanašal na neodvisnost objektov od poslovnih javanskih zrn ali EJB. Jimmy Nilsson v [2] navaja nov pojem, ki morda boljše opisuje neodvisnost komponent, to je»persistence Ignorance«(PI).»Persistence Ignorance«pomeni, da lahko uporabljamo navadne razrede, kjer se osredotočamo na domeno in probleme, ki jih rešujemo, in se ne ubadamo z vidiki, ki jih vsiljuje ogrodje. Lep primer, kako ugotovimo, ali smo dodali v projekt nezaželeno kodo,

39 Zagotavljanje trajnosti objektov v ogrodju.net Stran 25 je, da pogledamo reference projekta. Če knjižnico, je to lahko že kazalec, da smo dodali nezaželeno kodo. ugotovimo, da imamo referenco na drugo V nadaljevanju sledi sedem kriterijev, ki jih definira PI, ki jih ogrodje ne sme izpolnjevati, da domenski model postane neodvisen od ogrodja.[2] Kriteriji»Persistence Ignorance«Dedovanje od specifičnega nadrazreda Pogosta praksa pri ogrodjih je, da morajo razredi dedovati od določenega nadrazreda, ki ga predpisuje ogrodje, zato da lahko uporabljamo funkcionalnost ogrodja. To je prikazano v primeru 2.3. public class Narocilo : PersistentObjectBase { } Primer 2.3 Dedovanje od specifičnega nadrazreda Na prvi pogled to mogoče ne zgleda tako slabo, vendar smo s tem, ko smo dedovali od razreda ogrodja, porabili edino možnost za dedovanje, kajti v ogrodju.net imamo samo enkratno dedovanje. Še večji problem je, če imamo že načrtovan domenski model z uporabo dedovanja in vzorcev GoF, kajti takega modela ni mogoče kar tako preslikati v podatkovno bazo. Poleg tega nadrazred vsebuje še dodatne javne metode, ki so potem vidne razvijalcu, ki uporablja konkretni razred, čeprav tja ne sodijo in lahko povzročijo zmedo. Izdelava primerkov objektov samo s tovarniško metodo Druga pogosta praksa je izdelava primerkov objektov s tovarniško metodo. Ogrodja to uporabljajo za sledenje spremembam na atributih. Tako namesto podanega razreda izdelajo primerek podrazreda, ki vključuje funkcionalnost sledenja in to skrijejo za tovarniško metodo.

40 Zagotavljanje trajnosti objektov v ogrodju.net Stran 26 Načrtovalci podpirajo uporabo vzorca tovarne v domenskih modelih, vendar je nesprejemljivo, da ogrodja predpisujejo uporabo tovarniških metod za izdelavo objektov, kot kaže primer 2.4. Narocilo n = (Narocilo) PersistentObjectFactory.CreateInstance( typeof(narocilo)); Primer 2.4 Izdelava objekta s tovarniško metodo Uporaba posebnih podatkovnih tipov, kot so zbirke Da bi orodja podpirala nalaganje na zahtevo, se velikokrat zahtevajo posebne oblike podatkovnih tipov. Primer tega so zbirke. Uporaba zbirk je zagotovo dobra praksa objektno orientiranega razvoja, vendar bi bilo boljše, če bi ogrodja podpirala privzete zbirke in ne predpisovale svojih. Tako le še znižujejo neodvisnost modela. Novi podatkovni tipi lahko prinesejo novo funkcionalnost. Nekatera ogrodja uporabljajo posebne podatkovne tipe, da sledijo spremembam, ki jih potrebuje vzorec enota dela. Tako se shranjujejo vse spremembe na drevesu objektov in se nato naenkrat shranijo v podatkovno bazo. Implementirati predpisan vmesnik To je podoben kriterij kot dedovanje od specifičnega nadrazreda, vendar tukaj ne rušimo verige dedovanja, ampak implementiramo samo vmesnik. V ogrodju.net ni omejitve, koliko vmesnikov lahko razred implementira, tako da ta kriterij ne predstavlja večje omejitve pri načrtovanju domenskega modela. Večjo težavo lahko imamo pri uporabi vmesnikov, če le-ti predpisuje metode, ki jih mora razred implementirati. Ogrodja predpisujejo vmesnike zaradi različnih razlogov. Nekatera jih imajo zaradi sledenja spremembam, druga pa izkoriščajo vmesnik kot zastavico, kateri objekti se hranijo. Predpisati specifičen konstruktor Še en način, kako ogrodja zagotavljajo dostop do podatkov, je predpisana uporaba specifičnega konstruktorja. Tak konstruktor ni v ničemer povezan z domenskim modelom in služi le ogrodju.

41 Zagotavljanje trajnosti objektov v ogrodju.net Stran 27 Predpisati obvezne specifične atribute Nekatere rešitve ORM zahtevajo, da vnesemo v domenski model specifične atribute, kot so na primer globalni enolični identifikatorji (Guid). Takšna rešitev je moteča in vnaša v razrede nepotrebno kodo. Prepovedana ali obvezna uporaba določenih konstruktov Kot pri primeru za uporabo tovarniške metode lahko ogrodje predpiše obvezno uporabo rezervirane besede virtual pri vseh atributih. Ta rezervirana beseda pomeni, da so lahko metode, atributi, indeksi in deklaracije dogodkov prepisane v dedovanih razredih. [13] Nasproten primer je rezervirana beseda readonly. Če uporabimo to rezervirano besedo na atributu, lahko vrednost tega nastavimo samo v konstruktorju.[14] Ogrodje lahko prepove uporabo te rezervirane besede, ker v nasprotnem primeru ni zmožno spreminjati atributa od zunaj PI ali ne PI? To so včasih le manjše nevšečnosti, ki v splošnem ne vplivajo na arhitekturo sistema. Tako se postavlja vprašanje:»pi ali ne PI?«. Črno-bele rešitve tukaj ni. Zagotovo 100 % neodvisnosti od izbranega ogrodja ne bomo nikoli dosegli, kajti vse, kar je ekstremno, vključuje visoke stroške. Vprašanje je samo, koliko načrtovalske svobode smo pripravljeni žrtvovati za določeno funkcionalnost. Poglejmo si primer: V ogrodjih ORM se pogosto pojavi odločitev, ali shraniti spremembe objekta na koncu nekega scenarija. Želeli bi, da se objekt shrani samo, če so bili spremenjeni njegovi atributi. Še več, želeli bi, da bi bil objekt sam zadolžen za to, da sporoči enoti dela, da se je atribut spremenil in se v bazi popravijo samo spremenjeni atributi. Ampak to zahteva kršitev pravil PI. Drug način je, da objekt ne signalizira nič, ampak si ogrodje zapomni, kakšno je stanje objekta, ko je bil pridobljen iz baze. Nato ob shranjevanju preveri razlike in po potrebi zapiše spremembe v bazo. Takšna rešitev zahteva več časa in sredstev, saj mora ogrodje z uporabo knjižnic iz imenskega področja System.Reflection preveriti vse atribute objekta za spremembe.[15]

42 Zagotavljanje trajnosti objektov v ogrodju.net Stran 28 3 OGRODJA ORM 3.1 Ogrodje LINQ to SQL Ogrodje LINQ to SQL je del tehnologije LINQ ali Language Integrated Query, kar v prevodu pomeni povpraševanja, vključena v programski jezik. LINQ ponuja nov pristop do podatkov, saj vpelje povpraševanja, kot jih poznamo iz jezikov SQL in XQuery, na nivo programskih jezikov. LINQ je del ogrodja.net 3.5 in ga sestavlja kombinacija knjižnic ali API (angl.»application Programming Interface«) ter razširitev programskih jezikov ogrodja.net. V nadaljevanju bomo predstavili nekatere novosti v programskem jeziku C# 3.0, ki omogočajo uporabo LINQ Dodatki v C# 3.0 Tehnologija LINQ, katere del je tudi ogrodje LINQ to SQL, je vnesla v programski jezik C# kar nekaj novosti. Zato je z ogrodjem.net verzije 3.5 izšla tudi posodobljena različica programskega jezika C#, ki so jo oštevilčili s 3.0. Seveda so za delo z LINQ morali dopolniti tudi prevajalnik. Pri tem je potrebno poudariti, da je izvajalno okolje ostalo enako in se nespremenjeno uporablja že od verzije 2.0. Sklepanje o tipu spremenljivke C# 3.0 ponuja novo ključno besedo, ki omogoča, da deklariramo lokalno spremenljivko, ne da bi pri tem eksplicitno določili njen tip. Tega prevajalnik avtomatsko določi ob prevajanju izvorne kode, tako da besedico var zamenja z ustreznim tipom, ki ga pridobi iz desne strani enačbe. Tako prevajalnik proizvede enako vmesno kodo, ne glede na to ali uporabimo var ali določimo konkreten tip. Primer 3.1 prikazuje različne možnosti uporabe nedoločene spremenljivke. var i = 12; var s = "Zdravo"; var d = 1.0; var oseba = new Oseba(); var seznamoseb = new List<Oseba>(); Primer 3.1 Sklepanje o tipu spremenljivke

43 Zagotavljanje trajnosti objektov v ogrodju.net Stran 29 Kljub temu da nismo konkretizirali tipa podatkovne spremenljivke, imamo polno podporo prevajalnika in IntelliSense v razvojnem okolju Visual Studio Prednost te novosti je predvsem pri uporabi tehnologije LINQ, kjer poizvedbe vračajo IEnumerable<T> ali IQuerable<T>, kar je za razvijalca nepregledno in zato rajši uporablja nedoločen tip var.[16] Drug zelo pogost način porabe je pri iteraciji skozi zbirko s stavkom foreach, kjer lahko uporabimo var namesto konkretnega tipa zbirke. Inicializacija objektov in zbirk Inicializacija objektov omogoča, da določimo vrednost enega ali več atributov v enem stavku. Do sedaj je bilo potrebno atribute inicializirati vsakega posebej v svoji vrstici. Nov način omogoča, da to opravimo na bolj pregleden in krajši način z uporabo inicializacijo objektov, kot prikazuje primer 3.2. var tocka = new Tocka { X = 1, Y = 2 }; var tocka2 = new Tocka("Druga tocka") { X = 7, Y = -3 }; var seznamoseb = new List<Oseba> { new Oseba { Ime = "Janez", LetoRojstva = 1965 } new Oseba { Ime = "Miha", LetoRojstva = 1973 } }; Primer 3.2 Inicializacija objektov in zbirk Nov način poznamo tudi za inicializacijo zbirk. Nova sintaksa omogoča inicializacijo zbirk, ki implementirajo vmesnik IEnumerable in ponujajo metodo Add. Tako lahko na krajši in bolj pregleden način izdelamo seznam oseb, ki že vsebuje nekatere podatke (primer 3.2). Potrebno je poudariti, da je tak način inicializacije le skrajšana in bolj pregledna oblika. Prevajalnik proizvede enako vmesno kodo, kot če bi najprej poklicali konstruktor in nato nastavili atribute v enakem vrstnem redu.[16] Razlog, da so uvedli ta dodaten način, je uporaba anonimnih tipov, ki jih bomo opisali kasneje. Lambda izrazi Lambda izrazi (angl.»lambda expressions«) so nadgradnja delegatov in anonimnih metod, ki jih poznamo že iz ogrodja.net verzije 2.0. Predstavljajo prenos značilnosti funkcijskih jezikov, kot je LISP, v objektno-orientirane, kot je C#, in temeljijo na lambda računu [16].

44 Zagotavljanje trajnosti objektov v ogrodju.net Stran 30 Delegati so poznani že od prve verzije ogrodja.net. Ti so bili nadgrajeni z anonimnimi metodami v verziji 2.0 in so omogočali zgoščen zapis delegata, ki ga ni bilo potrebno eksplicitno poimenovati. Vendar je še vedno bilo potrebno zapisati besedo delegate in parametre, ki jih metoda prejme. Lambda izrazi omogočajo še krajši zapis, saj izpustijo deklaracijo delegata in parametrov. Lambda izraz je sestavljen iz enega ali več parametrov, katerim sledita lambda operator (=>) in izraz. Primer 3.3 prikazuje lambda izraz in ekvivalentno predstavitev v C# 2.0. oseba => oseba.ime == "Janez"; Func<Oseba, Boolean>(oseba) { return oseba.ime == "Janez"; } Primer 3.3 Lambda izraz Razširljive metode Razširljive metode (angl.»extension methods«) omogočajo razvijalcem, da naknadno dodajo metode že definiranim razredom. [16] To so statične pomožne metode, ki jih po navadi definiramo v pomožnih razredih, a delujejo nad podatki določenega objekta. Razširljivo metodo definiramo kot statično metodo, ki ima kot prvi parameter tip, nad katerim izvajamo razširjeno metodo, in ključno besedo this. V primeru 3.4 vidimo razširljivo metodo, ki deluje nad vsemi objekti, ki implementirajo vmesnik IEnumerable<int> in mu doda metodo vsota, ki sešteje vsa števila v zbirki in vrne vsoto. Na koncu primera je prikazana uporaba te razširjene metode nad seznamom števil. static long Vsota(this IEnumerable<int> stevila) { long vsota = 0; foreach (var stevilo in stevila) vsota += stevilo; } return vsota; long vsota = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 }.Vsota(); Primer 3.4 Razširljiva metoda Razširljive metode so ključni del tehnologije LINQ, saj implementirajo vse operacije, ki jih potrebujemo za izvajanje povpraševanj. To so Select, Join, OrderBy, GroupBy, Where

45 Zagotavljanje trajnosti objektov v ogrodju.net Stran 31 in podobne, ki so definirane nad vmesnikom IEnumerable<T>. Če bi razvijalci pri Microsoftu hoteli dopolniti vmesnik IEnumerable<T>, da bi vseboval vse potrebne metode, bi to potegnilo za sabo ogromno kode, saj bi bilo potrebno popraviti tudi vse razrede, ki implementirajo ta vmesnik. Pomožni razredi s statičnimi metodami tudi niso predstavljali rešitve, saj bi nepotrebno oteževali berljivost kode. Poleg tega razširljive metode omogočajo veriženje in zato lažjo berljivost, kot prikazuje primer 3.5. Prikazan razred Enumerable je del LINQ in se nahaja v imenskem prostoru System.Linq. int vsotalihih = stevila.select(stevilo => stevilo % 2 == 1).sum(); int vsotasodih = Enumerable.Sum( Enumerable.Select(stevila, stevilo => stevilo % 2 == 0)); Primer 3.5 Razširljive proti statičnim metodam Anonimni tipi Zadnja novost C# 3.0 so anonimni tipi. Ti omogočajo razvijalcu, da ustvari podatkovni tip, ne da bi za to moral izdelati nov razred. Sintaksa je podobna kot pri inicializaciji objektov, le da izpustimo ime razreda in zapišemo samo new. Pri tem je pomembno, da uporabimo var, kot tip na levi strani enačbe. V kombinaciji z LINQ lahko uporabimo anonimne tipe kot začasne objekte, v katerih shranimo rezultate poizvedb. var kontakt = new { Ime = "Janez", LetoRojstva = 1969 } Primer 3.6 Anonimni tip Čeprav sami nismo definirali razreda, se v ozadju izdela definicija razreda z ustreznimi atributi, ki smo jih definirali. Lahko imamo tudi več primerkov tega razreda, vendar moramo pri instanciranju paziti, da uporabimo enake atribute v enakem vrstnem redu, kajti samo tako bo lahko prevajalnik ugotovil, da gre za primerke enega razreda Arhitektura ogrodja LINQ Arhitektura tehnologije LINQ je ločena na 3 nivoje, kot prikazuje slika 3.1. Na najvišjem nivoju najdemo programske jezike, kot sta C# 3.0 in VB.NET 9.0, ki ponujata dodatke za uporabo z LINQ.

46 Zagotavljanje trajnosti objektov v ogrodju.net Stran 32 Na vmesnem nivoju najdemo knjižnice iz imenskega področja System.Linq, ki služijo za izvajanje poizvedb. Znotraj tega najdemo standardne povpraševalne operatorje, ki jih bomo podrobneje opisali kasneje. Slika 3.1 Arhitektura ogrodja LINQ [17] Tehnologija LINQ omogoča izvajanje povpraševanja nad različnimi podatkovnimi viri. Kot podatkovni vir lahko uporabimo objekte, datoteke XML ali ADO.NET vključene komponente, kot so DataSet-i, SQL podatkovne baze in entitete. LINQ to Objects predstavlja skupno osnovo za vse različice in služi za povpraševanja nad objekti, shranjenimi v pomnilniku. Operira lahko nad poljubno zbirko objektov, ki implementira vmesnik IEnumerable. Za datoteke XML je bil razvit LINQ to XML, ki ponuja razrede za delo z datotekami XML, kot so XDocument, XElement in XAttribute. Z uporabo LINQ lahko učinkovitejše pišemo poizvedbe nad strukturo dokumenta XML, kot sedaj z uporabo XPath. Največ pozornosti bomo posvetili različici LINQ to SQL, vendar moramo kljub temu še omeniti ostali dve različici, ki omogočata dostop do podatkov, shranjenih v relacijski podatkovni bazi. Prva je LINQ to Datasets, ki kot že ime pove, operira nad objekti tipa

47 Zagotavljanje trajnosti objektov v ogrodju.net Stran 33 DataSet. DataSeti so zelo razširjen način predstavitve relacijske tabele v pomnilniški strukturi. LINQ nad DataSeti operira enako kot nad zbirkami objektov, le da ne vrača objektov, ampak ustrezne zapise tabele. Druga možnost je uporaba LINQ to Entities, ki je namenjen povpraševanjem nad entitetami znotraj ogrodja ADO.NET Entity Framework, ki ga bomo podrobneje opisali v kasneje. Povpraševalni operatorji V prejšnjem poglavju smo opisali in prikazali uporabo razširljivih metod. LINQ izkorišča razširjene metode, ki so definirane v razredu System.Linq.Enumerable, za izvajanje povpraševanj. Tem metodam pravimo standardni povpraševalni operatorji in so našteti v tabeli 3.1. Tabela 3.1 Standardni povpraševalni operatorji [20] Skupina Izbira Omejitve Agregacije Pretvorbe Grupiranje Združevanje Razvrščanje Operacije nad množicami Nabor operatorjev Select, SelectMany OfType, Where Aggregate, Average, Count, LongCount, Max, Min, Sum Cast, OfType, ToArray, ToDictionary, ToList, ToLookup, ToSequence GroupBy, ToLookup Join, GroupJoin OrderBy, ThenBy, OrderByDescending, ThenByDescending, Reverse Concat, Distinct, Except, Intersect, Union Povpraševalni izrazi Nov koncept, ki ga uvaja LINQ, so povpraševalni izrazi (angl.»query Expressions«). Ta koncept prinaša v programski jezik možnost, da zapišemo povpraševanja LINQ v poenostavljeni obliki, ki močno spominja na SQL. Tako ni potrebno pisati standardnih povpraševalnih operatorjev enega za drugim z uporabo lambda izrazov, ampak lahko povpraševanje zapišemo v bolj berljivi obliki. var zaposleni = from zaposlen in awcontext.employees where zaposlen.hiredate > DateTime.Parse(" ") orderby zaposlen.contact.lastname ascending, zaposlen.contact.firstname ascending select zaposlen;

48 Zagotavljanje trajnosti objektov v ogrodju.net Stran 34 Primer 3.7 Povpraševalni izraz Ali uporabljamo povpraševalni izraze ali povpraševalne operatorje, je vseeno, saj prevajalnik pri prevajanju izvorne kode avtomatsko spremeni povpraševalne izraze v klice ustreznih povpraševalnih operatorjev. Tabela 3.2 prikazuje nabor povpraševalnih operatorjev, ki jih je mogoče v programskem jeziku C# 3.0 izraziti s povpraševalnimi izrazi. Žal smo pri uporabi povpraševalnih izrazov omejeni le na osnovne operatorje, kot so izbira, omejitev, združevanje, sortiranje in grupiranje. Tabela 3.2 Povpraševalni operatorji in pripadajoča C# sintaksa Povpraševalni operator GroupBy Join OrderBy Select Where C# sintaksa group by join in on equals orderby select where Drevo izrazov Drevo izrazov je posebnost različice LINQ to SQL v primerjavi z ostalimi različicami, saj edino LINQ to SQL deluje nad podatkovno bazo in ne nad pomnilnikom. Zaradi te razlike so se razvijalci odločili, da ta različica ne bo delovala nad IEnumerable, ampak so definirali novi vmesnik IQuerable. [16] Ta implementacija ima za posledico, da se klici povpraševalnih operatorjev ne izvedejo eden za drugim, ampak se gradi drevo izrazov (angl.»expression tree«). To drevo je podobno semantičnim drevesom, ki se uporabljajo pri prevajanju izvorne kode. Tudi tukaj ogrodje analizira zgrajeno drevo in na podlagi tega generira SQL-povpraševanje. To se nato pošlje v obdelavo na podatkovno bazo za obdelavo. Brez tega načina, bi potrebovali mnogo klicev do podatkovne baze za izvedbo povpraševanja. S tem bi po nepotrebnem povečali promet in obremenjevali tako strežnik kot odjemalca. Ne smemo pozabiti omeniti še ene pomembne značilnosti LINQ. To je odloženo izvajanje povpraševanj (angl.»deferred Query Execution«). Za razliko od ostale programske kode, ki se izvede v vrstnem redu, kakor je bila zapisana, se pri LINQ povpraševanja ne izvedejo, dokler se ne sprehodimo skozi rezultate, ali pa izrecno pokličemo metodo ToList ali

49 Zagotavljanje trajnosti objektov v ogrodju.net Stran 35 ToArray.[20] Tako se lahko zgodi, da za isto povpraševanje dobimo različne rezultate, če se je podatkovni vir med tem časom spremenil Preslikava Razvoj ogrodja.net 3.5, katerega del je tudi ogrodje LINQ to SQL, je tesno povezan z razvojem razvojnega okolja Visual Studio 2008, ki vključuje razne pripomočke, ki olajšajo delo z novim ogrodjem. Razen podpore prevajalnika in IntelliSense za pisanje LINQ povpraševanj, vsebuje še grafično orodje za urejanje preslikav med razredi, ki jim pravimo entitete, in tabelami (slika 3.2) ter orodje SqlMetal. Slika 3.2 Grafično orodje za načrtovanje LINQ to SQL entitet znotraj Visual Studia 2008 Grafično okolje omogoča predstavitev in urejanje datotek dbml, ki vsebujejo podatke o entitetah in njihovi preslikavi. Na podlagi te datoteke se za vsako entiteto avtomatično generira delni razred z vsemi atributi, kakor prikazuje primer 3.8. Uporablja se že uveljavljen način generiranja razredov, ki omogoča naknadno dopolnjevanje razredov z lastnimi delnimi razredi, ki vsebujejo specifično kodo.[21] Poleg entitet orodje generira še razred, ki deduje od razreda DataContext.

50 Zagotavljanje trajnosti objektov v ogrodju.net Stran 36 Ta razred služi kot izhodiščna točka za izvajanje povpraševanj, saj vsebuje povezave do zbirk, ki predstavljajo entitete, ki smo jih definirali s pomočjo grafičnega orodja. Poleg tega nudi funkcionalnost, ki je potrebna za vstavljanje in brisanje objektov ter sledenje sprememb na atributih. [Table(Name="HumanResources.Department")] public partial class Department : INotifyPropertyChanging, INotifyPropertyChanged { private static PropertyChangingEventArgs emptychangingeventargs = new PropertyChangingEventArgs(String.Empty); private short _DepartmentID; public Department() { OnCreated(); } [Column(Storage="_DepartmentID", AutoSync=AutoSync.OnInsert, DbType="SmallInt", IsPrimaryKey=true, IsDbGenerated=true)] public short DepartmentID { get { return this._departmentid; } set { if ((this._departmentid!= value)) { this.ondepartmentidchanging(value); this.sendpropertychanging(); this._departmentid = value; this.sendpropertychanged("departmentid"); this.ondepartmentidchanged(); } } } } Primer 3.8 Generiran razred Za preslikavo se privzeto uporablja atributno-usmerjeno preslikovanje (angl.»attribute- Based Mapping«). Preko anotacij na razredu in atributih ogrodje ugotovi, v katero tabelo se razred preslika. Drug način uporablja datoteko XML, v kateri je definirana preslikava. To datoteko je mogoče izdelati iz datoteke dbml in orodja SqlMetal [22], a pri tem načinu

51 Zagotavljanje trajnosti objektov v ogrodju.net Stran 37 moramo podati pot do datoteke ob vsakem klicu konstruktorja razreda DataContext. Tak način omogoča, da spremenimo preslikavo, ne da bi pri tem morali na novo prevesti izvorno kodo, a smo pri tem omejeni samo na manjše spremembe. Že dodajanje novega atributa zahteva ponovno generiranje vseh razredov in datoteke za preslikavo Posodabljanje, vstavljanje in brisanje Pri izdelavi objektov ogrodje nima večjih zahtev, poljubno lahko izdelujemo in manipuliramo z njimi. Le pri vstavljanju ali brisanju podatkov iz podatkovne baze je potrebno objekt registrirati pri vzorcu enota dela s klicem metod InsertOnSubmit ali DeleteOnSubmit, nato spremembe potrdimo še s klicem SubmitChanges metode. Department novoddelek = new Department() { Name = "Nov oddelek" }; awcontext.departments.insertonsubmit(novoddelek); awcontext.submitchanges(); awcontext.departments.deleteonsubmit(novoddelek); awcontext.submitchanges(); Primer 3.9 Dodajanje in odstranjevanje zapisov z uporabo LINQ to SQL 3.2 Ogrodje NHibernate Iz Jave na.net Ob prihodu ogrodja.net, sprva v različici 1.0 in kasneje 2.0, se je pojavila potreba po ustreznem ogrodju za objektno-relacijsko preslikavo. Za zgled so se razvijalci obrnili na programsko ogrodje Java 2 Enterprise Edition, kjer je vodilno vlogo med objektnorelacijskimi preslikovalniki imelo ogrodje Hibernate.[23] Ker je bilo le-to odprtokodno in napisano v programskem jeziku, ki je zelo podoben C#, so lahko razvijalci začeli s prenosom programske kode na ogrodje.net. Razvoj na novem ogrodju se je začel leta Ko je leta 2005 izšla različica 1.0, ki je temeljila na starejši različici Hibernate 2.1, je NHibernate postal prvo ogrodje za objektno-relacijsko preslikavo na ogrodju.net. NHibernate ni bil samo prenos programske kode iz ene platforme na drugo, ampak je že od začetka vseboval tako lastnosti novejših različic ogrodja Hibernate, kakor tudi posebnosti programskega ogrodja.net.[2]

52 Zagotavljanje trajnosti objektov v ogrodju.net Stran 38 Slika 3.3 Arhitektura ogrodja NHibernate [24] NHibernate je zbirka knjižnic, ki omogočajo preslikavo objektov v relacijsko podatkovno bazo. Temelji na principu POCO ali»plain Old CLR Object«, kar je izpeljanka iz javanske različice POJO ali»plain Old Java Object«, in pomeni, da ogrodje ne zahteva posega v entitete za izvedbo preslikave. Kot prikazuje slika 3.3, je aplikacija neodvisna od ogrodja. Edini vezni člen so trajni objekti (angl.»persistent objects«), za katere ogrodje ureja preslikavo v podatkovno bazo. Vsa preslikava je zapisana v meta podatkih, ki so v tem primeru shranjeni v dokumentih tipa XML. Izsek datoteke, ki opisuje preslikavo razreda Contact, je prikazan v primer <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0" namespace="diploma.nhibernate" assembly="diploma.nhibernate"> <class name="contact" table="contact"> <id name="contactid" type="int32" column="contactid" > <generator class="identity" /> </id> <property name="firstname"> <column name="firstname" /> </property> <property name="middlename"> <column name="middlename" /> </property> <property name="lastname"> <column name="lastname" /> </property> <set name="employeelist" lazy="true"> <key column="contactid" />

53 Zagotavljanje trajnosti objektov v ogrodju.net Stran 39 <one-to-many class="employee" /> </set> <one-to-one name="adress" class="adress" cascade="all" /> </class> </hibernate-mapping> Primer 3.10 Opis preslikave v datoteki hbm Prednost te rešitve je, da gradimo neodvisen poslovni domenski model, in ga nato preslikamo v novo ali že obstoječo podatkovno bazo. Razrede lahko pišemo na roko ali generiramo, na primer iz razrednega diagrama. Edina zahteva ogrodja je, da za vsak razred, ki bo preslikan v relacijsko podatkovno bazo, ustvarimo datoteko hbm, v kateri navedemo, kako se posamezni atributi in relacije preslikajo v atribute tabele. Osnovni elementi preslikave so navedeni v tabeli 3.3tabela 3.3.[25] Tabela 3.3 Osnovni elementi preslikave in njihov pomen XML element hibernate-mapping class id property set, bag, map, list one-to-one many-to-one component subclass joined-subclass union-subclass join Pomen Vrhnji element Ime razreda in tabele, v katero se preslika Identifikator Ime in tip atributa ter ime atributa, v katerega se preslika Preslikava relacije mnogo proti ena ali mnogo proti mnogo, uporaba zbirk Preslikava relacije ena proti ena Preslikava relacije mnogo proti ena Preslikava vrednostnih objektov, iz ene tabelo preslikamo v več razredov Preslikava dedovanja, strategija ena tabela za vse razrede Preslikava dedovanja, strategija tabela na razred Preslikava dedovanja, strategija tabela na konkreten razred Preslikava atributov iz več tabel v en razred Za uporabo ogrodja, razen hbm datotek, potrebujemo sejno tovarno, ki je primerek vmesnika ISessionFactory. Ob nastanku tovarna analizira vse hbm datoteke in na podlagi teh zgradi ustrezne pomnilniške strukture. To je procesorsko zelo potratno, zato poizkušamo to znotraj življenjskega cikla aplikacije, narediti samo enkrat in zadržati skozi celotno trajanje aplikacije. Kot lahko sklepamo že iz imena, služi sejna tovarna za pridobivanje primerkov vmesnika ISession. Seja je ključnega pomena pri operiranju s podatkovno bazo, saj služi kot osrednja točka za pridobivanje, vstavljanje, urejanje in brisanje podatkov.[26]

54 Zagotavljanje trajnosti objektov v ogrodju.net Stran Povpraševanja NHibernate ponuja več načinov, kako pridobivamo podatke iz podatkovne baze: [26] navigacija preko drevesa objektov, dele katerega smo prej naložili iz podatkovne baze, pridobivanje objektov preko njihovega identifikatorja, uporaba jezika za povpraševanje Hibernate Query Language ali HQL, uporaba kriterijskih povpraševanj (angl.»criteria Queries«) preko vmesnika ICriteria in uporaba standardnega povpraševalnega jezika SQL. Ker je pridobivanje objektov preko njihovega identifikatorja, jezika SQL in navigacije skozi drevo objektov zelo preprosto, se bomo v nadaljevanju osredotočili predvsem na povpraševalni jezik HQL in kriterijsko povpraševanje. Hibernate Query Language Povpraševalni jezik HQL je v celoti prevzet po javanski različici ogrodja. Razlog za to je zagotovo dobra sprejetost, ki ga je jezik doživel že s prvimi različicami ogrodja Hibernate. K temu zagotovo pripomore podobnost s povpraševalnim jezikom SQL, po katerem HQL povzema večino sintakse. Razlika je le v tem, da HQL ne deluje na nivoju relacijskih atributov in tabel, ampak atributov in razredov. Za povpraševanja ogrodje ponuja vmesnik IQuery, preko katerega vstavljamo parametre, omejimo število zadetkov in določimo, da poizvedba vrne samo unikatne rezultate. Primerek vmesnika pridobimo s klicem metode CreateQuery, ki mu kot parameter podamo povpraševalni izraz v jeziku HQL. Tudi NHibernate implementira odloženo izvajanje povpraševanja. To pomeni, da se HQL-poizvedba analizira in proži šele ob klicu metode List. Kot lahko vidimo iz primera 3.11, je sintaksa jezika zelo podobna SQL. Manjka le ključna besedica select, ki določa izbiro atributov v tabeli. Te v HQL ne potrebujemo, če želimo, da povpraševanje vrne samo primerke enega razreda. Jezik tudi omogoča uporabo projekcije, vendar v takem primeru povpraševanje vrne polje objektov tipa object.

55 Zagotavljanje trajnosti objektov v ogrodju.net Stran 41 string querystring Employee emp where emp.manager=:manager"; IQuery query = session.createquery(querystring).setparameter("manager", manager, NHibernateUtil.Entity(typeof(Employee))); query.list(zaposleni); Primer 3.11 Povpraševanje z jezikom HQL Med drugim HQL ponuja že poznane konstrukte jezika SQL, kot so združevanja, sortiranje, grupiranje, gnezdena povpraševanja, itd. Najverjetneje je tudi to vzrok za veliko sprejetost ogrodja. Kot posebnost jezika bi poudarili možnost, da kot parametre poizvedbe vstavimo objekte, kot prikazuje primer Ogrodje avtomatsko poišče identifikator objekta in ga ustrezno vstavi v povpraševalni niz. Tako na preprost način poiščemo vse zaposlene, čeprav v razredu Employee nismo definirali relacije na Employees. Kot smo ugotovili, lahko z jezikom HQL izrazimo najrazličnejše poizvedbe, zaradi česar je zagotovo neizogiben pri uporabi ogrodja NHibernate, vendar ima veliko slabost. Ta je, da so vse poizvedbe napisane v nizu. Ta slabost je poznana razvijalcem, ki dostopajo do podatkovne baze preko ogrodja ADO.NET in so primorani pisati SQL poizvedbe v programski kodi. To je zagotovo velika slabost, saj v takem primeru nimamo podpore prevajalnika, kar pa je, glede na to, da pišemo poizvedbe nad objekti, skoraj nujno potrebno. Kot rešitev so razvijalci razvili kriterijsko povpraševanje, ki omogoča strogo tipizirano povpraševanje. Kot zanimivost lahko omenimo, da je zaradi razširljivosti, ki jih ponuja tehnologija LINQ, že bil razvit dodatek LINQ to NHibernate. Ta omogoča pisanje strogo tipiziranih poizvedb s tem, da LINQ-poizvedbe pretvori v klice metod kriterijskega povpraševanja.[27] Kriterijsko povpraševanje Drug način povpraševanja ponuja Criteria Query API. Le-ta je namenjen razvijalcem, ki jim je bližji objektni pristop ali niso dovolj izkušeni v jeziku SQL. Omogoča, da zapišemo poizvedbo na strogo tipiziran način z uporabo kriterijev ali primerka razreda. Ne glede na to, kateri način bomo izbrali, potrebujemo metode, ki jih ponuja vmesnik ICriteria. Preko tega dostopamo do funkcionalnosti, ki omogoča gradnjo poizvedb s klici ustreznih metod. [25]

56 Zagotavljanje trajnosti objektov v ogrodju.net Stran 42 Omejitve lahko izrazimo z uporabo kriterijev ali primerkov. Prvi uporablja»query by criteria«. Pri tem definiramo omejitve v obliki izrazov, ki jih definira razred NHibernate.Criterion.Expression. To so izrazi kot večje, manjše, enako ali primerljivo in jih najdemo v povpraševalnih jezikih, kot sta SQL in HQL.[26] Tako povpraševanje je prikazano v primeru 3.12primer 3.12, kjer iščemo vse osebe, ki jim je ime Janez. ICriteria kriterij = session.createcriteria(typeof(person)).add(expression.like("firstname", "Janez", MatchMode.Exact)).AddOrder(Order.Desc("Birthdate")); Primer 3.12 Poizvedba z uporabo»query by criteria«drugi,»query by example«, temelji na primerkih razredov. Namesto da bi omejili vsak atribut posebej, lahko ustvarimo primerek razreda in ustrezno nastavimo atribute. Ta primerek nato služi kot vzorec, po katerem išče poizvedba.[26] Če n-terica ustreza vzorcu se vrne, v nasprotnem primeru se premakne na naslednjo vrstico. Primer 3.13 prikazuje enako povpraševanje kot prej, le da kriterij uporablja primerek razreda. Person janez = new Person(); janez.firstname = "Janez"; ICriteria kriterij = session.createcriteria(typeof(person)).add(example.create(janez)); Primer 3.13 Poizvedba z uporabo»query by example«3.2.3 Posodabljanje, vstavljanje in brisanje V ogrodju sta kot del seje, implementirana vzorca enota dela in slovar identitet. Nove objekte, ki jim želimo zagotoviti hrambo, moramo najprej registrirati pri enoti dela s klicem metode Save. Ta bo avtomatično poskrbela, da se bo vsebina objekta shranila v podatkovno bazo, ko bomo končali z delom in poklicali metodo Flush. Enako kot smo objekt shranili, ga lahko tudi izbrišemo. Pokličemo le ustrezno metodo Delete in kot parameter dodamo objekt, ki ga želimo izbrisati. Pri sledenju spremembam moramo poznati značilnost ogrodja, kajti seja skrbi za sledenje samo, dokler je ta odprta. V večini primerov se uporablja tako imenovani odklopljen način, kjer v eni seji preberemo

57 Zagotavljanje trajnosti objektov v ogrodju.net Stran 43 podatke in jih v drugi seji shranim. V takem primeru moramo poklicati metodo Update ali SaveOrUpdate.[26] 3.3 Ogrodje ADO.NET Entity Framework Arhitektura ogrodja ADO.NET Entity Framework Ogrodje ADO.NET Entity Framework je najnovejše od vseh tukaj predstavljenih ogrodij. Prvi osnutki ogrodja so bili predstavljeni na konferenci TechEd leta Njegova končna različica je izšla julija 2008, ko je Microsoft izdal prvi paket posodobitev za Visual Studio 2008 in ogrodje.net 3.5. V nadaljevanju podpoglavja sledi opis vseh glavnih komponent arhitekture ogrodja ADO.NET Entity Framework, katerega sestavlja več funkcionalnih komponent. Najpomembnejše so: [28] objektne storitve, entitetni podatkovni model, ponudnik podatkov na nivoju entitet in ponudniki podatkov za specifične podatkovne shrambe.

58 Zagotavljanje trajnosti objektov v ogrodju.net Stran 44 Slika 3.4 Arhitektura ogrodja ADO.NET Entity Framework Objektne storitve Najbolj izpostavljena komponenta ogrodja so zagotovo objektne storitve (angl.»object Services«). Objektne storitve so postavljene čisto na vrh ogrodja in zagotovo nudijo funkcionalnost, ki jo uporablja največ razvijalcev. Omogočajo namreč, da uporabljamo CLR-objekte, ki temeljijo na entitetah iz entitetnega podatkovnega modela. Objektne storitve ponujajo razred EntityObject, od katerega dedujejo vsi razredi, ki jih ustvari generator na podlagi entitetnega podatkovnega modela. Preko tega razreda omogočajo funkcionalnost ustvarjanja objektov, ki so rezultat povpraševanja, sledenja spremembam na teh objektih, upravljanja relacij in shranjevanja sprememb v podatkovno bazo. Objektne storitve torej ponujajo vso funkcionalnost objektno-relacijske preslikave. Samo ogrodje je zasnovano na način, ki omogoča vključitev različnih programskih slojev nad entitetnim podatkovnim modelom, ki ga omogoča ponudnik podatkov na nivoju entitet. Tako je komponenta objektnih storitev samo ena izmed takšnih programskih slojev,

59 Zagotavljanje trajnosti objektov v ogrodju.net Stran 45 ki entitete predstavi kot strogo tipizirane CLR-objekte in predstavlja funkcionalnost objektno-relacijske preslikave.[29] Entitetni podatkovni model Entitetni podatkovni model (angl.»entity Data Model«ali EDM) bomo podrobneje opisali v naslednjem poglavju. Tukaj naj samo omenimo, da je to najpomembnejši del ogrodja, saj kot trdijo avtorji [30], ustvarja konceptualni nivo, kar je nadgradnja entitetno-relacijskega modela, ki ga je v sedemdesetih letih 20. stoletja uvedel dr. Peter Chena.[28] Ponudnik podatkov na nivoju entitet Druga pomembna komponenta je ponudnik podatkov na nivoju entitet ali EntityClient. Ime spominja na SqlClient, ki je implementacija ponudnika podatkov (angl.»data Provider«) za podatkovno bazo SQL Server. Tako je tudi EntityClient implementacija takega ponudnika, vendar na višjem nivoju. Ta ne skrbi za povezavo in poizvedbe nad podatkovno bazo, ampak deluje na nivoju entitetnega podatkovnega modela. Knjižnico lahko uporabljamo direktno, ali z uporabo objektnih storitev, ki ležijo nad njim. Potrebno je poudariti, da je le EntityClient zmožen izvajanja povpraševanj. Objektne storitve nudijo le vmesnik, kako dostopamo do povpraševanj na objektni način. Razlika je v tem, da EntityClient poizvedbe vračajo rezultate v tabelarični obliki, medtem ko objektne storitve transformirajo rezultat v objekte. Poleg tega rezultate, ki jih vrača EntityClient, lahko samo beremo. Samo objektne storitve nudijo funkcionalnost sledenja spremembam in shranjevanja le-teh nazaj v podatkovno bazo. [29] Ponudniki podatkov za specifične podatkovne shrambe Ogrodje ADO.NET Entity Framework gradi na ponudnikih (angl.»provider«) za specifične podatkovne shrambe, poznanih že iz ogrodja ADO.NET. Te komponente gradijo na standardiziranem vzorcu».net Framework Data Provider«in omogočajo dostop do posameznih podatkovnih baz. Tako vsak proizvajalec podatkovne baze implementira svojega ponudnika, kjer zajame specifike svojega proizvoda. [28] [29] Ob predstavitvi ogrodja je Microsoft posodobil svoj SqlClient API, da podpira preoblikovanje povpraševanj in ukazov nad entitetnim modelom v povpraševanja in ukaze podatkovne baze. Ta knjižnica omogoča povezovanje na strežnike SQL Server 2000, 2005

60 Zagotavljanje trajnosti objektov v ogrodju.net Stran 46 in V tem trenutku obstajajo posodobljeni ponudniki že za podatkovne baze proizvajalcev Oracle, IBM, MySQL, SQLite in drugih.[28] Trenutno je največji poudarek na relacijskih podatkovnih bazah, vendar arhitektura ogrodja omogoča vključitev ponudnikov tudi za druge podatkovne vire, kot so datoteke XML ali spletne storitve.[28] Poleg naštetih arhitekturnih komponent ne smemo izpustiti grafičnega orodja, ki je del Visual Studia 2008 SP1. Ta omogoča grafično predstavitev entitetnega podatkovnega modela, urejanje entitet in preslikav ter dodajanje shranjenih procedur. Prav tako lahko z vključenim čarovnikom generiramo entitete na podlagi tabel v podatkovni bazi Entitetni podatkovni model Zaradi pomembnosti modela, smo se odločili, da posvetimo celotno poglavje entitetnemu podatkovnemu modelu (angl.»entity Data Model«ali krajše EDM). Entitetni podatkovni model predstavlja most med aplikacijo in podatkovno shrambo. Omogoča višji nivo abstrakcije, saj delujemo nad konceptualnim modelom podatkov in ne nad tabelami podatkovne baze. EDM gradi na osnovi entitetno-relacijskega modela, ki ga je iznašel dr. Peter Chen. Ta je definiral konceptualni podatkovni model (angl.»conceptual Data Model), ki so ga razvijalci uporabljali za lažjo predstavitev sheme podatkovne baze.[30] EDM nadgrajuje ta model in ga prenaša v dokumente XML, ki jih lahko uporabljajo različni programski modeli. Prednost tega modela in tudi razlog, zakaj je to novost, je način načrtovanja informacijskih sistemov. Uporaba EDM omogoča, da lahko začnemo sistem načrtovati od spodaj navzgor, kar pomeni, da izhajamo iz podatkovne baze. Iz nje generiramo razrede in jih optimiziramo. Lahko pa uberemo tudi obratno pot. Se pravi načrtovanje od zgoraj navzdol. Tako lahko začnemo načrtovati entitete brez podatkovne baze in jih šele na koncu preslikamo v tabele. Najpogosteje se uporablja tretji način, ki je kombinacija obeh prej navedenih. Ta način se imenuje»meet in the middle«, kjer sočasno gradimo entitetni in razredni model, ter na koncu po potrebi prilagodimo preslikavo.

61 Zagotavljanje trajnosti objektov v ogrodju.net Stran 47 Slika 3.5 Grafično orodje za načrtovanje entitetnega podatkovnega modela Za urejanje entitetnega podatkovnega modela nudi Visual Studio 2008 SP1 polno podporo, saj ima vgrajeno grafično orodje za delo z datotekami edmx. To omogoča, da na lahek način ustvarimo entitete, urejamo njihove lastnosti, dodajamo shranjene procedure in urejamo preslikavo. Na sliki 3.5 vidimo razrede, ki jim pravimo entitete, in relacije med njimi. Entitete so sestavljene iz atributov in navigacijskih atributov, ki določajo ime relacije. Privzeto so vse relacije dvosmerne. Tako ima entiteta Employee povratno relacijo na sebe, ki predstavlja relacijo med nad- in podrejenim. Za pridobitev nadrejenega uporabimo navigacijski atribut Manager, če pa želimo pridobiti seznam podrejenih, uporabimo atribut Employees. Kot smo videli, nudi grafično orodje znotraj Visual Studia 2008 SP1 podporo samo za konceptualni model. Za lažje razumevanje preslikave in celotnega EDM bomo na kratko predstavili še XML-strukturo edmx-datoteke. V bistvu je ta datoteka sestavljena iz dveh delov. Prvi določa tri sheme, ki predstavljajo konceptualni in podatkovni model ter preslikavo. Drugi del, ki je omejen z elementom edmx:designer, uporablja grafično orodje za shranjevanje pozicije entitet na zaslonu. Ker je ta za delovanje ogrodja popolnoma nepomembna, jo bomo preskočili in se povsem posvetili prvemu delu.

62 Zagotavljanje trajnosti objektov v ogrodju.net Stran 48 Slika 3.6 Struktura meta podatkov Kot smo že na začetku povedali, so vse tri sheme v času načrtovanja združene v eno (slika 3.6). Komaj prevajalnik jih razdruži in ustvari tri ločene datoteke. Tako se konceptualna shema shrani v datoteko s končnico csdl, kar pomeni»conceptual Schema Definition Language«. Podatkovna shema se shrani v datoteko s končnico ssdl, kar pomeni»storage Schema Definition Language«in tudi preslikava se shrani v svojo datoteko s končnico msl, kar pomeni»mapping Specification Language«. V literaturi pogosto najdemo te oznake za posamezne sheme. Najprej bomo na kratko predstavili konceptualni model, izsek katerega prikazuje primer Znotraj schema elementa lahko vidimo element EntityContainer. Ta služi kot ovoj za elemente EntitySet in AssociationSet. EntitySet predstavlja skupno definicijo za vse entitete. Za lažje razumevanje si pomagajmo s primerjavo iz objektno orientiranega razvoja. EntitySet predstavlja razred, ki ga določa tip EntityType. Entitete so primerki tega razreda oziroma objekti. Tip entitete je določen v razdelku EntityType, ki vsebuje elemente Key, Property in NavigationProperty. Vsaka entiteta mora imeti ključ, na podlagi katerega se loči od ostalih entitet. Navadno je to kar primarni ključ iz relacijske tabele. Sledijo še ostali atributi entitete s pripadajočim podatkovnim tipom. Tukaj moramo poudariti, da ogrodje uporablja svoje podatkovne tipe, a so ti tesno povezani s podatkovnimi tipi ogrodja.net. Zadnji del entitetnega tipa zavzemajo navigacijski atributi. Če ima entiteta relacijo z drugo, lahko ustvarimo navigacijski atribut, ki je tesno povezan z asociacijo.

63 Zagotavljanje trajnosti objektov v ogrodju.net Stran 49 Asociacije predstavljajo relacijo med dvema entitetama. V shemi csdl je za to uporabljen element Association, ki definira končni točki relacije. Kakor so tudi entitete združene v množice, so tudi asociacije združene v elementu AssociationSet. To je na prvi pogled lahko zavajajoče, vendar je povezano s tem, kako objektno orientirani jeziki predstavljajo relacije. Ti namreč relacije obravnavajo kot objekte, tako bo vsako relacijo med objektom Employee in DepartmentHistory predstavljal en FK_DepartmentHistory_DepartmentID relacijski objekt.[28] <edmx:conceptualmodels> <Schema Namespace="AWModel" Alias="Self"> <EntityContainer Name="AWEntities"> <EntitySet Name="Departments" EntityType="AWModel.Department" /> <AssociationSet Name="FK_DepartmentHistory_DepartmentID" Association="AWModel.FK_DepartmentHistory_DepartmentID"> <End Role="Department" EntitySet="Department" /> <End Role="EmployeeDepartmentHistory" EntitySet="EmployeeDepartmentHistory" /> </AssociationSet> </EntityContainer> <EntityType Name="Department"> <Key> <PropertyRef Name="DepartmentID" /> </Key> <Property Name="DepartmentID" Type="Int16" Nullable="false" /> <Property Name="Name" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" /> <NavigationProperty Name="DepartmentHistory" Relationship="AWModel.FK_DepartmentHistory DepartmentID" FromRole="Department" ToRole="DepartmentHistory" /> </EntityType> <Association Name="FK_DepartmentHistory_DepartmentID"> <End Role="Department" Type="AWModel.Department" Multiplicity="1" /> <End Role="DepartmentHistory" Type="AWModel.DepartmentHistory" Multiplicity="*" /> <ReferentialConstraint> <Principal Role="Department"> <PropertyRef Name="DepartmentID" /> </Principal> <Dependent Role="DepartmentHistory"> <PropertyRef Name="DepartmentID" /> </Dependent> </ReferentialConstraint> </Association> </Schema> </edmx:conceptualmodels> Primer 3.14 Izsek iz CSDL sheme

64 Zagotavljanje trajnosti objektov v ogrodju.net Stran 50 Podatkovna ali ssdl shema je namenjena opisu podatkovne shrambe. Elementi za opis so enaki kot v konceptualni shemi, vendar imajo drug pomen. Za opis tabel in atributov sta uporabljena elementa EntityType in Property, za tuje ključe in referenčne omejitve element Associtaion in podelement ReferentialConstraint. Kot opazimo v primeru 3.15, so v tej shemi podatkovni tipi drugačni od tistih, ki smo jih opazili v prejšnjem primeru, in predstavljajo podatkovne tipe podatkovne baze. <edmx:storagemodels> <Schema Namespace="AWModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008"> <EntityContainer Name="AWModelStoreContainer"> <EntitySet Name="Department" EntityType="AWModel.Store.Department" store:type="tables" /> <AssociationSet Name="FK_Employee_Contact " Association="AWModel.Store.FK_Employee_Contact "> <End Role="Contact" EntitySet="Contact" /> <End Role="Employee" EntitySet="Employee" /> </AssociationSet> </EntityContainer> <EntityType Name="Department"> <Key> <PropertyRef Name="DepartmentID" /> </Key> <Property Name="DepartmentID" Type="smallint" Nullable="false" StoreGeneratedPattern="Identity" /> <Property Name="Name" Type="nvarchar" Nullable="false" MaxLength="50" /> </EntityType> <Association Name="FK_Employee_Contact "> <End Role="Contact" Type="AWModel.Store.Contact" Multiplicity="1" /> <End Role="Employee" Type="AWModel.Store.Employee" Multiplicity="*" /> <ReferentialConstraint> <Principal Role="Contact"> <PropertyRef Name="ContactID" /> </Principal> <Dependent Role="Employee"> <PropertyRef Name="ContactID" /> </Dependent> </ReferentialConstraint> </Association> </Schema> </edmx:storagemodels> Primer 3.15 Izsek iz SSDL sheme

65 Zagotavljanje trajnosti objektov v ogrodju.net Stran 51 Zadnji del entitetnega podatkovnega modela vsebuje definicijo preslikav. Medtem ko csdl in ssdl shemi služita le opisu entitet oziroma tabel, je msl shema namenjena preslikavi. V tem dokumentu je namreč določeno, kako se bodo atributi entitet preslikali v atribute tabel. Za opis tega je uporabljeni elementi EntitySetMapping, EntityTypeMapping in MappingFragment. Prva dva določata entitetni set in tip, medtem ko MappingFragment določa, kako se preslikajo posamezni atributi. V primeru 3.16 morda ni najbolj razvidna uporaba tega, a lahko povemo, da je možno več tabel preslikati v eno entiteto. V takem primeru bi potrebovali več MappingFragment elementov. <edmx:mappings> <Mapping Space="C-S"> <EntityContainerMapping StorageEntityContainer="AWModelStoreContainer" CdmEntityContainer="AWEntities"> <EntitySetMapping Name="Department"> <EntityTypeMapping TypeName="IsTypeOf(AWModel.Department)"> <MappingFragment StoreEntitySet="Department"> <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" /> <ScalarProperty Name="Name" ColumnName="Name" /> <ScalarProperty Name="DepartmentName" ColumnName="DepartmentName" /> </MappingFragment> </EntityTypeMapping> </EntitySetMapping> </EntityContainerMapping> </Mapping> </edmx:mappings> Primer 3.16 Izsek iz MSL sheme To je bil le kratek pregled vsebine shem, ki jih uporablja ogrodje. Celotna dokumentacija je na voljo na [31]. Glede shem lahko še dodamo, da lahko uporabimo tudi zunanjo shemo. Microsoft je pripravil orodje EdmGen, ki omogoča generiranje shem na osnovi podatkovne baze in razredov na osnovi konceptualnega modela.[32] Če želimo uporabiti zunanjo shemo, moramo v konstruktorju razreda ObjectContext podati pot do datotek. Če uporabljamo ogrodje znotraj Visual Studia 2008 SP1, ta avtomatsko vključi sheme v zbirko in generira razrede na podlagi entitet iz konceptualnega modela. Kot vidimo v primeru 3.17, ti razredi ne ustrezajo principu POCO. Opazimo lahko dedovanje, anotacije in veliko kode pri dostopu do javnih atributov.

66 Zagotavljanje trajnosti objektov v ogrodju.net Stran 52 [EdmEntityTypeAttribute(NamespaceName="AWModel", Name="Contact")] public partial class Contact : EntityObject { public static Contact CreateContact(int contactid,string firstname ) { } [EdmScalarPropertyAttribute(IsNullable=false)] public string FirstName { get { return this._firstname; } set { this.onfirstnamechanging(value); this.reportpropertychanging("firstname"); this._firstname = SetValidValue(value, false); this.reportpropertychanged("firstname"); this.onfirstnamechanged(); } } private string _FirstName; partial void OnFirstNameChanging(string value); partial void OnFirstNameChanged(); [EdmRelationshipNavigationPropertyAttribute("AWModel", "FK_Employee_ContactID", "Employee")] public EntityCollection<Employee> Employees { get { return ((IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollec tion<employee>("awmodel.fk_employee_contactid", "Employee"); } set { if ((value!= null)) { ((IEntityWithRelationships)(this)).RelationshipManager.InitializeRelate dcollection<employee>("awmodel.fk_employee_contactid", "Employee", value); } } } } Primer 3.17 Generirana koda iz EDM Generirane razrede lahko nadgradimo z lastnimi metodami, tako da implementiramo delni razred, ki dopolnjuje generiranega. Ogrodje omogoča tudi različne razširitvene točke, kjer lahko nadgradimo razrede. Za primer lahko navedemo delne metode, ki so novost

67 Zagotavljanje trajnosti objektov v ogrodju.net Stran 53 programskega jezika C# 3.0 [33], in jih ogrodje generira za vsak atribut. Z dopolnitvijo metod OnImeAtributaChanging in OnImeAtributaChanged lahko dopolnimo dostope do atributov z lastno kodo. Ogrodje Entity Framework omogoča tudi vključevanje lastnih razredov, vendar so za to potrebni posegi v kodo razreda. Najprej mora razred dedovati od EntityObject. Ker ogrodje.net podpira samo enkratno dedovanje, se lahko zgodi, da razred že deduje od katerega drugega. Zaradi tega so razvijalci ogrodja ponudili drugo možnost z implementacijo vmesnikov. Če želimo uporabiti funkcionalnost ogrodja, potrebujemo vmesnike IEntityWithKey, IEntityWithChangeTracker in IEntityWithRelationships. Kot lahko razberemo iz imen vmesnikov, le-ti nudijo funkcionalnost identifikacije entitet s pomočjo ključa, sledenje spremembam in upravljanja z relacijami. Razvijalci so ta princip poimenovali IPOCO, kar pomeni POCO z vmesniki.[28] Vendar to ne drži popolnoma, saj ogrodje zahteva še večje posege v kodo. Za primer lahko povemo, da je potrebno vse dostope do atributov dopolniti s kodo, ki signalizira spremembo atributa Poizvedbe Povpraševanja ločimo glede na tista, ki uporabljajo objektne storitve, in tista, ki izvajajo povpraševanja z uporabo ponudnika podatkov na nivoju entitet (»EntityClient provider«). Pri tem je potrebno poudariti, da se vsa povpraševanja izvajajo nad entitetami EDM in ne tabelami podatkovne baze. Objektne storitve uporabljata LINQ to Entities in Entity SQL. LINQ to Entities je različica tehnologije LINQ, ki omogoča pisanje LINQ poizvedbe nad entitetami EDM. Ker smo tehnologijo LINQ že izčrpno opisali v prejšnjih poglavjih, bomo tukaj predstavili samo primer poizvedbe. AdventureWorksEntities awentities = new AdventureWorksEntities(); var delavci = from zaposlen in awentities.employees.include("contact") where zaposlen.hiredate >= hiredate orderby zaposlen.contact.lastname ascending, zaposlen.contact.firstname ascending select zaposlen;

68 Zagotavljanje trajnosti objektov v ogrodju.net Stran 54 Primer 3.18 Poizvedba LINQ to Entities Kot vidimo v primeru 3.18, LINQ to Entities uporablja poznano sintakso LINQ. V tem primeru razred AdventureWorksEntities, ki deduje od razreda ObjectContext, vsebuje referenco na razred ObjectQuery<Employee>. Ta razred implementira vmesnik IQuerable, ki omogoča izgradnjo drevesa izrazov, iz katerega ogrodje ustvari poizvedbe SQL. Ime razreda, ki deduje od ObjectContext, je definirano v konceptualni shemi csdl, kot element EntityContainer. Tudi reference na objektne poizvedbe so določene v tej datoteki kot elementi EntitySet. Druga možnost izvajanja poizvedb s pomočjo objektnih storitev je uporaba jezika Entity SQL. Jezik je zelo podoben jeziku SQL, vendar s to razliko, da v poizvedbah uporablja entitete, atribute in asociacije, definirane v konceptualnem modelu. Primer 3.19 prikazuje uporabo Entity SQL za izvedbo enake poizvedbe kot v prejšnjem primeru. Ključno vlogo v tem primeru ima razred ObjectQuery, ki omogoča izvajanje poizvedb, zapisanih v jeziku Entity SQL s pomočjo objektnih storitev. string q = "SELECT VALUE e FROM Employees AS e WHERE e.hiredate ORDER BY e.contact.lastname ASC, e.contact.firstname ASC"; var zaposleni = awentities.createquery<employee>(q); zaposleni.parameters.add(new ObjectParameter("hireDate", hiredate)); Primer 3.19 Poizvedba z uporabo Entity SQL in objektnih storitev Kakor smo navajeni iz tehnologije LINQ, lahko tudi poizvedbe v Entity SQL izrazimo z zaporedjem metod. Te metode se imenujejo graditelji poizvedb (angl.»query Builder«) in le delno podpirajo vse funkcionalnosti jezika Entity SQL. Kot pove že ime, graditelji poizvedb gradijo primerek razreda ObjectQuery, ki izvede povpraševanje. V primeru 3.20 vidimo povpraševanje z uporabo graditeljev poizvedb. Poizvedba je enaka kot v prejšnjih primerih. var zaposleni = awentities.employees. Where("it.HireDate OrderBy("it.Contact.LastName ASC, it.contact.firstname ASC"); zaposleni.parameters.add(new ObjectParameter("hireDate", hiredate)); Primer 3.20 Poizvedba z uporabo Entity SQL in graditeljem poizvedb

69 Zagotavljanje trajnosti objektov v ogrodju.net Stran 55 Objektne storitve niso edini način, kako izvajamo poizvedbe. Drug način je možen z uporabo jezika Entity SQL in ponudnika podatkov na nivoju entitet (EntityClient). EntityClient se razlikuje od objektnih storitev v tem, da ne materializira podatkov v objekte, ampak rezultat poizvedbe vrne zapise. EntityClient implementira vzorec ponudnika podatkov (angl.»data Provider«), ki je poznan že iz ogrodja ADO.NET. Tako tudi EntityClient ponuja znane razrede, ki skrbijo za povezavo (EntityConnection), poizvedbe (EntityCommand) in parametre (EntityParameter) [29], katerih uporaba je prikazana v primeru Za pridobivanje podatkov potrebujemo primerek razreda EntityDataReader, ki deduje od razreda DbDataReader. Za razliko od standardnih implementacij, ki znajo vračati samo primitivne podatkovne tipe, ima EntityDataReader zmožnost, da kot rezultat poizvedbe vrne objekte tipa DbDataRecord, ki predstavljajo zapis iz objekta DbDataReader.[28] string q = "SELECT VALUE e FROM AWEntities.Employees AS e WHERE e.hiredate ORDER BY e.contact.lastname ASC, e.contact.firstname ASC"; using (EntityConnection conn = new EntityConnection("name=AWEntities")) { conn.open(); EntityCommand cmd = conn.createcommand(); cmd.commandtext = q; EntityParameter param = new EntityParameter(); param.parametername = "hiredate"; param.dbtype = DbType.DateTime; param.value = hiredate; cmd.parameters.add(param); using (EntityDataReader rdr = cmd.executereader(commandbehavior.sequentialaccess)) { while (rdr.read()) { int employeeid = rdr.getint32(0); } } conn.close();

70 Zagotavljanje trajnosti objektov v ogrodju.net Stran 56 } Primer 3.21 Poizvedba z uporabo Entity SQL in ponudnika podatkov na nivoju entitet Treba je tudi poudariti, da jezik Entity SQL ne ponuja možnosti vstavljanja, posodabljanja in brisanja podatkov. Samo objektne storitve nudijo funkcionalnost vstavljanja, sledenja spremembam in posodabljanja ter brisanja entitet. Kako natančno, bomo predstavili v naslednjem poglavju Posodabljanje, vstavljanje in brisanje Ogrodje Entity Framework ima poseben način, kako skrbi za osnovne operacije, kot so posodabljanje, vstavljanje in brisanje entitet. Ob vsaki poizvedbi nad objektnimi storitvami ogrodje poskrbi, da iz rezultatov poizvedbe ustvari ustrezne objekte. Za vsak objekt se izdela ustrezen objekt tipa ObjectStateEntry. Ta objekt hrani trenutno in prvotno vsebino objekta ter zastavico EntityState, ki signalizira, v kakšnem stanju je objekt. Vrednosti zastavice so lahko: nespremenjen (Unchanged), spremenjen (Modified), dodan (Added) in izbrisan (Deleted).[28] Če spremenimo objekt, se ta sprememba signalizira ustreznemu objektu ObjectStateEntry. Tam se popravi trenutna vrednost in zastavica se nastavi na stanje spremenjen. Pri klicu metode SaveChanges ogrodje preveri vse objekte na njihovo stanje. Če ugotovi, da se je objekt spremenil, preveri, kateri atributi so bili spremenjeni in nato posodobi samo tiste atribute v podatkovni bazi. Na koncu še nastavi trenutno na prvotno vrednost in stanje na nespremenjen. S tem načinom je zagotovljen zelo učinkovit nadzor nad spremembami atributov in minimalnimi popravki v podatkovni bazi. Tudi pri dodajanju novih objektov je postopek podoben, le da se tukaj objekt, ki predstavlja stanje, ustvari komaj, ko objekt označimo za vstavljanje s klicem metode AddToImeEntitete. Pri tem je za vsako entiteto svoja metoda v razredu ObjectContext. V primeru 3.22primer 3.22 je to metoda AddToDepartment. Department d = new Department(); d.name = "Nov oddelek"; d.modifieddate = DateTime.Now; d.groupname = "";

71 Zagotavljanje trajnosti objektov v ogrodju.net Stran 57 awentities.addtodepartment(d); awentities.savechanges(); d.name = "Drug oddelek"; awentities.savechanges(); awentities.deleteobject(d); awentities.savechanges(); Primer 3.22 Posodabljanje, vstavljanje in brisanje v ogrodju ADO.NET Entity Framework Za brisanje entitet poskrbi metoda DeleteObject, ki kot parameter sprejme poljubno entiteto in ji nastavi stanje na izbrisan. Treba je poudariti, da tudi ogrodje Entity Framework uporablja vzorec enota dela, ki beleži vse spremembe, in jih izvrši komaj ob klicu metode SaveChanges.

72 Zagotavljanje trajnosti objektov v ogrodju.net Stran 58 4 PRIMERJAVA OGRODIJ V prejšnjem poglavju smo predstavili tri ogrodja za objektno relacijsko preslikavo. V nadaljevanju sledi klasifikacija primerjalnih karakteristik, kjer bomo opisali uporabljene kriterije. V zadnjem delu bomo izvedli samo primerjavo in podali analizo rezultatov. 4.1 Klasifikacija primerjalnih kriterijev Izbor primerjalnih karakteristik je zelo pomemben. V danem primeru smo se odločili, da se ne bomo osredotočili samo na kvantitativne karakteristike, kot so hitrost in učinkovitost porabe pomnilnika, ampak bomo izvedli tudi kvalitativno primerjavo funkcionalnosti. V naslednjih podpoglavjih bomo opisali 12 primerjalnih karakteristik, za katere menimo, da so pomembne pri izbiri ustreznega ogrodja. Kriterijev nismo združevali v skupine, lahko pa podamo vrstni red, v katerem si bodo sledili. Na začetku bomo opisali kriterije, povezane z uporabo ogrodja, za tem bo sledil opis kriterijev po funkcionalnostih in na koncu bomo podali še kvantitativne karakteristike, katerih vrednosti bomo pridobili z meritvami Grafična in pomožna orodja V času razvojnih okolij so postala grafična orodja nepogrešljiv sestavni del razvoja informacijskih sistemov. Predvsem v ogrodju.net, kjer je razvoj že od njegovih prvih verzij tesno povezan z razvojnim okoljem Visual Studio. Tako od dobrega ogrodja pričakujemo grafično orodje, ki omogoča urejanje preslikave. Pogosto se načrtovanja lotimo od spodaj navzgor, kjer izhajamo iz obstoječe podatkovne baze. V tem primeru pričakujemo od ogrodja čarovnika ali orodje, ki omogoča generiranje razredov in ustrezne preslikave Podpora dedovanju in polimorfizmu Dedovanje je prvina objektno orientiranih programskih jezikov. A ker relacijske podatkovne baze ne podpirajo dedovanja, so se uveljavili trije načini, kako preslikamo

73 Zagotavljanje trajnosti objektov v ogrodju.net Stran 59 hierarhijo razredov v relacijske tabele. Podrobnejši opis preslikave dedovanja smo podali v poglavju Če povzamemo, so ti načini: ena tabela za vse razrede, tabela na konkreten razred in tabela na razred. Od kakovostnega ogrodja pričakujemo podporo za vse tri načine razreševanja generalizacije Podpora različnim sistemom za upravljanje s podatkovno bazo [34] navaja, da je trenutno na tržišču več kot 60 sistemov za upravljanje s podatkovno bazo (SUPB). Čeprav jih ima le nekaj prevladujoč tržni delež, je pomembno, da nudijo ogrodja podporo za čim večje število SUPB. S tem omogočajo razvoj novih informacijskih sistemov, ki temeljijo na starejših podatkovnih bazah. Nerealno je pričakovati, da bo ogrodje podpiralo vse sisteme za upravljanje s podatkovno bazo. Cilj tega kriterija ni ovrednotiti število podprtih SUPB, ampak želimo preučiti arhitekturno zasnovo ogrodja, ki mora omogočati vključitev različnih sistemov za upravljanje s podatkovno bazo Kriteriji»Persistence Ignorance«V poglavju 2.6 smo poudarili, da želimo, da je domenski model čim bolj neodvisen od izbranega ogrodja za ORM. V ta namen smo navedli 7 kriterijev, ki jih v [2] avtor označuje kot»persistence Ignorance«. Ti kriteriji so: dedovanje od specifičnega nadrazreda, izdelava primerkov objektov samo s tovarniško metodo, uporaba posebnih podatkovnih tipov, kot so zbirke, implementirati predpisan vmesnik, predpisati specifičen konstruktor, predpisati obvezne specifične atribute in prepovedana ali obvezna uporaba določenih konstruktov.

74 Zagotavljanje trajnosti objektov v ogrodju.net Stran 60 Smiselno se nam je zdelo vključiti te kriterije v primerjavo, saj po našem mnenju uspešno naslavljajo problematiko močne sklopljenosti med domenskim modelom in ogrodjem. Kot smo že nakazali, nobeno ogrodje v popolnosti ne zagotavlja neodvisnosti, kajti popolna neodvisnost zahteva prevelike režijske stroške in ne ponuja funkcionalnosti, ki jo nujno potrebujemo Dinamične poizvedbe Načini, kako pridobivati podatke, so različni. Večino smo jih že prikazali v opisu posameznih ogrodij, a ta kriterij še vedno ostaja, saj želimo prikazati osnovne razlike med posameznimi implementacijami. Zelo pomembno je, kako so poizvedbe zapisane in, ali imamo pri teh podporo prevajalnika Sprotno nalaganje in nalaganje na zahtevo Nalaganje na zahtevo je lastnost ogrodja, da naloži samo zahtevan objekt, ne pa tudi objektov, s katerimi ima ta relacije. Te lahko še vedno naložimo, kadar jih potrebujemo. S tem zagotovimo boljšo izrabo pomnilnika, manj prometa med odjemalcem in podatkovnim strežnikom ter manjšo obremenitev podatkovnega strežnika. Vendar tak način ni vedno zaželen. Za lažje razumevanje naj navedemo primer, s katerim se srečujemo pri razvoju informacijskih sistemov. Pri dostopu do osebnih podatkov se srečujemo z normalizacijo podatkov. Tako imamo podatke o osebi shranjene v eni tabeli, naslov pa v drugi. V takem primeru bi potrebovali dva dostopa do podatkovne baze, da pridobimo konceptualno en podatek. Zaradi tega želimo nastavitev, ki omogoča, da se podatki naložijo hkrati. Tako dobimo vse potrebne podatke v enem samem dostopu do podatkovne baze. V tem kriteriju bomo preverili, kako ogrodja omogočajo sprotno in nalaganje na zahtevo. Pri tem bomo videli, ali se te nastavitve lahko shranijo v preslikavo ali jih je potrebno navesti ob izvedbi preslikave.

75 Zagotavljanje trajnosti objektov v ogrodju.net Stran Shranjene procedure Shranjene procedure so že dolgo uveljavljene v podatkovnih bazah. Omogočajo kompleksno obdelavo podatkov, za izvedbo katerih potrebujemo več operacij. Za zagotovitev neprekinjenega izvajanja teh operacij so bile razvite transakcije. Navkljub njihovi razširjenosti in pogostosti uporabe jih do sedaj še nismo omenili. Razlog za to je, da so ogrodja sposobna generirati SQL-poizvedbe in ukaze. S tem odpade zahteva po uporabi shranjenih procedur. Vendar pogosto ni tako, saj se shranjene procedure pogosto uporabljajo za varnostno kritične dele, kot je avtorizacija in validacija. V takih primerih želimo, da ogrodje omogoča uporabo shranjenih procedur. Znotraj tega kriterija bomo pogledali, ali sploh, in če da, na kakšen način ogrodja podpirajo uporabo shranjenih procedur. Preverili bomo tudi možnost, da nadomestimo posamezne funkcije, kot so vstavljanje, brisanje in posodabljanje, z uporabo shranjenih procedur Transakcije Tudi transakcije so lastnost podatkovnih baz, ki se jih do sedaj še nismo dotaknili. Sistemi za upravljanje s podatkovno bazo zagotavljajo štiri lastnosti transakcij, ki jih v literaturi zasledimo pod akronimom ACID, kar pomeni atomarnost (angl.»atomicity«), konsistentnost (angl.»consistency«), izolacijo (angl.»isolation«) in trajnost (angl.»durability«). Atomarnost določa, da bodo pri nepričakovano prekinjenem procesu transakcije razveljavljene vse operacije, ki sestavljajo transakcijo. Transakcija spremeni stanje podatkovne baze iz enega veljavnega stanja v drugo, kar zagotavlja konsistenco. Izolacija pomeni, da je rezultat izvedbe transakcije prikrit, dokler se ta ne izvede do konca. Učinki transakcije so trajni, reverzibilni in se nikoli ne izgubijo, kar zagotavlja trajnost. Glede na to, da objektno relacijski preslikovalniki delujejo nad podatkovno bazo, bi želeli imeti podporo za izvajanje transakcij. Znotraj tega kriterija bomo preučili, kakšno podporo transakcijam ponujajo ogrodja ORM.

76 Zagotavljanje trajnosti objektov v ogrodju.net Stran Predpomnjenje Pojem predpomnjenja (angl.»caching«) poznamo iz strojne računalniške opreme. Mikroprocesorji, na primer, imajo predpomnilnik, kjer hranijo zadnji prebran del iz glavnega pomnilnika. Pri tem izkoriščajo lastnost programov, da pogosto zaporedno dostopajo do enake pomnilniške lokacije. Če bi bilo le-to potrebno vsakič prebrati iz pomnilnika in prenesti v procesor, bi bil izkoristek mikroprocesorjev bistveno slabši, kot je sedaj. Podobno kot v zgornjem primeru, lahko opazimo, da nekateri informacijski sistemi v večini prebirajo podatke iz malega števila tabel. Če ob tem še upoštevamo, da imajo te tabele veliko zapisov, lahko kaj hitro ugotovimo podobnosti s prejšnjim primerom. Preverili bomo možnosti, ki jih ponujajo ogrodja ORM, da bi hranili objekte v pomnilniku, ki bi služil kot predpomnilnik. Vendar ima ta pristop tudi pomanjkljivost, ki se pojavi, če več aplikacij dostopa do iste podatkovne baze. V takem primeru ne moremo zagotoviti, da je objekt, ki se nahaja v predpomnilniku, še konsistenten s podatkovno bazo. Zato je v teh primerih uporaba predpomnilnika odsvetovana Zaklepanje Pri dostopanju do podatkov v podatkovni bazi se srečujemo s problemom konsistence podatkov. Postavlja se vprašanje, ali so podatki, ki smo jih prebrali iz podatkovne baze, še vedno aktualni? Skozi zgodovino sta se uveljavila dva načina, kako reševati problem konsistence podatkov. To sta pesimistično in optimistično zaklepanje. Pri pesimističnem zaklepanju (angl.»pessimistic Concurrency«) fizično zaklenemo zapis v tabeli. Vsako povpraševanje, ki bi želelo prebrati vsebino, medtem ko je zapis zaklenjen, mora počakati, dokler se zapora ne sprosti.[35] Tak način zaklepanja uporabljajo transakcije, pri katerih so zapisi, nad katerimi operirajo, zaklenjene, dokler se transakcija izvaja. Nasprotje tega je optimistično zaklepanje (angl.»optimistic Concurrency«). V tem načinu se zapis ne zaklene, zato moramo sami ugotavljati nekonsistentnost podatkov. Pogosto se

77 Zagotavljanje trajnosti objektov v ogrodju.net Stran 63 za to uporabljajo posebni atributi, kot so zaporedna številka, ki se poveča ob vsakem popravku, datum zadnje spremembe ali časovna značka (angl.»timestamp«).[35] Prednost tega načina je, da omogočamo dostop do celotne vsebine tabele, kljub temu da urejamo posamezen zapis. Na drugi strani moramo izpostaviti tudi slabost, ki jo ta način prinaša, kadar pride do konflikta. V tem primeru se proži izjema, ki jo morajo razvijalci ustrezno razrešiti Metrike programske kode Razvijalci že od nekdaj merijo programsko kodo. Zaradi tega so se skozi čas razvile metrike, s pomočjo katerih ugotavljamo kakovost programske kode. Razloge, zakaj smo se odločili, da uvedemo metrike kot primerjalni kriterij, najdemo v tem, da ogrodji LINQ to SQL in ADO.NET Entity Framework generirata lastne razrede. S pomočjo metrik programske kode želimo izmeriti kvaliteto in obseg te kode. Za primerjavo bodo služili razredi, ki jih uporablja ogrodje NHibernate. Za analizo smo izbrali naslednje štiri metrike: število vrstic kode, sklopljenost razredov, ciklomatično kompleksnost in indeks vzdrževalnosti. Število vrstic kode Za ugotovitev velikosti se lahko uporabljajo preproste metrike, kot je število vrstic kode (angl.»lines of Code«). To je zagotovo najstarejša in najbolj preprosta metrika. Rezultat metrike je število vrstic, ki poda velikost. Pri tem je pomembno, katere vrstice upoštevamo. Ogrodje za analizo programske kode znotraj Visual Studia 2008 Team System upošteva vse vrstice razen komentarjev, deklaracij spremenljivk, metod in imenskih področij. [37] Sklopljenost razredov Sklopljenost je merilo relativne neodvisnosti modulov oziroma komponent. V tem primeru merimo sklopljenost razredov (angl.»class Coupling«). Metrika za vsak razred izračuna

78 Zagotavljanje trajnosti objektov v ogrodju.net Stran 64 število z njim povezanih razredov. Ta številka ne vključuje primitivnih tipov ogrodja.net in razreda object. Visoka sklopljenost ima za posledico nizko ponovno uporabo, saj so razredi močno vezani na kontekst in jih je težko uporabiti v drugačnem kontekstu. Poleg tega se, veliko število gosto med sabo povezanih razredov, odraža v nepreglednosti in težko razumevajoči kodi. To je pogosto posledica slabega načrtovanja, kjer niso ustrezno definirane odgovornosti razredov.[36] Ciklomatična kompleksnost Ciklomatična kompleksnost (angl.»cyclomatic Complexity«) je bila prvič predstavljena leta [36] Njena naloga je ovrednotiti težavnost testiranja in vzdrževanja programske kode. To zagotavlja s štetjem vseh možnih vejitev. Metrika poveča število ob vsakem pogoju if ali switch ter zankah do, while, for in foreach. V praksi se metrika uporablja za določitev števila testov, da zagotovimo polno pokritost kode.[36] V našem primeru bo služila, kot indikator kompleksnosti generirane programske kode. Indeks vzdrževalnosti Zadnja metrika, ki jo bomo uporabili, se imenuje indeks vzdrževalnosti (angl.»maintainability indeks«). Indeks ne meri posamezne značilnosti programske kode, ampak je sestavljen iz števila vrstic kode, ciklomatične kompleksnosti in Halsteadove metrike. Raziskave so pokazale povezanost indeksa in truda, potrebnega za vzdrževanje. Indeks vzdrževalnosti je dober indikator, kdaj zamenjati star sistem, ali kdaj je potrebno premisliti načrtovanje novega. [36] Vrednosti indeksa vzdrževalnosti so omejene med 0 in 100. Pri tem vrednost med 20 in 100 pomeni odlično vzdrževalnost. Vrednost med 10 in vključno 19 pomeni srednje dobro vzdrževalnost. Če pade indeks pod 10, je to znak kompleksne kode, ki jo je zelo težko vzdrževati.[37]

79 Zagotavljanje trajnosti objektov v ogrodju.net Stran Učinkovitost delovanja Za zadnji kriterij smo se odločili primerjati učinkovitost delovanja ogrodij. Pri tem se bomo osredotočili na hitrost povpraševanja in izvedbe CRUD-operacij ter učinkovitost porabe sistemskih sredstev, kot sta procesor in pomnilnik. Kratica CRUD pomeni zaporedje operacij ustvarjanja (angl.»create«), prebiranja (angl.»read«), posodabljanja (angl.»update«) in brisanja (angl.»delete«). Ta akronim pogosto najdemo v literaturi za opis najpogostejših operacij, ki jih izvaja informacijski sistem. Za potrebe tega kriterija bomo izdelali aplikacijo, s katero bomo izmerili potreben čas za izvajanje povpraševanj in CRUD-operacij. Le-te bomo izvedli v več ciklusih, da zagotovimo zadostno podlago za analizo rezultatov in izključimo odstopanja, ki bi se lahko pojavila v meritvah. Za pridobitev realno primerljivih rezultatov smo se odločili, da bomo uporabili podatkovno bazo AdwentureWorks. To je demonstracijska podatkovna baza podatkovnega strežnika SQL Server Nad to podatkovno bazo bomo izvedli več povpraševanj. Najprej bomo preizkusili enostavno povpraševanje nad eno entiteto. Le-to bomo nadgradili v drugem preizkusu, kjer bomo ustvarili bolj kompleksno poizvedbo, ki bo vključevala projekcijo, združevanje tabel, agregatne funkcije, grupiranje in sortiranje. Poleg teh poizvedb želimo prikazati še nalaganje na zahtevo in njegove negativne posledice ob napačni uporabi. Nazadnje bomo preizkusili še učinkovitost izvedbe CRUD operacij in primerjali porabo pomnilnika in izkoriščenost procesorja. 4.2 Analiza Grafična in pomožna orodja Pri primerjavi ogrodij smo ugotovili, da samo Microsoftovi ogrodji ponujata grafična orodja. To je velika pomanjkljivost ogrodja NHibernate, kajti že v danem primeru, kjer smo v preslikavo vključili 67 razredov, se je pokazala nujnost uporabe grafičnega orodja. Žal tudi na internetu nismo našli orodja, ki bi omogočalo vizualno predstavitev hbmdatotek. Največ pomoči, ki jo lahko pričakujemo, je IntelliSense podpora in validacija hbm-datotek.

80 Zagotavljanje trajnosti objektov v ogrodju.net Stran 66 Razlog, zakaj tako odločno vodita Microsoftovi ogrodji, lahko izpeljemo iz povezanosti ogrodja.net in razvojnega okolja Visual Studio. LINQ to SQL nudi grafični vmesnik za urejanje datotek dbml, ki služijo kot vhod v generiranje razredov. Tudi drugo orodje ponuja grafično orodje ADO.NET Entity Data Model Designer ali krajše EDM Designer. Obe orodji sta tesno integrirani v razvojno okolje Visual Studio 2008 in ponujata nazoren pregled nad entitetami in relacijami med njimi. Medtem ko je grafično orodje ogrodja LINQ to SQL omejeno na spreminjanje imen atributov in preslikave, omogoča EDM Designer izvedbo kompleksnejših preslikav in relacij. Zaradi kompleksnosti shem EDM je uporaba grafičnega orodja neizbežna. Pri tem je potrebno poudariti, da grafično orodje niti ne podpira vseh lastnosti entitetnega podatkovnega modela. Zato je v nekaterih primerih potrebno ročno spreminjanje edmxdatoteke. Poleg grafičnih ponujata ogrodji še orodja, ki se zaganjajo iz ukazne vrstice. To sta že opisana SqlMetal in EdmGen. Ti omogočata izdelavo razredov iz modela, oziroma modela iz podatkovne baze Podpora dedovanju in polimorfizmu Pri podpori dedovanja se pokažejo slabosti ogrodja LINQ to SQL. Ta namreč podpira samo eno strategijo preslikave hierarhije razredov v podatkovno bazo, to je ena tabela za vse razrede. Ta strategija uporablja ločilni atribut, na podlagi česar se odloča, v kateri razred se zapis preslika. Drugi ogrodji se boljše izkažeta, saj podpirata vse tri načine razreševanja dedovanja. Za dosego tega uporablja NHibernate elemente subclass, union-subclass in joinedsubclass. Element subclass določa strategijo ena tabela za vse razrede, pri čemer moramo v nadrazredu definirati discriminator, ki določa ločilni atribut. Strategijo tabela na konkreten razred določa union-subclass, joined-subclass pa tabelo na razred. Kot že omenjeno, tudi ADO.NET Entity Framework omogoča uporabo vse treh strategij. Le-te se določajo z orodjem EDM Designer. Zaradi kompleksnih posledic, ki jih ima vnos

81 Zagotavljanje trajnosti objektov v ogrodju.net Stran 67 dedovanja v shemo entitetnega podatkovnega modela, le teh tukaj ne bomo podrobneje opisovali. Natančen opis in razlago lahko najdemo v [12] in [28] Podpora različnim sistemom za upravljanje s podatkovno bazo Podpora sistemom za upravljanje s podatkovno bazo je povezana z arhitekturno zasnovo ogrodij. Pri tem LINQ to SQL podpira samo podatkovni strežnik Microsoft SQL Server od različice 2000 naprej. Na drugi strani ogrodje NHibernate za dostop do podatkov gradi na ADO.NET podatkovnih ponudnikih. Ti omogočajo uporabo ponudnikov za podatkovne baze, kot so Microsoft SQL Server, Oracle, IBM DB2, MySQL, ODBC in drugih, ki jih poznamo iz klasičnega razvoja z ADO.NET. Tudi ogrodje ADO.NET Entity Framework gradi na enakih ponudnikih, vendar morajo ti dodatno podpreti ogrodje. Temu Microsoft pravi Entity Framework omogočeni ponudniki (angl.»entity Framework Enabled Data Provider«). Celoten seznam ponudnikov je na voljo na [38]. Pri tem moramo poudariti, da Microsoft ne načrtuje podpore za standard Open Database Connectivity (ODBC) ter posledično tudi ne podatkovne baze Access Kriteriji»Persistence Ignorance«Za ocenjevanje kriterijev PI smo izbrali tri vrednosti. Ogrodje lahko popolnoma, sploh ne, ali le delno izpolnjuje kriterije. V nekaterih primerih smo ugotovili, da ogrodja težko v celoti izpolnijo kriterij, a ne moremo reči, da ga sploh ne. Zato smo se odločili, da v takih primerih podelimo oceno delno izpolnjuje. Sedaj bomo na kratko predstavili in komentirali rezultate, ki so razvidni iz tabele 4.1. Najprej smo ovrednotili ogrodje LINQ to SQL, ki skoraj v celoti izpolnjuje vse kriterije. Ne zahteva dedovanja od nadrazreda ali izdelave primerkov preko tovarniške metode, ne dopušča pa uporabe standardnih zbirk. Če želimo uporabiti nalaganje na zahtevo, orodje zahteva uporabo tipov EntityRef za relacije mnogo proti ena in EntitySet za relacije ena proti mnogo in mnogo proti mnogo. Pri tehnologiji LINQ smo prisiljeni uporabljati vmesnika IEnumerable<T> in IQuerable<T>. Poleg tega ogrodje privzeto izdela razrede, ki implementirajo vmesnika INotifyPropertyChanging in INotifyPropertyChanged. Vendar ta vmesnika nista pogojena z ogrodjem, služita

82 Zagotavljanje trajnosti objektov v ogrodju.net Stran 68 samo lažji dopolnitvi delnih razredov. Zato smo podelili le oceno delno izpolnjuje. LINQ to SQL predpisuje samo privzet konstruktor, zaradi tega tudi samo ocena delno izpolnjuje. Ogrodje ne predpisuje ali prepoveduje uporabe specifičnih atributov, vedeti moramo le, da ogrodje za namen preslikave potrebuje anotacije. Te so potrebne tudi če uporabimo eksterno definirano XML datoteko, zato zadnjega pogoja ne izpolnjuje. Na drugi strani imamo NHibernate, ki izhaja iz javanske različice, za katero je značilen visok nivo»persistence Ignorance«. In tako je tudi pri ogrodju NHibernate. V večini NHibernate izpolnjuje vse kriterije, a vendar ima nekaj omejitev. Najprej bi omenili potrebo po privzetem konstruktorju. Nadalje ni dovoljena uporaba readonly atributov in predpisana je uporaba ključne besede virtual na atributih. Zaradi tega si je ogrodje prislužilo skoraj najvišjo možno oceno. Izpostaviti moramo le dva kriterija, kjer je ogrodje prejelo oceno delno izpolnjuje. Kot smo ugotovili do sedaj, LINQ to SQL dobro izpolnjuje kriterije, sedaj bomo pogledali rezultate naprednejšega od obeh Microsoftovih ogrodij. Entity Framework privzeto deduje od razreda EntityObject, a le-ta za preslikavo ni nujno potreben, saj so razvijalci ogrodja omogočili preslikavo samo z uporabo vmesnikov. Le-to so poimenovali princip IPOCO, kar pomeni POCO z uporabo vmesnikov. Zaradi tega si je ogrodje v četrtem kriteriju zaslužilo negativno oceno. Navkljub temu da ogrodje eksplicitno ne zahteva uporabe razreda EntityObject, si je vendarle prislužilo le vmesno oceno, saj menimo, da se bo večinoma uporabljala rešitev z dedovanjem od razreda EntityObject. Poleg naštetega ogrodje še zahteva shranjevanje vrednost EntityKey objekta in dopolnjen dostop do atributov s kodo, potrebno za vodenje sprememb. Zaradi teh lastnosti se je ogrodje odrezalo slabše od pričakovanj in prejelo skupno najslabšo oceno. Tabela 4.1 Kriteriji»Persistence Ignorance«Kriterij Dedovanje od specifičnega nadrazreda Izdelava primerkov objektov samo s tovarniško metodo Uporaba posebnih podatkovnih tipov Implementirati predpisan vmesnik Predpisati specifičen konstruktor Predpisati obvezne specifične atribute LINQ to SQL ADO.NET Entity Fr. NHibernate

83 Zagotavljanje trajnosti objektov v ogrodju.net Stran 69 Prepovedana ali obvezna uporaba določenih konstruktov - Izpolnjuje kriterij - Delno izpolnjuje kriterij - Ne izpolnjuje kriterija Na podlagi zgornje tabele vidimo, da obstajajo bistvene razlike med ogrodji. Kot najboljše se je izkazalo ogrodje NHibernate, temu sledi LINQ to SQL, razočaral je ADO.NET Entity Framework. Vendar če ob tem upoštevamo zrelost ogrodij, to ni več tako presenetljivo. NHibernate je bilo leta 2005 prvo ogrodje za objektno relacijsko preslikavo v ogrodju.net. Temu je šele konec leta 2007 sledilo ogrodje LINQ to SQL, julija 2008 je izšel ADO.NET Entity Framework. Na podlagi teh podatkov je razumljivo, zakaj je NHibernate uspel doseči tako visok nivo»persistence Ignorance« Dinamične poizvedbe Za razumevanje različnih načinov poizvedb je potrebno poznati zgodovino razvoja ORMogrodij. Ogrodje NHibernate je bilo prevedeno iz javanske različice Hibernate. Le-ta je vsebovala povpraševalni jezik HQL, ki ga je prevzel tudi NHibernate. Ta jezik se močno zgleduje po jeziku SQL in skoraj v celoti uporablja poznano sintakso. SQL je namreč najbolj uveljavljen in standardiziran povpraševalni jezik, ki se razvija že od leta Tako je razumljivo, zakaj so se razvijalci zgledovali po tem jeziku. Tako kot NHibernate, ponuja tudi Entity Framework svoj povpraševalni jezik Entity SQL, ki tudi posnema jezik SQL. Vendar imajo vsi ti jeziki skupno slabost. Zapisani so namreč v besedilu kot niz znakov in zato niso v dosegu prevajalnika. Zaradi tega so pri Microsoftu začeli razvijati povpraševanja, ki bi bila napisana v programski kodi. Nastal je LINQ, ki je prinesel novost v programski svet, kot je še ni bilo. Kajti LINQ omogoča, da pišemo poizvedbe nad strogo tipiziranimi objekti s polno podporo IntelliSense in prevajalnika. Treba je povedati, da sta se ogrodji LINQ to SQL in ADO.NET Entity Framework razvijali neodvisno. Šele s pojavom tehnologije LINQ so ADO.NET razvijalci videli potencial in razvili različico LINQ to Entities. Zaradi razširljivosti tehnologije LINQ se pojavljajo vedno nova področja uporabe. Tako je bil tudi razvit dodatek LINQ to NHibernate, ki omogoča izvajanje povpraševanj nad NHibernate entitetami.

84 Zagotavljanje trajnosti objektov v ogrodju.net Stran 70 Kot vidimo, so komaj z uvedbo tehnologije LINQ poizvedbe prišle pod nadzor prevajalnika. Žal smo pri LINQ-poizvedbah trenutno še omejeni na samo nekaj standardnih povpraševalnih operatorjev, a kljub temu je to velik napredek od poizvedb, zapisanih v nizu Sprotno nalaganje in nalaganje na zahtevo Nalaganje na zahtevo je privzet način nalaganja relacij v vseh primerjanih ogrodij. Medtem ko je to v ogrodjih LINQ to SQL in NHibernate podprto implicitno, je potrebno v ogrodju Entity Framework to eksplicitno zahtevati s klicem metode Load. Zaradi tega postane koda hitro nepregledna, saj moramo vsakič preverjati, ali je relacija naložena, in jo naložiti, če ni. Seveda je možno že v času poizvedbe naložiti ogrodju, da naloži potrebne objekte, a nas to pripelje do sprotnega nalaganja. ADO.NET Entity Framework omogoča sprotno nalaganje relacij z uporabo metode Include, nad razredom ObjectQuery. Tudi LINQ to SQL ima podporo za sprotno nalaganje, vendar je ta implementirana na drugačen način. Da določimo, katere relacije naj se naložijo hkrati z objektom, moramo ustvariti objekt tipa DataLoadOptions in v metodi LoadWith<T> določiti relacijo, ki naj se naloži. Te nastavitve podamo razredu DataContext, ki poskrbi, da se bodo relacije naložile ob istem času kot objekt. Pri ogrodju NHibernate je postopek preprostejši. Za potrebe sprotnega nalaganja je treba v XML-datoteki, ki opisuje preslikavo, nastaviti atribut relacije lazy na false. Vendar ima to tudi slabo stran, saj se relacije naložijo tudi takrat, kadar jih ne potrebujemo. V ostalih ogrodjih se namreč ta lastnost nastavi v času izvajanja, za vsako povpraševanje posebej Shranjene procedure Vsa tri ogrodja podpirajo shranjene procedure, vendar vsako na svoj način. Dodajanje shranjenih procedur v ogrodju LINQ to SQL poteka preko grafičnega orodja. Pri tem se za vse shranjene procedure izdelajo ustrezne metode v razredu DataContext. Ogrodje omogoča uporabo tako shranjenih procedur, ki vračajo skalarne vrednost, kakor tudi tistih, ki vračajo celotne zapise. Od tega je odvisno, ali se rezultat procedure preslika v entiteto

85 Zagotavljanje trajnosti objektov v ogrodju.net Stran 71 ali se izdela nov razred, katerega atributi predstavljajo izhodne vrednosti shranjene procedure. V ogrodju NHibernate se shranjene procedure dodajajo v datotekah hbm. Pri tem smo omejeni samo na procedure, ki vračajo celotne zapise. Shranjeno proceduro definiramo v sql-query elementu, kjer podamo ukaz za proženje in ime procedure ter seznam parametrov. Iz kode dostopamo do shranjene procedure preko sejnega objekta in metode GetNamedQuery. Žal NHibernate ne omogoča tako intuitivnega načina uporabe, kot to ponuja LINQ to SQL. Tudi Entity Framework v tej točki na zaostaja za ostalima. Polno podporo ponuja tako shranjenim proceduram, ki vračajo skalarne vrednosti, kot tudi tistim, ki vračajo entitete. Procedure se preprosto dodajajo preko grafičnega orodja EDM Designer. Za vsako shranjeno proceduro, ki jo dodamo, se izdela ustrezna metoda v razredu ObjectContext. Glede zamenjave ukazov za vstavljanje, brisanje in posodabljanje entitet s shranjenimi procedurami, lahko povemo, da jih vsa preizkušena ogrodja podpirajo v enaki meri Transakcije Vsa ogrodja podpirajo transakcije, s tem da ogrodji LINQ to SQL in ADO.NET Entity Framework podpirata tako eksplicitno, kot tudi implicitno uporabo transakcij. Eksplicitna uporaba transakcije pomeni, da uporabnik v programski kodi zahteva uporabo transakcije. Na drugi strani imamo implicitno uporabo, kjer je ogrodje samo zmožno ugotoviti, kdaj je potrebna uporaba transakcije. Za implicitno uporabo transakcij skrbi vzorec enota dela, ki ob večjem številu vnosov, izbrisov ali posodobitev avtomatsko uporabi transakcijo. Ogrodje NHibernate v tej točki malce zaostaja, saj je potrebno vsako uporabo transakcije eksplicitno definirati. Treba je še poudariti, da vsa tri ogrodja uporabljajo transakcije iz ogrodja ADO.NET Predpomnjenje Uporaba predpomnilnika je šibka točka Microsoftovih ogrodij, saj nobeno od ogrodij tega ne podpira. Le ogrodje NHibernate ponuja možnost predpomnjenja objektov. Za

86 Zagotavljanje trajnosti objektov v ogrodju.net Stran 72 razumevanja predpomnjenja kakor ga uporablja NHibernate, moramo poznati arhitekturno zasnovo ogrodja. Le-ta nudi dva nivoja predpomnilnika. Prvonivojski predpomnilnik služi sejnemu objektu in vzorcu slovar identitet za shranjevanje referenc. Ta se ustvari za vsako sejo posebej, je popolnoma neodvisen od drugih sej in se ob njenem zaprtju uniči. Drugonivojski predpomnilnik je tisti, do katerega imamo dostop razvijalci. Za vklop je potrebno v konfiguracijsko datoteko vnesti ustrezne informacije o razredu, ki upravlja predpomnjenje. NHibernate ne ponuja svojih ponudnikov za upravljanje predpomnilnika, lahko pa uporabimo predpomnilnik iz ogrodja ASP.NET ali katerega izmed odprtokodnih ponudnikov. Ne glede na to, za katerega ponudnika se odločimo, je upravljanje s predpomnilnikom enako, saj je vsa funkcionalnost dostopna preko vmesnika ICache. Potrebno je izpostaviti še delovanje drugonivojskega predpomnilnika. Ta namreč ne hrani celotnega grafa objektov in njihovih povezav, ampak si ga lahko predstavljamo kot seznam zgoščenih tabel, ki vsebujejo vrednosti atributov objekta. Pri izvedbi povpraševanj, le-te najprej preverijo, ali objekt obstaja v predpomnilniku. Če obstaja zapis v predpomnilniku, se iz zgoščene tabele rekonstruira objekt. V nasprotnem primeru se izvede povpraševanje nad podatkovno bazo Zaklepanje Pri primerjavi smo ugotovili, da vsa tri ogrodja uporabljajo optimistično zaklepanje. To pomeni, da se pri vsakem shranjevanju sprememb preverja konsistenca podatkov s podatkovno bazo. Vsako ogrodje je implementirano tako, da proži izjemo, če ugotovi nekonsistenco podatkov. Medtem ko ogrodji LINQ to SQL in ADO.NET Entity Framework ne podpirata eksplicitnega pesimističnega zaklepanja, pa ogrodje NHibernate to omogoča. Pri tem je treba poudariti, da se ne zaklepajo objekti, ampak n-terice, ki jih ti objekti predstavljajo. NHibernate za potrebe zaklepanja ponuja metodo Lock, definirano v vmesniku ISession. Le-ta lahko zaklene zapis z uporabo različnih mehanizmov, kot so Write, Upgrade in Read. S tem ukazom si zagotovimo ekskluzivni dostop do zapisa, ki se sprosti komaj ob zapisu spremembe v podatkovno bazo.

87 Zagotavljanje trajnosti objektov v ogrodju.net Stran Metrike programske kode Metrike programske kode, ki smo jih podrobneje opisali v prejšnjem poglavju, smo izračunali s pomočjo orodja, vgrajenega v razvojno okolje Visual Studio 2008 Team System. Ta metrike ne izračunava na podlagi izvorne kode, ampak uporablja vmesno kodo (angl.»intermediate Language«), ki nastane po prevajanju. Tabela 4.2 povzema rezultate, ki smo jih dobili na podlagi izvedbe metrik. Knjižnice, nad katerimi smo jih izvedli, so enake, kot jih uporabljamo pri meritvah učinkovitosti ogrodij, opisanih v naslednjem poglavju. Sedaj povejmo le, da so razredi izdelani na podlagi entitet podatkovne baze AdwentureWorks. Pri izdelavi smo uporabili ustrezna grafična orodja, oziroma v primeru ogrodja NHibernate smo uporabili ogrodje MyGeneration. Pri tem smo uporabili predlogo, ki izdela razred, njegov privzeti konstruktor, zasebne atribute in metode za njihov dostop ter relacije za tuje ključe. Razredi ogrodja NHibernate služijo kot referenčna vrednost domenskega modela, saj ne vsebujejo kode, ki bi jo vsiljevalo ogrodje. Tabela 4.2 Izračunane metrike programske kode Metrika LINQ to SQL ADO.NET Entity Framework NHibernate Število vrstic kode Sklopljenost razredov Ciklomatična kompleksnost Indeks vzdrževalnosti Na podlagi dobljenih rezultatov vidimo, da imata ogrodji LINQ to SQL in Entity Framework večji obseg kode, kot je to pri ogrodju NHibernate. Pri ogrodju LINQ to SQL tega obsega ne moremo izključno pripisati razredu DataContext, saj le-ta vsebuje le 76 vrstic kode. Večino obsega namreč predstavljajo entitete. Pri ogrodju Entity Framework je implementacija boljša, kar ima za posledico manjši obseg kode. Opazen je le povečan obseg kode v razredu ObjectContext, ki ima 267 vrstic. Še večje razlike se pokažejo pri sklopljenosti razredov. Vidimo, da ima NHibernate zelo nizko sklopljenost. To je posledica uporabe šibko tipiziranih vmesnikov, ki jih uporabljamo za relacije ena proti mnogo in mnogo proti mnogo. NHibernate namreč odsvetuje uporabo strogo tipiziranih zbirk. Višja sklopljenost pri ostalih dveh ogrodjih je posledica uporabe strogo tipiziranih relacij, konteksta in sledenja spremembam. Vse te lastnosti samo potrjujejo slabo neodvisnost modela od ogrodja.

88 Zagotavljanje trajnosti objektov v ogrodju.net Stran 74 Ciklomatična kompleksnost izraža število možnih poti skozi kodo. Pri ogrodjih NHibernate in Entity Framework sta ti vrednosti skoraj izenačeni. Malenkost višja vrednost ogrodja Entity Framework je posledica visoke ciklomatične kompleksnosti razreda ObjectContext. Ta vrednost je dosežena predvsem z odsotnostjo implicitnega nalaganja na zahtevo. Če bi preverjali, ali so relacije naložene, bi bila v entitetnih razredih ta vrednost zagotovo višja, kakor vidimo pri ogrodju LINQ to SQL. Predvsem zaradi tega vidimo izjemno povišanje ciklomatične kompleksnosti v ogrodju LINQ to SQL. Zadnja metrika, ki smo jo uporabili, je indeks vzdrževalnosti. Kot vidimo na podlagi rezultatov, vsa primerjana ogrodja nudijo visok nivo vzdrževalnosti. Zelo dobro se izkaže ogrodje NHibernate, ki ima najvišji indeks. Tak rezultat ni presenetljiv, saj razredi vsebujejo samo konstruktor in atribute. Dober rezultat je doseglo tudi ogrodje ADO.NET Entity Framework, saj skozi vse razrede ponuja visok indeks vzdrževalnosti. V tem kriteriju razočara le ogrodje LINQ to SQL. Pri podrobnejši analizi smo ugotovili, da v nekaterih razredih pade indeks vzdrževalnosti celo pod 70. Čeprav je to še vedno v mejah odlične vzdrževalnosti, ta kaže na slabšo neodvisnost modela od ogrodja. Če povzamemo, ugotovimo, da so metrike dober pokazatelj neodvisnosti modela od ogrodja in nudijo kvantitativno dopolnilo kriterijem»persistence Ignorance«. Iz rezultatov je razvidno, da ogrodji LINQ to SQL in ADO.NET Entity Framework ne ponujata visoke neodvisnosti modela od ogrodja. Seveda so slabši rezultati tudi posledica generiranja razredov na podlagi podatkovnega modela in s tem posledično tudi kode, ki jo uporablja ogrodje. A smo zavestno izbrali ta način, ker predstavlja najpogostejši način uporabe ogrodja Učinkovitost delovanja Za potrebe testiranja smo se odločili uporabiti podatkovno bazo AdwentureWorks. To je demonstracijska podatkovna baze za podatkovni strežnik SQL Server 2005 in predstavlja podjetje, ki izdeluje in trži kolesa. Prednost uporabe te podatkovne baze je v tem, da podatkovna shema vsebuje tabele in smiselno med seboj povezane podatke. Po določitvi podatkovnega vira smo izdelali potrebne entitete. Ker ogrodje NHibernate samo ne omogoča uvoza entitet iz tabel, smo uporabili program MyGeneration, ki je z

89 Zagotavljanje trajnosti objektov v ogrodju.net Stran 75 ustreznimi predlogami sposoben izdelati razrede in potrebne konfiguracijske datoteke.[39] Odločili smo se za predlogo, ki izdela razred, njegov privzeti konstruktor, zasebne atribute in metode za njihov dostop ter relacije za tuje ključe. Po izboru orodij smo izdelali entitetne razrede za vse tabele podatkovne baze AdwentureWorks. Dalje je sledila krajša optimizacija modela in razrešitev relacij mnogo proti mnogo. Nato smo ustvarili preprosto konzolno aplikacijo, v kateri smo definirali vmesnik IBenchmark, ki predpisuje metodo Run in dogodek ReportProgress. Vsi testi implementirajo ta vmesnik, in s pomočjo razreda System.Diagnostics.Stopwatch merijo porabljen čas. S tem smo zagotovili, da lahko izvedemo vse teste preko enotnega vmesnika. Primer razreda, ki implementira ta vmesnik, je prikazan v primeru 4.1. public class LINQtoSQLBenchmark : IBenchmark { System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); #region IBenchmark Members public void Run(int count, object param) { sw.start(); AWDataContext awcontext = new AWDataContext(); ReportProgress(sw.ElapsedMilliseconds, EventArgs.Empty); for (int i = 0; i < count; i++) { List<SalesOrderDetail> sales = (from salesorder in awcontext.salesorderdetails where salesorder.orderqty > param select salesorder).tolist(); } ReportProgress(sw.ElapsedMilliseconds, EventArgs.Empty); } sw.stop(); public event EventHandler ReportProgress; } #endregion Primer 4.1 Primer testa za meritev časovne učinkovitosti V nadaljevanju predstavljeni rezultati temeljijo na povprečni vrednosti meritev, ki smo jih izvedli v več ciklusih na sistemu z naslednjo konfiguracijo: procesor Intel Pentium HT GHz,

90 Zagotavljanje trajnosti objektov v ogrodju.net Stran GByte pomnilnika, podatkovni strežnik Microsoft SQL Server 2008 in operacijski sistem Microsoft Windows Vista SP1. Za referenčne vrednosti smo se odločili uporabiti knjižnice in razrede iz standardnega nabora ADO.NET. Ker se povezujemo s podatkovnim strežnikom Microsoft SQL Sever 2008, se ti razredi nahajajo v imenskem prostoru System.Data.SqlClient. Enostavna poizvedba Najprej smo izvedli meritev hitrosti 100-tih poizvedb nad eno tabelo z omejitvijo, katerih rezultati vračajo približno zapisov. Pri tem smo merili čas nalaganja, in čas po vsaki poizvedbi. V tabeli 4.3 navajamo čas nalaganja, trajanje prve in stote poizvedbe ter skupen čas. Te vrednosti so pomembne za razumevanje delovanja ogrodij. Čas nalaganja je čas v katerem izdelamo primerek konteksta oz. seje. Ta je v primeru ogrodja NHibernate daljši, saj je izdelava seje časovno potratna. Razlika med prvo in stoto poizvedbo je posledica uporabe slovarja identitet in notranje optimizacije ogrodij. Pri tem je treba dodati, da pri nobeni meritvi nismo uporabili predpomnilnika. Tabela 4.3 Primerjava hitrosti izvedbe povpraševanja LTS HQL CQ E SQL LTE SQL Čas nalaganja [ms] izvedba [ms] izvedba [ms] Skupen čas [ms] LTS LINQ to SQL, HQL Hibernate Query Language, CQ Criteria Query, E SQL Entity SQL, LTE LINQ to Entities, SQL SqlClient Kot vidimo iz zgornje tabele, pride do presenetljivega končnega rezultata. Nepričakovano ogrodje LINQ to SQL izvede poizvedbe hitreje, kot referenčna meritev z uporabo standardnih knjižnic. Slika 4.1 prikazuje čas, potreben za izvedbo določenega števila operacij. Pri tem opazimo strogo linearno naraščanje krivulj, kar je posledica neuporabe predpomnilnika. Pri ogrodju NHibernate opazimo daljši čas za izdelavo sejnega objekta, nato pa bolj položno premico.

91 Zagotavljanje trajnosti objektov v ogrodju.net Stran 77 Slika 4.1 Primerjava hitrosti izvedbe povpraševanja V izvedenem testu je razočaralo ogrodje ADO.NET Entity Framework, saj ga je predzadnje uvrščeno ogrodje NHibernate prehitelo kar za polovico. Pri podrobnejši analizi opazimo, da ne pride do večjih odstopanj med različnimi načini poizvedbe znotraj enega ogrodja. Tako obe povpraševalni metodi v ogrodju NHibernate dosežeta identičen rezultat in tudi pri ogrodju Entity Framework ne pride do večjih razlik med poizvedbami opravljenimi z Entity SQL in LINQ to Entities. Kompleksna poizvedba Za drugo meritev smo se odločili uporabiti kompleksnejšo poizvedbo, ki bo vsebovala projekcijo čez več tabel, grupiranje in sortiranje. Tako smo izdelali poizvedbo, ki pridobi podatke o kupcih, njihovi skupni vrednosti vseh nakupov in vse to uredi v padajočem vrstnem redu glede na skupno vrednost nakupov. Čas nalaganja posameznega ogrodja je v vseh meritvah enak. Zato jih v nadaljevanju več ne navajamo. Tabela 4.4 Primerjava hitrosti izvedbe kompleksnega povpraševanja LTS HQL CQ E SQL LTE EC SQL 1. izvedba [ms] izvedba [ms] Skupen čas [ms] LTS LINQ to SQL, HQL Hibernate Query Language, CQ Criteria Query, E SQL Entity SQL, LTE LINQ to Entities, EC EntityClient, SQL SqlClient

92 Zagotavljanje trajnosti objektov v ogrodju.net Stran 78 Kot lahko razberemo iz tabele 4.4, se vrednosti bistveno ne razlikujejo od prej. Za razliko poskrbi le ogrodje NHibernate, ki z jezikom HQL prehiti poizvedbe, opravljene s SQL. Tudi ponudnik na nivoju entitete (EntityClient) se ne odreže bistveno bolje od objektnih storitev. Negativno izstopa kriterijsko povpraševanje, saj zasede zadnje mesto. To je zagotovo rezultat slabe podpore združevanju tabel v tem načinu, saj je potrebno za vsako združevanje izdelati nov objekt tipa ICriteria. Nalaganje na zahtevo Kako se obnese sprotno nalaganje, bomo prikazali v naslednji meritvi. Razred Employee ima dvosmerno relacijo na samega sebe, ki predstavlja razmerje nadrejeni podrejeni. Ogrodjem ORM smo naročili, naj to relacijo naložijo sproti, tako da dobimo celotno drevo objektov. Pri tem je treba poudariti, da ogrodje LINQ to SQL ne omogoča sprotnega nalaganja relacij na samega sebe. Zato so v tabeli 4.5 prikazani samo rezultati ogrodij NHibernate in Entity Framework. Tabela 4.5 Primerjava hitrosti nalaganja na zahtevo HQL CQ E SQL LTE 1. izvedba [ms] izvedba [ms] Skupen čas [ms] HQL Hibernate Query Language, CQ Criteria Query, E SQL Entity SQL, LTE LINQ to Entities Nalaganje na zahtevo je posebnost ogrodij ORM. Če bi to želeli izvesti z uporabo jezika SQL, bi potrebovali več poizvedb. Poleg tega ne bi bili zmožni doseči primerljivih rezultatov, saj v našem primeru nalagamo relacijo na samega sebe. To ima za posledico nepredvidljivo zaporedje nalaganja objektov v času, ko se gradi drevesna struktura. Zaradi tega smo v tem kriteriju izpustili referenčno vrednost. Vstavljanje, posodabljanje, brisanje Zadnji test, ki smo ga izvedli, je bil namenjen določitvi hitrosti ogrodij pri osnovnih operacijah, kot so vstavljanje, posodabljanje in brisanje objektov. Izdelali smo nov test, kjer ustvarimo primerek razreda ProductReview, ga napolnimo s podatki. Nato ta objekt vstavimo v podatkovno bazo, spremenimo atribut in ponovno shranimo spremembe. Na koncu še izbrišemo zapis iz podatkovne baze. Za določitev povprečne vrednosti smo ta

93 Zagotavljanje trajnosti objektov v ogrodju.net Stran 79 proces ponovili krat. Slika 4.2 prikazuje povprečni čas, ki je potreben za izvedbo opisanih operacij. Slika 4.2 Povprečen čas izvedbe vnosa, posodobitve in izbrisa Kot lahko vidimo, to delo najhitreje opravi ogrodje NHibernate. Ogrodje LINQ to SQL, ki se je do sedaj odlično izkazalo, tu ni doraslo svoji konkurenci. Povprečni čas je kar 600 % počasnejši od najhitrejšega in skoraj 250 % počasnejši od ogrodja ADO.NET Entity Framework. Učinkovitost porabe sistemskih sredstev Razen hitrosti izvedbe poizvedb nas je še zanimalo, kako učinkovito ogrodja uporabljajo sistemska sredstva, kot sta procesor in pomnilnik. Zato smo določili štiri kazalnike, ki omogočajo lažje razumevanje delovanja ogrodij. Ti kazalniki so: izkoristek procesorja, poraba pomnilnika, število naloženih knjižnic in število naloženih razredov. Tabela 4.6 Učinkovitost izrabe procesorja in pomnilnika LTS HQL CQ E SQL LTE SQL Procesor [%] 65,0 93,3 94,2 98,6 98,5 90,5 Pomnilnik [MB] 32,1 60,3 60,8 61,9 64,8 27,4 Št. nal. knjižnic Št. nal. razredov LTS LINQ to SQL, HQL Hibernate Query Language, CQ Criteria Query, E SQL Entity SQL, LTE LINQ to Entities, SQL SqlClient

PRIPOROČILA ZA OBLIKOVANJE KATALOGOV ZNANJA ZA MODULE V PROGRAMIH VIŠJEGA STROKOVNEGA IZOBRAŽEVANJA

PRIPOROČILA ZA OBLIKOVANJE KATALOGOV ZNANJA ZA MODULE V PROGRAMIH VIŠJEGA STROKOVNEGA IZOBRAŽEVANJA KATALOG ZNANJA 1. IME PREDMETA ZBIRKE PODATKOV I ZBIRKE PODATKOV II 2. SPLOŠNI CILJI Splošni cilji predmeta so: razvijanje sposobnosti za uporabo znanstvenih metod in sredstev, razvijanje odgovornosti

Prikaži več

Podatkovni model ER

Podatkovni model ER Podatkovni model Entiteta- Razmerje Iztok Savnik, FAMNIT 2018/19 Pregled: Načrtovanje podatkovnih baz Konceptualno načtrovanje: (ER Model) Kaj so entite in razmerja v aplikacijskem okolju? Katere podatke

Prikaži več

Chapter 1

Chapter 1 - 1 - Poglavje 1 Uvod v podatkovne baze - 2 - Poglavje 1 Cilji (Teme).. Nekatere domene, kjer se uporabljajo podatkovne baze Značilnosti datotečnih sistemov Problemi vezani na datotečne sisteme Pomen izraza

Prikaži več

Microsoft Word - M docx

Microsoft Word - M docx Š i f r a k a n d i d a t a : ržavni izpitni center *M15178112* SPOMLNSKI IZPITNI ROK Izpitna pola 2 Četrtek, 4. junij 2015 / 90 minut ovoljeno gradivo in pripomočki: Kandidat prinese nalivno pero ali

Prikaži več

Diapozitiv 1

Diapozitiv 1 Računalništvo in informatika Program: Mehatronika dr. Hubert Fröhlich, univ. dipl. el. Podatkovne baze 2 Podatkovne baze Podatki osnova za odločanje in izvajanje akcij tiskana oblika elektronska oblika

Prikaži več

Microsoft PowerPoint - PIS_2005_03_02.ppt

Microsoft PowerPoint - PIS_2005_03_02.ppt Utišajmo mobilne telefone! 1 Vsebina predmeta Osnove poslovnih informacijskih sistemov Modeliranje poslovnih procesov Podatkovne baze in modeliranje podatkov 2. del Osnove jezika SQL Življenjski cikel

Prikaži več

Vprašanja za 2. izpitno enoto poklicne mature Strokovni predmet NPA Vprašanja Visual C# (4. letnik) 1. Uporabniški vmesnik razvojnega okolja Visual C#

Vprašanja za 2. izpitno enoto poklicne mature Strokovni predmet NPA Vprašanja Visual C# (4. letnik) 1. Uporabniški vmesnik razvojnega okolja Visual C# Vprašanja za 2. izpitno enoto poklicne mature Strokovni predmet NPA Vprašanja Visual C# (4. letnik) 1. Uporabniški vmesnik razvojnega okolja Visual C# Pomen posameznih oken uporabniškega vmesnika, urejevalnik

Prikaži več

RAM stroj Nataša Naglič 4. junij RAM RAM - random access machine Bralno pisalni, eno akumulatorski računalnik. Sestavljajo ga bralni in pisalni

RAM stroj Nataša Naglič 4. junij RAM RAM - random access machine Bralno pisalni, eno akumulatorski računalnik. Sestavljajo ga bralni in pisalni RAM stroj Nataša Naglič 4. junij 2009 1 RAM RAM - random access machine Bralno pisalni, eno akumulatorski računalnik. Sestavljajo ga bralni in pisalni trak, pomnilnik ter program. Bralni trak- zaporedje

Prikaži več

CMSC 838T Lecture

CMSC 838T Lecture Uvod v UML Iztok Savnik Uvod Standarden jezik za pisanje specifikacij programske opreme. Poslovni informacijski sistemi Porazdeljene spletne aplikacije Vgnezdeni sistemi v realnem času Kreiranje konceptualnega

Prikaži več

Orodje za izvoz podatkov

Orodje za izvoz podatkov Pomoč uporabnikom -NA-SI-200, V6.13-00 IZUM, 2018 COBISS, COMARC, COBIB, COLIB, IZUM so zaščitene znamke v lasti javnega zavoda IZUM. KAZALO VSEBINE 1 Uvod... 1 2 Predstavitev orodja za izvoz podatkov...

Prikaži več

Microsoft Word - CNC obdelava kazalo vsebine.doc

Microsoft Word - CNC obdelava kazalo vsebine.doc ŠOLSKI CENTER NOVO MESTO VIŠJA STROKOVNA ŠOLA STROJNIŠTVO DIPLOMSKA NALOGA Novo mesto, april 2008 Ime in priimek študenta ŠOLSKI CENTER NOVO MESTO VIŠJA STROKOVNA ŠOLA STROJNIŠTVO DIPLOMSKA NALOGA Novo

Prikaži več

Diapozitiv 1

Diapozitiv 1 9. Funkcije 1 9. 1. F U N K C I J A m a i n () 9.2. D E F I N I C I J A F U N K C I J E 9.3. S T A V E K r e t u r n 9.4. K L I C F U N K C I J E I N P R E N O S P A R A M E T R O V 9.5. P R E K R I V

Prikaži več

Slide 1

Slide 1 Projektno vodenje PREDAVANJE 7 doc. dr. M. Zajc matej.zajc@fe.uni-lj.si Projektno vodenje z orodjem Excel Predstavitev Najbolj razširjeno orodje za delo s preglednicami Dva sklopa funkcij: Obdelava številk

Prikaži več

1 MMK - Spletne tehnologije Vaja 5: Spletni obrazci Vaja 5 : Spletni obrazci 1. Element form Spletni obrazci so namenjeni zbiranju uporabniških podatk

1 MMK - Spletne tehnologije Vaja 5: Spletni obrazci Vaja 5 : Spletni obrazci 1. Element form Spletni obrazci so namenjeni zbiranju uporabniških podatk 1 MMK - Spletne tehnologije Vaja 5: Spletni obrazci Vaja 5 : Spletni obrazci 1. Element form Spletni obrazci so namenjeni zbiranju uporabniških podatkov in njihov prenos med spletnimi mesti. Obrazec v

Prikaži več

Delavnica Načrtovanje digitalnih vezij

Delavnica Načrtovanje digitalnih vezij Laboratorij za načrtovanje integriranih vezij Univerza v Ljubljani Fakulteta za elektrotehniko Digitalni Elektronski Sistemi Osnove jezika VHDL Strukturno načrtovanje in testiranje Struktura vezja s komponentami

Prikaži več

Microsoft Word - M _mod..docx

Microsoft Word - M _mod..docx Državni izpitni center *M17278113* JESENSKI IZPITNI ROK NAVODILA ZA OCENJEVANJE Ponedeljek, 28. avgust 2017 SPLOŠNA MATURA Državni izpitni center Vse pravice pridržane. M172-781-1-3 2 IZPITNA POLA 1 1

Prikaži več

Microsoft Word - M doc

Microsoft Word - M doc Državni izpitni center *M11145113* INFORMATIKA SPOMLADANSKI IZPITNI ROK NAVODILA ZA OCENJEVANJE Petek, 10. junij 2011 SPLOŠNA MATURA RIC 2011 2 M111-451-1-3 IZPITNA POLA 1 1. b 2. a 3. Pojem se povezuje

Prikaži več

Optimizacija z roji delcev - Seminarska naloga pri predmetu Izbrana poglavja iz optimizacije

Optimizacija z roji delcev - Seminarska naloga pri predmetu Izbrana poglavja iz optimizacije Univerza v Ljubljani Fakulteta za matematiko in fiziko Seminarska naloga pri predmetu Izbrana poglavja iz optimizacije 2. junij 2011 Koncept PSO Motivacija: vedenje organizmov v naravi Ideja: koordinirano

Prikaži več

DSI 2019

DSI 2019 SINERGIJA PROTOKOLA IPFS IN TEHNOLOGIJE VERIŽENJA BLOKOV Aida Kamišalić Latifić, Muhamed Turkanović, Blaž Podgorelec, Marjan Heričko TEHNOLOGIJA VERIŽENJA BLOKOV in IPFS Porazdeljena & decentralizirana

Prikaži več

Microsoft PowerPoint - Sequi_SecDAy.ppt

Microsoft PowerPoint - Sequi_SecDAy.ppt Sistem za zagotavljanje revizijske sledi zbirk podatkov Marko Hočevar Premisa d.o.o. Iztok Lasič Hic Salta d.o.o. O revizijski sledi Namen revizijske sledi Znane težave pri zajemanju revizijske sledi Zakaj

Prikaži več

Poročilo za 1. del seminarske naloge- igrica Kača Opis igrice Kača (Snake) je klasična igrica, pogosto prednaložena na malce starejših mobilnih telefo

Poročilo za 1. del seminarske naloge- igrica Kača Opis igrice Kača (Snake) je klasična igrica, pogosto prednaložena na malce starejših mobilnih telefo Poročilo za 1. del seminarske naloge- igrica Kača Opis igrice Kača (Snake) je klasična igrica, pogosto prednaložena na malce starejših mobilnih telefonih. Obstaja precej različic, sam pa sem sestavil meni

Prikaži več

Priloga 1: Pravila za oblikovanje in uporabo standardiziranih referenc pri opravljanju plačilnih storitev Stran 4012 / Št. 34 / Uradni lis

Priloga 1: Pravila za oblikovanje in uporabo standardiziranih referenc pri opravljanju plačilnih storitev Stran 4012 / Št. 34 / Uradni lis Priloga 1: Pravila za oblikovanje in uporabo standardiziranih referenc pri opravljanju plačilnih storitev Stran 4012 / Št. 34 / 24. 5. 2019 Uradni list Republike Slovenije PRILOGA 1 PRAVILA ZA OBLIKOVANJE

Prikaži več

Spoznajmo PowerPoint 2013

Spoznajmo PowerPoint 2013 Spoznajmo PowerPoint 2013 13 Nova predstavitev Besedilo v predstavitvi Besedilo, ki se pojavlja v predstavitvah lahko premaknemo kamorkoli v diapozitivu. Kadar izdelamo diapozitiv z že ustvarjenimi okvirji

Prikaži več

Navodila za programsko opremo FeriX Namestitev na trdi disk Avtor navodil: Martin Terbuc Datum: December 2007 Center odprte kode Slovenije Spletna str

Navodila za programsko opremo FeriX Namestitev na trdi disk Avtor navodil: Martin Terbuc Datum: December 2007 Center odprte kode Slovenije Spletna str Navodila za programsko opremo FeriX Namestitev na trdi disk Avtor navodil: Martin Terbuc Datum: December 2007 Center odprte kode Slovenije Spletna stran: http://www.coks.si/ Elektronski naslov: podpora@coks.si

Prikaži več

Microsoft PowerPoint - Objekti_gradnja.ppt

Microsoft PowerPoint - Objekti_gradnja.ppt Naredimo razred Katera so stanja/lastnosti Kaj hočemo o objektih te vrste vedeti Kakšne lastnosti imajo Katere so metode Kakšno je znanje objektov Na katere ukaze se odzovejo Način predstavitve lastnosti

Prikaži več

Macoma katalog copy

Macoma katalog copy POSLOVNE APLIKACIJE PO ŽELJAH NAROČNIKA Poročilni sistem Finance in kontroling Poprodaja Podatkovna skladišča Prodaja Proizvodnja Obstoječi ERP Partnerji Implementacija rešitev prilagojena po željah naročnika

Prikaži več

Document ID / Revision : 0519/1.3 ID Issuer System (sistem izdajatelja identifikacijskih oznak) Navodila za registracijo gospodarskih subjektov

Document ID / Revision : 0519/1.3 ID Issuer System (sistem izdajatelja identifikacijskih oznak) Navodila za registracijo gospodarskih subjektov ID Issuer System (sistem izdajatelja identifikacijskih oznak) Navodila za registracijo gospodarskih subjektov Gospodarski subjekti Definicija: V skladu z 2. členom Izvedbene uredbe Komisije (EU) 2018/574

Prikaži več

Šolski center Celje Srednja šola za kemijo, elektrotehniko in računalništvo ELEKTRONSKA REDOVALNICA RAZISKOVALNA NALOGA AVTORJI Aleš Budna Jure Ulaga

Šolski center Celje Srednja šola za kemijo, elektrotehniko in računalništvo ELEKTRONSKA REDOVALNICA RAZISKOVALNA NALOGA AVTORJI Aleš Budna Jure Ulaga Šolski center Celje Srednja šola za kemijo, elektrotehniko in računalništvo ELEKTRONSKA REDOVALNICA RAZISKOVALNA NALOGA AVTORJI Aleš Budna Jure Ulaga Nik Perčič MENTOR Dušan Fugina, prof. Celje, marec

Prikaži več

ŠTEVCI PROMETA IN NJIHOVA UPORABA ZA NAMENE STATISTIK ČRT GRAHONJA

ŠTEVCI PROMETA IN NJIHOVA UPORABA ZA NAMENE STATISTIK ČRT GRAHONJA ŠTEVCI PROMETA IN NJIHOVA UPORABA ZA NAMENE STATISTIK ČRT GRAHONJA Navdih Poizvedovanje po BD podatkovnih virih, ki imajo časovno dimenzijo in so dostopni. Večji promet pomeni večje število dobrin in močnejšo

Prikaži več

COBISS3/Medknjižnična izposoja

COBISS3/Medknjižnična izposoja 3/Medknjižnična izposoja 2.2 KATALOG Katalog nam omogoča: iskanje gradiva prikaz izbranih bibliografskih zapisov ali pripadajočih podatkov o zalogi iz lokalne baze podatkov v formatu COMARC vpogled v stanje

Prikaži več

Zbornica zdravstvene in babiške nege Slovenije Zveza strokovnih društev medicinskih sester, babic in zdravstvenih tehnikov Slovenije Stanje:

Zbornica zdravstvene in babiške nege Slovenije Zveza strokovnih društev medicinskih sester, babic in zdravstvenih tehnikov Slovenije Stanje: Zbornica zdravstvene in babiške nege Slovenije Zveza strokovnih društev medicinskih sester, babic in zdravstvenih tehnikov Slovenije Stanje: 17.07.2013 Ver. 2.9.1.2 Spletni portal članov uporabniška navodila

Prikaži več

VPELJAVA MDM V DRŽAVEM ZBORU MATJAŽ ZADRAVEC

VPELJAVA MDM V DRŽAVEM ZBORU MATJAŽ ZADRAVEC VPELJAVA MDM V DRŽAVEM ZBORU MATJAŽ ZADRAVEC Državni zbor v številkah 90 poslancev 9 + 1 poslanska skupina 150+ mobilnih naprav (OS Android, ios) 500+ internih uporabnikov, 650+ osebnih računalnikov, 1100+

Prikaži več

TRGOVSKI PORTAL SPLETNA APLIKACIJA NAMENJENA TRGOVCEM POGOSTA VPRAŠANJA IN ODGOVORI Ljubljana, Verzija 1.0

TRGOVSKI PORTAL SPLETNA APLIKACIJA NAMENJENA TRGOVCEM POGOSTA VPRAŠANJA IN ODGOVORI Ljubljana, Verzija 1.0 TRGOVSKI PORTAL SPLETNA APLIKACIJA NAMENJENA TRGOVCEM POGOSTA VPRAŠANJA IN ODGOVORI Ljubljana, 12.11.2018 Verzija 1.0 KAZALO 1 REGISTRACIJA... 3 1.1 Katere podatke potrebujem za registracijo/kreiranje

Prikaži več

Navodila Trgovina iCenter

Navodila Trgovina iCenter Napredovanja v plačne razrede javnih uslužbencev 2019 S pomočjo SAOP programa Kadrovska evidenca lahko ob dokupljeni kodi vodimo napredovanja javnih uslužbencev. Za napredovanja v letu 2019 je potrebno

Prikaži več

EU-TPD 1 PODROBNOSTI KODIRANJA Informacije za trgovino JB za DCTA, (Final 1.2) Obveznost kodiranja izdelka, urejena s predpisom EU-TPD se n

EU-TPD 1 PODROBNOSTI KODIRANJA Informacije za trgovino JB za DCTA, (Final 1.2) Obveznost kodiranja izdelka, urejena s predpisom EU-TPD se n EU-TPD 1 PODROBNOSTI KODIRANJA Informacije za trgovino Obveznost kodiranja izdelka, urejena s predpisom EU-TPD se nanaša na tobačne izdelke na trgu EU in na tobačne izdelke, izdelane v EU, vključno s tistimi

Prikaži več

INDUSTRIJA 4.0: PRILOŽNOSTI DIGITALNE PREOBRAZBE PROCESA RAZVOJA BARV IN PREMAZOV TOMAŽ KERN, BENJAMIN URH, MARJAN SENEGAČNIK, EVA KRHAČ

INDUSTRIJA 4.0:  PRILOŽNOSTI DIGITALNE PREOBRAZBE PROCESA RAZVOJA BARV IN PREMAZOV TOMAŽ KERN, BENJAMIN URH, MARJAN SENEGAČNIK, EVA KRHAČ INDUSTRIJA 4.0: PRILOŽNOSTI DIGITALNE PREOBRAZBE PROCESA RAZVOJA BARV IN PREMAZOV TOMAŽ KERN, BENJAMIN URH, MARJAN SENEGAČNIK, EVA KRHAČ AGENDA IZZIV OZADJE RAZISKAVE POSNETEK STANJA ANALIZA STANJA in

Prikaži več

Microsoft Word - 021_01_13_Pravilnik_o_zakljucnem delu

Microsoft Word - 021_01_13_Pravilnik_o_zakljucnem delu Na podlagi 64. člena Pravil o organizaciji in delovanju Fakultete za humanistične študije, št. 011-01/13 z dne 27. 6. 2013, je Senat Univerze na Primorskem Fakultete za humanistične študije na svoji 4.

Prikaži več

PowerPoint Presentation

PowerPoint Presentation Novosti Državnega centra za storitve zaupanja SI-TRUST Mag. Aleš Pelan, Ministrstvo za javno upravo 11.12.2018 ... 2000 2001 2015 2018 Overitelj na MJU Državni center za storitve zaupanja Novosti v letu

Prikaži več

Microsoft Word - M docx

Microsoft Word - M docx Š i f r a k a n d i d a t a : Državni izpitni center *M15245112* JESENSKI IZPITNI ROK Izpitna pola 2 / 90 minut Dovoljeno gradivo in pripomočki: Kandidat prinese nalivno pero ali kemični svinčnik in računalo.

Prikaži več

II-RIS-Primer Seminarske Naloge Redni-LJ

II-RIS-Primer Seminarske Naloge Redni-LJ UNIVERZA V LJUBLJANI FAKULTETA ZA UPRAVO Študijski program: Visokošolski strokovni program Uprava Prva stopnja (bolonjski) Način študija: redni ČIŠČENJE VOZIL V AVTOPRALNICI Seminarska naloga Predmet:

Prikaži več

MATLAB programiranje MATLAB... programski jezik in programersko okolje Zakaj Matlab? tipičen proceduralni jezik enostaven za uporabo hitro učenje prir

MATLAB programiranje MATLAB... programski jezik in programersko okolje Zakaj Matlab? tipičen proceduralni jezik enostaven za uporabo hitro učenje prir MATLAB programiranje MATLAB... programski jezik in programersko okolje Zakaj Matlab? tipičen proceduralni jezik enostaven za uporabo hitro učenje priročno programsko okolje tolmač interpreter (ne prevajalnik)

Prikaži več

GHOSTBUSTERS navodila za učitelje O PROJEKTU S tem projektom se učenci sami naučijo izdelati igro. Ustvariti morajo več ikon (duhcov ali kaj drugega)

GHOSTBUSTERS navodila za učitelje O PROJEKTU S tem projektom se učenci sami naučijo izdelati igro. Ustvariti morajo več ikon (duhcov ali kaj drugega) GHOSTBUSTERS navodila za učitelje O PROJEKTU S tem projektom se učenci sami naučijo izdelati igro. Ustvariti morajo več ikon (duhcov ali kaj drugega) in za vsako napisati svojo kodo. Dve ikoni imata isto

Prikaži več

CODEKS IP KAMERA

CODEKS IP KAMERA CODEKS IP KAMERA uporabniška navodila Vse pravice pridržane. Noben del uporabniških navodil se ne sme reproducirati v kakršnikoli obliki ali na kakršen koli način - grafični, elektronski ali mehanski,

Prikaži več

Navodila za uporabo programske opreme OTRS verzija Administracijska navodila Avtor navodil: Sebastijan Šilec Datum: December 2007 Center odprte

Navodila za uporabo programske opreme OTRS verzija Administracijska navodila Avtor navodil: Sebastijan Šilec Datum: December 2007 Center odprte Navodila za uporabo programske opreme OTRS verzija 2.2.3 Administracijska navodila Avtor navodil: Sebastijan Šilec Datum: December 2007 Center odprte kode Slovenije Spletna stran: http://www.coks.si/ Elektronski

Prikaži več

Komisija za študijske zadeve UL Medicinske fakultete Vrazov trg 2 SI-1000 Ljubljana E: T: Režim študija Predmet: Uvod

Komisija za študijske zadeve UL Medicinske fakultete Vrazov trg 2 SI-1000 Ljubljana E: T: Režim študija Predmet: Uvod Komisija za študijske zadeve UL Medicinske fakultete Vrazov trg 2 SI-1000 Ljubljana E: ksz@mf.uni-lj.si T: +386 1 543 7700 Režim študija Predmet: Uvod v medicino, modul Informatika Študijski program: EMŠ

Prikaži več

Microsoft Word - CNR-BTU3_Bluetooth_vmesnik

Microsoft Word - CNR-BTU3_Bluetooth_vmesnik CNR-BTU3 Bluetooth vmesnik A. Vsebina pakiranja Bluetooth USB Adapter Bluetooth programska oprema in CD z gonilniki Navodila za uporabo in CD 1. Namestitev Bluetooth programske opreme za Windowse 1. Vstavite

Prikaži več

UNIVERZA V MARIBORU FAKULTETA ZA ELEKTROTEHNIKO, RAČUNALNIŠTVO IN INFORMATIKO Vito Resnik RAZVOJ APLIKACIJE ZA NAROČANJE IN SPREMLJANJE MERITEV IZDELK

UNIVERZA V MARIBORU FAKULTETA ZA ELEKTROTEHNIKO, RAČUNALNIŠTVO IN INFORMATIKO Vito Resnik RAZVOJ APLIKACIJE ZA NAROČANJE IN SPREMLJANJE MERITEV IZDELK UNIVERZA V MARIBORU FAKULTETA ZA ELEKTROTEHNIKO, RAČUNALNIŠTVO IN INFORMATIKO Vito Resnik RAZVOJ APLIKACIJE ZA NAROČANJE IN SPREMLJANJE MERITEV IZDELKOV Diplomsko delo Maribor, november 2016 RAZVOJ APLIKACIJE

Prikaži več

POROČILO

POROČILO UVOD Delovanje knjižnice Fakultete za kemijo in kemijsko tehnologijo v Ljubljani (UL FKKT), ki je sedaj že 17 let funkcionalno združena s Centralno tehniško knjižnico (CTK), lahko ocenimo kot uspešno kar

Prikaži več

Event name or presentation title

Event name or  presentation title Marko Škufca Vodja programa BI, ADD d.o.o. Gorazd Cah Specialist področja Služba za informatiko, DARS d.d. Izziv Rešitev Rezultati... PROCESI + TEHNOLOGIJA + LJUDJE Poslanstvo: s sodobnimi pristopi in

Prikaži več

Navodila za uporabo Mini snemalnik

Navodila za uporabo Mini snemalnik Navodila za uporabo Mini snemalnik www.spyshop.eu Pred vami so navodila za pravilno uporabo mini snemalnika in opis funkcionalnosti. Lastnosti snemalnika: Naziv Mere Teža Kapaciteta spomina Snemanje Format

Prikaži več

Microsoft Word - M docx

Microsoft Word - M docx Š i f r a k a n d i d a t a : Državni izpitni center *M17178111* SPOMLADANSKI IZPITNI ROK Izpitna pola 1 Četrtek, 1. junij 2017 / 90 minut Dovoljeno gradivo in pripomočki: Kandidat prinese nalivno pero

Prikaži več

Cenik ES_spremembe_marec2013_ČISTOPIS_Sprememba_

Cenik ES_spremembe_marec2013_ČISTOPIS_Sprememba_ Cenik elektronskih storitev Na podlagi 332. člena Zakona o trgu finančnih instrumentov in 34. člena Statuta Ljubljanske borze vrednostnih papirjev, d. d., Ljubljana z dne 27.5.1997, z zadnjimi spremembami

Prikaži več

1. IDENTIFIKACIJA PODATKOVNEGA NIZA 1.1 Naslov Strukturno-tektonska karta Slovenije 1: Alternativni naslov Strukturno-tektonska karta Slove

1. IDENTIFIKACIJA PODATKOVNEGA NIZA 1.1 Naslov Strukturno-tektonska karta Slovenije 1: Alternativni naslov Strukturno-tektonska karta Slove 1. IDENTIFIKACIJA PODATKOVNEGA NIZA 1.1 Naslov Strukturno-tektonska karta Slovenije 1:250.000 1.2 Alternativni naslov Strukturno-tektonska karta Slovenije 1:250.000 1.3 Okrajšani naslov - 1.4 Globalni

Prikaži več

Protege, I.Savnik

Protege, I.Savnik Protégé Iztok Savnik Uporabljeni viri: A Practical Guide To Building OWL Ontologies Using Protege 4 and CO ODE Tools, Edition 1.1 http://protege.stanford.edu/ Protégé OWL ontologije za Semantični splet

Prikaži več

Univerza v Ljubljani FAKULTETA ZA RAČUNALNIŠTVO IN INFORMATIKO Tržaška c. 25, 1000 Ljubljana Realizacija n-bitnega polnega seštevalnika z uporabo kvan

Univerza v Ljubljani FAKULTETA ZA RAČUNALNIŠTVO IN INFORMATIKO Tržaška c. 25, 1000 Ljubljana Realizacija n-bitnega polnega seštevalnika z uporabo kvan Univerza v Ljubljani FAKULTETA ZA RAČUNALNIŠTVO IN INFORMATIKO Tržaška c. 25, 1000 Ljubljana Realizacija n-bitnega polnega seštevalnika z uporabo kvantnih celičnih avtomatov SEMINARSKA NALOGA Univerzitetna

Prikaži več

PowerPoint Presentation

PowerPoint Presentation Better Integrate. Open. Innovate. Roland Petek, COO, Better by Marand 30 let izkušenj v ZIT 150 zaposlenih 18M EUR letnega prometa Rešitve v zdravstvu platforme, orodja, aplikacije Stranke v 15 državah

Prikaži več

Poročanje izdanih računov pri gotovinskem poslovanju

Poročanje izdanih računov pri gotovinskem poslovanju Poročanje izdanih računov pri gotovinskem poslovanju Vrsta dokumenta: Uporabniška navodila Pripravil/i: Za: Naviservice +386 1 548 3999 naviservice@adacta.si Adacta d.o.o. Verovškova 55a, 1000 Ljubljana

Prikaži več

PowerApps

PowerApps ko tehnologija postane brezmejna strast Microsoft PowerApps Uporabniška navodila Avtorji Brina Gomboc, Lucija Kos, Damjana Krampač Mentorici dr. Simona Sternad Zabukovšek Sara Cokan, mag. ekon. in posl.

Prikaži več

-

- Organizacija in management informacijskih sistemov RAZVOJ APLIKACIJE ZA UPRAVLJANJE S STRANKAMI V PODJETJU ANET, D.O.O. Mentor: red. prof. dr. Jože Zupančič Kandidat: Nejc Šter Kranj, April 2011 ZAHVALA

Prikaži več

DES

DES Laboratorij za načrtovanje integriranih vezij Univerza v Ljubljani Fakulteta za elektrotehniko Digitalni Elektronski Sistemi Model vezja Računalniški model in realno vezje Model logičnega negatorja Načini

Prikaži več

Turingov stroj in programiranje Barbara Strniša Opis in definicija Definirajmo nekaj oznak: Σ abeceda... končna neprazna množica simbolo

Turingov stroj in programiranje Barbara Strniša Opis in definicija Definirajmo nekaj oznak: Σ abeceda... končna neprazna množica simbolo Turingov stroj in programiranje Barbara Strniša 12. 4. 2010 1 Opis in definicija Definirajmo nekaj oznak: Σ abeceda... končna neprazna množica simbolov (običajno Σ 2) Σ n = {s 1 s 2... s n ; s i Σ, i =

Prikaži več

(Microsoft Word - Nakupovalni vodi\350 po angle\232kih spletnih trgovinah - IzAnglije)

(Microsoft Word - Nakupovalni vodi\350 po angle\232kih spletnih trgovinah - IzAnglije) Nakupovalni vodič po angleških spletnih trgovinah Vedno več ljudi se odloča za nakupe preko spleta. Cene na spletu so pogosto ugodnejše, izbira bolj široka, nakupovanje pa je enostavno in udobno. Dandanes

Prikaži več

Microsoft PowerPoint - MSPO_4_DiagramiVpliva.pptx

Microsoft PowerPoint - MSPO_4_DiagramiVpliva.pptx 8. Diagrami vpliva Odločitveno drevo alternative status quo razširitev gradnja povezovanje izidi 28 30 24 42 16 44 30 34, Univerza v Novi Gorici, Poslovno-tehniška fakulteta 1 Slabosti odločitvenih dreves

Prikaži več

Nove različice programske opreme GE Podjetje GE Digital, vodilni svetovni proizvajalec programske opreme za področje avtomatike, je izdalo kar nekaj n

Nove različice programske opreme GE Podjetje GE Digital, vodilni svetovni proizvajalec programske opreme za področje avtomatike, je izdalo kar nekaj n Nove različice programske opreme GE Podjetje GE Digital, vodilni svetovni proizvajalec programske opreme za področje avtomatike, je izdalo kar nekaj novosti na področju SCADA sistemov (ifix Productivity

Prikaži več

Zadeva: Ponudba

Zadeva: Ponudba Navodila za urejanje Spletne strani CTEK.si 1. Dodajanje novega polnilnika Za dodajanje novega polnilnika nikoli ne prepisujte že objavljenih vsebin, ampak sledite tem navodilom. Ta so zagotovilo, da bodo

Prikaži več

Microsoft PowerPoint - petek A-sambolicbeganovic [Read-Only] [Compatibility Mode]

Microsoft PowerPoint - petek A-sambolicbeganovic [Read-Only] [Compatibility Mode] KAKO PRI POUČEVANJU MATEMATIKE UPORABLJAM INTERAKTIVNO TABLO? Amela Sambolić Beganović SGGEŠ Ljubljana ŠOLSKI CENTER LJUBLJANA, Srednja lesarska šola amela.beganovic@guest.arnes.si Sirikt 2009, 17.4.2009

Prikaži več

Microsoft PowerPoint - OAPS1- P12.ppt

Microsoft PowerPoint - OAPS1- P12.ppt Univerza v Ljubljani Fakulteta za računalništvo in informatiko Igor Rožanc Osnove algoritmov in podatkovnih struktur I (OAPS I) 2. letnik, VSP Računalništvo in informatika, vse smeri PROSOJNICE ZA 12.

Prikaži več

Gimnazija Bežigrad Peričeva Ljubljana OPERACIJSKI SISTEM Predmet: informatika

Gimnazija Bežigrad Peričeva Ljubljana OPERACIJSKI SISTEM Predmet: informatika Gimnazija Bežigrad Peričeva 4 1000 Ljubljana OPERACIJSKI SISTEM Predmet: informatika KAZALO 1. Uvod...3 2. Predstavitev programa Windows 98...5 3. Raziskovanje računalnika...5 4. Raziskovanje Interneta...6

Prikaži več

Microsoft Word - NAVODILA ZA UPORABO.docx

Microsoft Word - NAVODILA ZA UPORABO.docx NAVODILA ZA UPORABO VODILO CCM-18A/N-E (K02-MODBUS) Hvala ker ste se odločili za nakup našega izdelka. Pred uporabo enote skrbno preberite ta Navodila za uporabo in jih shranite za prihodnjo rabo. Vsebina

Prikaži več

Microsoft PowerPoint - p_TK_inzeniring_1_dan_v5_shortTS.ppt [Compatibility Mode]

Microsoft PowerPoint - p_TK_inzeniring_1_dan_v5_shortTS.ppt [Compatibility Mode] Telekomunikacijski inženiring dr. Iztok Humar Vsebina Značilnosti TK prometa, preprosti modeli, uporaba Uvod Značilnosti telekomunikacijskega prometa Modeliranje vodovno komutiranih zvez Erlang B Erlang

Prikaži več

Datum in kraj

Datum in kraj Ljubljana, 5. 4. 2017 Katalog znanj in vzorci nalog za izbirni izpit za vpis na magistrski študij Pedagoško računalništvo in informatika 2017/2018 0 KATALOG ZNANJ ZA IZBIRNI IZPIT ZA VPIS NA MAGISTRSKI

Prikaži več

Microsoft Word - A-3-Dezelak-SLO.doc

Microsoft Word - A-3-Dezelak-SLO.doc 20. posvetovanje "KOMUNALNA ENERGETIKA / POWER ENGINEERING", Maribor, 2011 1 ANALIZA OBRATOVANJA HIDROELEKTRARNE S ŠKOLJČNIM DIAGRAMOM Klemen DEŽELAK POVZETEK V prispevku je predstavljena možnost izvedbe

Prikaži več

IZGRADNJA PREDSTAVITVENE SPLETNE STRANI GLUCOWATCH Avtor: Marko Zajko Projekt delno financira Evropska unija, in sicer iz Evropskega socialnega sklada

IZGRADNJA PREDSTAVITVENE SPLETNE STRANI GLUCOWATCH Avtor: Marko Zajko Projekt delno financira Evropska unija, in sicer iz Evropskega socialnega sklada IZGRADNJA PREDSTAVITVENE SPLETNE STRANI GLUCOWATCH Avtor: Marko Zajko UPORABLJENE TEHNOLOGIJE Za izdelavo predstavitvene spletne strani smo izbrali tehnologije, ki zagotavljajo: Hitro delovanje spletne

Prikaži več

UPRAVLJANJE RAZPRŠENIH PODATKOV Shranjevanje, zaščita in vzdrževanje informacij, ki jih najbolj potrebujete

UPRAVLJANJE RAZPRŠENIH PODATKOV Shranjevanje, zaščita in vzdrževanje informacij, ki jih najbolj potrebujete UPRAVLJANJE RAZPRŠENIH PODATKOV Shranjevanje, zaščita in vzdrževanje informacij, ki jih najbolj potrebujete ELEKTRONSKI PODATKI, KI JIH ORGANIZACIJA USTVARJA IN POTREBUJE ZA DOSTOP, SE KAŽEJO V RAZLIČNIH

Prikaži več

Urejevalna razdalja Avtorji: Nino Cajnkar, Gregor Kikelj Mentorica: Anja Petković 1 Motivacija Tajnica v posadki MARS - a je pridna delavka, ampak se

Urejevalna razdalja Avtorji: Nino Cajnkar, Gregor Kikelj Mentorica: Anja Petković 1 Motivacija Tajnica v posadki MARS - a je pridna delavka, ampak se Urejevalna razdalja Avtorji: Nino Cajnkar, Gregor Kikelj Mentorica: Anja Petković 1 Motivacija Tajnica v posadki MARS - a je pridna delavka, ampak se velikokrat zmoti. Na srečo piše v programu Microsoft

Prikaži več

Avtomatizirano modeliranje pri celostnem upravljanju z vodnimi viri

Avtomatizirano modeliranje pri celostnem upravljanju z vodnimi viri Univerza v Ljubljani Fakulteta za gradbeništvo in geodezijo 36. Goljevščkov spominski dan Modeliranje kroženja vode in spiranja hranil v porečju reke Pesnice Mateja Škerjanec 1 Tjaša Kanduč 2 David Kocman

Prikaži več

Kazalo 1 DVOMESTNE RELACIJE Operacije z dvomestnimi relacijami Predstavitev relacij

Kazalo 1 DVOMESTNE RELACIJE Operacije z dvomestnimi relacijami Predstavitev relacij Kazalo 1 DVOMESTNE RELACIJE 1 1.1 Operacije z dvomestnimi relacijami...................... 2 1.2 Predstavitev relacij............................... 3 1.3 Lastnosti relacij na dani množici (R X X)................

Prikaži več

Osnove statistike v fizični geografiji 2

Osnove statistike v fizični geografiji 2 Osnove statistike v geografiji - Metodologija geografskega raziskovanja - dr. Gregor Kovačič, doc. Bivariantna analiza Lastnosti so med sabo odvisne (vzročnoposledično povezane), kadar ena lastnost (spremenljivka

Prikaži več

Excel 2016

Excel 2016 PRIDOBIVANJE TEMELJN IH IN POKLICNIH KOMPETENC OD 2019 DO 2022 HIPERPOVEZAVA Gradivo za interno uporabo AVTOR: Belinda Lovrenčič Gradivo ni lektorirano V Maj 2019 Operacijo sofinancira Evropska unija,

Prikaži več

Vaja 2 Virtualizacija fizičnih strežnikov in virtualni PC A. Strežnik Vmware ESX Namestitev strežnika VMware ESX 3.5 na fizični strežnik 2. Nas

Vaja 2 Virtualizacija fizičnih strežnikov in virtualni PC A. Strežnik Vmware ESX Namestitev strežnika VMware ESX 3.5 na fizični strežnik 2. Nas Vaja 2 Virtualizacija fizičnih strežnikov in virtualni PC A. Strežnik Vmware ESX 3.5 1. Namestitev strežnika VMware ESX 3.5 na fizični strežnik 2. Nastavitve strežnika ESX 3. Namestitev in nastavitve VM

Prikaži več

Sistemi Daljinskega Vodenja Vaja 3 Matej Kristan Laboratorij za Strojni Vid Fakulteta za elektrotehniko, Univerza v Ljubl

Sistemi Daljinskega Vodenja Vaja 3 Matej Kristan Laboratorij za Strojni Vid Fakulteta za elektrotehniko, Univerza v Ljubl Sistemi Daljinskega Vodenja Vaja 3 Matej Kristan Laboratorij za Strojni Vid Fakulteta za elektrotehniko, Univerza v Ljubljani matej.kristan@fe.uni-lj.si Česa smo se naučili

Prikaži več

(Microsoft Word - MSDN AA Navodila za \232tudente FS.doc)

(Microsoft Word - MSDN AA Navodila za \232tudente FS.doc) 1. Pogoji uporabe programske opreme Pred uporabo programske opreme iz programa MSDNAA morate prebrati in se strinjati s pogoji in določili Licenčne pogodbe za končnega uporabnika programske opreme MSDN

Prikaži več

PowerPointova predstavitev

PowerPointova predstavitev IZKUŠNJE PRI PRILAGODITVI E-STORITEV AJPES ZAHTEVAM EIDAS ZA ČEZMEJNO PRIZNAVANJE MARJAN BABIČ, AJPES Vsebina Razlogi za vključitev v projekt CEF Telecom Izvajalno okolje AJPES in način integracije s SI-PASS

Prikaži več

Na podlagi 24. in 25. člena Zakona o varstvu osebnih podatkov (Ur. list RS, št. 94/07), sprejema ravnatelj javnega zavoda Dijaški dom Nova Gorica nasl

Na podlagi 24. in 25. člena Zakona o varstvu osebnih podatkov (Ur. list RS, št. 94/07), sprejema ravnatelj javnega zavoda Dijaški dom Nova Gorica nasl Na podlagi 24. in 25. člena Zakona o varstvu osebnih podatkov (Ur. list RS, št. 94/07), sprejema ravnatelj javnega zavoda Dijaški dom Nova Gorica naslednji P RAVILNIK o izvajanju videonadzora I. SPLOŠNE

Prikaži več

Obračun storitev v vrtcu in šoli

Obračun storitev v vrtcu in šoli Obračun storitev v vrtcu in šoli mag. Jana Trbižan Pripravili: mag. Jana Trbižan, Nuša Peternelj, Mitja Živko Podpora uporabnikom Dnevni red 1. Pogoste napake pri obračunu v vrtcu in šoli 2. Kaj pomeni

Prikaži več

Navodila za uporabo Mini prenosna HD kamera s snemalnikom

Navodila za uporabo Mini prenosna HD kamera s snemalnikom Navodila za uporabo Mini prenosna HD kamera s snemalnikom www.spyshop.eu Izdelku so priložena navodila v angleščini, ki poleg teksta prikazujejo tudi slikovni prikaz sestave in delovanja izdelka. Lastnosti

Prikaži več

APS1

APS1 Algoritmi in podatkovne strukture 1 Visokošolski strokovni študij Računalništvo in informatika Abstraktni podatkovni tipi Jurij Mihelič, UniLj, FRI Podatkovni tipi Razvil Pascal, Oberon itd. Software is

Prikaži več

PowerPoint Presentation

PowerPoint Presentation Zapisovanje učnih izidov Bled, 21.1.2016 Darko Mali ECVET ekspert, CPI Pojmi: Kvalifikacija Kompetenca Učni cilji Učni izidi Enote učnih izidov Kreditne točke Programi usposabljanja NE! 2 Učni cilji kompetence

Prikaži več

Microsoft Word - Analiza rezultatov NPZ matematika 2018.docx

Microsoft Word - Analiza rezultatov NPZ matematika 2018.docx Analiza dosežkov pri predmetu matematika za NPZ 28 6. razred NPZ matematika 28 Dosežek šole Povprečno število točk v % Državno povprečje Povprečno število točk v % Odstopanje v % 49,55 52,52 2,97 Povprečni

Prikaži več

PowerPointova predstavitev

PowerPointova predstavitev Dostopnost elektronskih virov za slepe, slabovidne in druge osebe z motnjami branja Kristina Janc ZSSML - 27. Seja TIFLO sekcije 22.3.2012 Možnost izkoriščanja elektronskih virov za slepe, slabovidne in

Prikaži več

Protokoli v računalniškem komuniciranju TCP, IP, nivojski model, paket informacij.

Protokoli v računalniškem komuniciranju TCP, IP, nivojski model, paket informacij. Protokoli v računalniškem komuniciranju TCP, IP, nivojski model, paket informacij. Protokoli - uvod Protokol je pravilo ali zbirka pravil, ki določajo načine transporta sporočil po računalniškem omrežju

Prikaži več

Univerza v Ljubljani Fakulteta za računalništvo in informatiko Boštjan Štor Uporaba načrtovalskih vzorcev in tehnologije Java EE na primeru razvoja ap

Univerza v Ljubljani Fakulteta za računalništvo in informatiko Boštjan Štor Uporaba načrtovalskih vzorcev in tehnologije Java EE na primeru razvoja ap Univerza v Ljubljani Fakulteta za računalništvo in informatiko Boštjan Štor Uporaba načrtovalskih vzorcev in tehnologije Java EE na primeru razvoja aplikacije skladišča DIPLOMSKO DELO UNIVERZITETNI ŠTUDIJSKI

Prikaži več

PowerPoint Presentation

PowerPoint Presentation Poslovni analitik v agilnem svetu Prenova spletne strani Uvedba podpore za mobilne naprave Ineor d.o.o. O meni poslovni analitik izkušnje s tehnologijo (programiranje, razhroščevanje, inštalacije, administracija,...)

Prikaži več

DIGITALNE STRUKTURE Zapiski predavanj Branko Šter, Ljubo Pipan 2 Razdeljevalniki Razdeljevalnik (demultipleksor) opravlja funkcijo, ki je obratna funk

DIGITALNE STRUKTURE Zapiski predavanj Branko Šter, Ljubo Pipan 2 Razdeljevalniki Razdeljevalnik (demultipleksor) opravlja funkcijo, ki je obratna funk DIGITALNE STRUKTURE Zapiski predavanj Branko Šter, Ljubo Pipan 2 Razdeljevalniki Razdeljevalnik (demultipleksor) opravlja funkcijo, ki je obratna funkciji izbiralnika. Tisti od 2 n izhodov y 0,.., y 2

Prikaži več

Microsoft Word - UP_Lekcija04_2014.docx

Microsoft Word - UP_Lekcija04_2014.docx 4. Zanka while Zanke pri programiranju uporabljamo, kadar moramo stavek ali skupino stavkov izvršiti večkrat zaporedoma. Namesto, da iste (ali podobne) stavke pišemo n-krat, jih napišemo samo enkrat in

Prikaži več

SQL doc. dr. Evelin Krmac RELACIJSKE PODATKOVNE BAZE Relacijski model organizacije podatkov podatki predstavljeni preko relacij 2D tabel operacije se

SQL doc. dr. Evelin Krmac RELACIJSKE PODATKOVNE BAZE Relacijski model organizacije podatkov podatki predstavljeni preko relacij 2D tabel operacije se SQL RELACIJSKE PODATKOVNE BAZE Relacijski model organizacije podatkov podatki predstavljeni preko relacij 2D tabel operacije se izvajajo preko enega jezika (npr. SQL) omogoča izvajanje osnovnih relacijskih

Prikaži več

GROBI KURIKUL ZA 3. letnik program administrator TEMELJI GOSPODARSTVA KOMUNICIRANJE MODUL: KOMUNICIRANJE UČITELJ: SKLOP Predvideni časovni okvir CILJI

GROBI KURIKUL ZA 3. letnik program administrator TEMELJI GOSPODARSTVA KOMUNICIRANJE MODUL: KOMUNICIRANJE UČITELJ: SKLOP Predvideni časovni okvir CILJI GROBI KURIKUL ZA 3. letnik program administrator TEMELJI GOSPODARSTVA KOMUNICIRANJE MODUL: KOMUNICIRANJE UČITELJ: SKLOP Predvideni časovni okvir CILJI Samostojno izdelovanje predstavitev s programom za

Prikaži več

Slajd 1

Slajd 1 REPUBLIKA SLOVENIJA MINISTRSTVO ZA JAVNO UPRAVO 1 EU ENOTNI DIGITALNI PORTAL: PRIHAJA NOVA EU UREDBA Alenka Žužek Nemec, Tina Kuliš DNEVI SLOVENSKE INFORMATIKE 18. april 2018 Ko podjetja ali državljani

Prikaži več

Univerza v Ljubljani Fakulteta za računalništvo in informatiko Blaž Roženbergar Upravljanje trgovskega blaga z značkami RFID DIPLOMSKO DELO VISOKOŠOLS

Univerza v Ljubljani Fakulteta za računalništvo in informatiko Blaž Roženbergar Upravljanje trgovskega blaga z značkami RFID DIPLOMSKO DELO VISOKOŠOLS Univerza v Ljubljani Fakulteta za računalništvo in informatiko Blaž Roženbergar Upravljanje trgovskega blaga z značkami RFID DIPLOMSKO DELO VISOKOŠOLSKI STROKOVNI ŠTUDIJSKI PROGRAM PRVE STOPNJE RAČUNALNIŠTVO

Prikaži več