- Ohj2, luennot 25-26, 13.5.-14.5.2005
- Materiaali
- Kertaus: Kenttä- ja tarkistaja-luokat
- Tarkistaja-rajapintaa kehitetty niin, että kenttä itse tekee "perustarkistuksen", mutta liitosten yli tehtäviä tarkistuksia varten annetaan parametrina kerho ulkopuolelta
- Jasen-luokka on tehty riippumattomaksi kerhosta lisäämällä metodi annaTarkistaja, jota kerho kutsuu
- Kerhoon sisätty oma tietorakennekohtainen turvallinen asetusmetodi, joka voi tarkastaa myös liitokset
- Etsiminen ja lajittelu
- Materiaali: CPP-moniste, luku 22
- Idea: tehdään oma tietorakenneluokka hakutuloksia varten, sisältää indeksejä, id-numeroita tai (java-esimerkkiohjelman tapauksessa) suoraan löydetyt oliot
- Haku toteutetaan Kerho-ohjelman tapauksessa peräkkäishakuna - binäärihaku mielivaltaisen kentän mukaan vaatisi ylimääräisiä indeksirakenteita
- uusi metodi: etsi_jasenen_tiedot
- Tulokset palautetaan järjestyksessä (kentästä riippuen esim. aakkosjärjestys)
- Haun monipuolistaminen: haku monen kentän mukaan ja yhdistely loogisilla operaattoreilla, jokerimerkit, suurempi-kuin-operaattori..
- Sulkujen lisääminen hakulausekkeisiin vaatisi jo jäsentimen lisäystä hakujärjestelmään - sivuutetaan
- Laajennusten toteuttaminen omaan harjoitustyöhön soveltaen
- Jos käytetään jokerimerkkejä, voidaan käyttää apuna Ali.jar-kirjaston WildChars-luokkaa
- C++ -versiossa toteutettu oma cHaku-luokka, joka kuvaa yksittäisen haun parametrit (kannattaa tehdä harkkatyöhön, jos tarkoitus tukea monimutkaisia hakuja)
- Hakuehdon vertailu Jäsenen tietojen arvoihin tehdään omalla Vertailija-luokalla
- Vertailija käyttää kentän n:nnen kentän vertailuavainta, joka on oleellisesti sama kuin kentän arvo aakkosjärjestyksen säilyttävässä muodossa
- Varsinainen etsiminen toteutettu Kerho- ja Jäsenet-luokissa. Tulokset järjestetään hakuavaimen mukaan
- Kansallisuusspesifiset lajittelut mahdollistaa java.text.Collator-luokka, jolle ilmaistaan kieli/alue java.util.Locale-luokalla
- Jos hakutuloksia on paljon, ne kannattaa antaa selattavaksi ennen niiden tarkempaa tarkastelua
- Esim. näytetään vain otsikot numeroituna, tai sitten esim. 10 tietuetta kerrallaan ja selaus edelliseen/seuraavaan osalistaan
- jos näytetään suoraan kaikki tiedot (kuten esimerkkiohjelmassa), olisi ainakin syytä toteuttaa järjestetty näyttäminen ja +/- -selaus edelliseen ja seuraavaan
- hakutulosten selauksen yhteyteen on kätevää lisätä mahdollisuus tietueen muuttamiseen, poistamiseen (ym. harkkatyön aiheesta riippuvaa toimintaa)
- Useamman relaation yli menevä haku vaatii (taas) lisätyötä...
- Huom. varautuminen monisäikeiseen käsittelyyn
- Jos lajitteluavain on kentän attribuuttina ja se pitää erikseen luoda ennen lajittelua, monisäikeinen ohjelma saattaisi lajitella väärän kentän mukaan
- Turvallisempi ratkaisu: joka kerta, kun lajitteluavainta pyydetään, ilmoitetaan myös kentän numero, jonka mukaan avain tarvittaessa muodostetaan
- javassa synchronized-blokit muodostavat "kriittisiä alueita": vain yksi säie voi käsitellä kerrallaan
- Rinnakkaistamisasiat ovat käytännön sovelluksissa äärimmäisen tärkeitä, mutta menevät tämän kurssin ulkopuolelle
- Esimerkki: kerho/etsilaj_73
- [ http://people.cc.jyu.fi/~minurmin/ohj2/materiaali/kerho/etsilaj_73/ ]
- Nykyhenkilö: viimeksi löydetty / selauksen kohdalla oleva henkilö pidetään muistissa käyttöliittymässä
- Kerho-ohjelman "yleistäminen"
- Tulos: ei enää yhtä "kerho-sovellusta", vaan sovelluskehys (application framework) yksinkertaisia tietokantaohjelmia varten
- Jäsen, Harrastus ym voidaan koota yleiseksi tietueolioksi indeksoiduilla kentillä
- Jäsenet, Harrastukset ym. voidaan yleistää yleiseksi tauluolioksi...
- Kenttien validointiin poikkeuskäsittely - vähentää if-lauseita nopeuden kustannuksella (erityisesti, kun asetetaan liitoksia)
- Esim.
- vapaatyy 8 -framework (cpp)
- [ http://people.cc.jyu.fi/~minurmin/ohj2/materiaali/cppkerho/vapaatyy.8/ ]
- "KerhoFinal"
- Erilliset säiliöluokat poistettu kokonaan, tietueoliot noudattavat nyt samaa rajapintaa
- Yleistämisen varaa vielä edelleen: esim. hakujärjestelmä, joka tukee samalla koodilla hakua eri tietueolioista sekä kerhoon sisällytettävä "skeema", joka kuvaa liitokset yhdessä rakenteessa
- Graafisista käyttöliittymistä
- Materiaalia
- Vesterholm & Kyppö: Java-ohjelmointi, luvut 13-15
- Graafinen käyttöliittymä?
- Kurssin kannalta GUI == _tapahtumapohjainen_ käyttöliittymä
- [ http://en.wikipedia.org/wiki/Graphical_user_interface ]
- Tapahtumat ovat keino mallintaa käyttöliittymää ja seurata käyttäjän toimintaa sovelluksessa
- GUI:ta kutsutaan myös suorakäyttöliittymäksi: tarjotaan käyttäjälle samasta ruudusta pääsy sovelluksen keskeisiin toimintoihin
- Vastakohtana tälle menuohjatut ja komentorivikäyttöliittymät (tietyiltä osin myös web)
- Tapahtumapohjaisuuden kannalta esim. pankkiautomaatti tai kelloradio sisältävät "graafisen" käyttöliittymän
- Perinteinen määritelmä: WIMP (windows, icons, mouse, pointers)
- Lukuisia käyttöliittymäkirjastoja saatavilla eli kieliin ja järjestelmiin
- AWT - javan alkuperäinen käyttöliittymäkirjasto
- Komponentit ovat käyttöjärjestelmän omia, Java "kaappaa" niiden tapahtumat ja hallinnan
- Oliopohjainen tapahtumakäsittelymalli AWT:n peruja
- Abstrakti luokkakokoelma, jolla oli tarkoitus kuvata eri käyttöjärjestelmien käyttöliittymäkomponentit
- Käytännössä eri järjestelmät eroavat toisistaan niin paljon, etteivät AWT-käyttöliittymät toimi aina kunnolla järjestelmien välillä
- Seuraus: Swing
- JFW (Swing) - javan standardi käyttöliittymäkirjasto
- [ http://java.sun.com/products/jfc/index.jsp ]
- Perustuu Swing-käyttöliittymäkirjastoon (myös jonkin verran AWT-luokkia käytössä)
- MVC (Model-View-Controller ) -ajattelutapa
- Esim. listakontrollin data on omassa ListModel-rajapinnan toteuttavassa rakenteessaan, joka on erillään käyttöliittymästä
- Käyttöliittymäkomponentit ovat kuvia (vrt. käyttöjärjestelmän kontrolleja), joiden hallinnasta vastaa Javan virtuaalikone
- Mahdollistaa "lennossa" vaihdettavan komponenttien ulkoasun ja "tuntuman" (look & feel)
- Huonona puolena on, että komponentit poikkeavat hieman käyttöjärjestelmän omista kontrolleista eivätkä aina ole yhtä sulavia käyttää (tottumuskysymys, Java 1.4:stä alkaen Swing-käyttöliittymät ovat jo käytettävyydessä hyvin lähellä natiivikontrolleja)
- SWT (java, eclipse) - IBM:n vastaisku :-)
- [ http://www.eclipse.org/swt/ ]
- VCL ( delphi, c++ builder)
- CLX (kylix, "cross-platform VCL")
- MFC (C++, windows)
- [ http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/mfchm.asp ]
- wxWidgets (C++, python, "cross-platform MFC")
- [ http://www.wxwindows.org/ ]
- GTK+ (useita kieliä ja käyttöjärjestelmiä)
- [ http://www.gtk.org/ ]
- Tapahtumat
- Periaatteessa funktio- tai metodiosoittimia
- abstrahoivat käyttöjärjestelmän oman viestinvälitysmekanismin
- voidaan säätää kehitysvälineellä tai (usein joustavampaa) suoraan ohjelmakoodissa
- tapahtumakäsittelijä voi sijaita missä osassa koodia tahansa, kunhan se toteuttaa tapahtuman vaatiman rajapinnan
- käsittelijöiden sijoittelussa kannattaa noudattaa tervettä järkeä...
- usein käsittelijän sijoittaminen kohdelomakkeelle on hyvä ratkaisu
- jos halutaan automatisoida suurta määrää tapahtumia, jotka esim. sijaitsevat eri lomakkeilla, voi harkita esim. omaa luokkaa tapahtumakäsittelyyn, jonne eri lomakkeiden tapahtumat ohjautuvat
- tapahtumia voi määritellä itsekin
- Huom. ajettaessa tapahtumapohjaista ohjelmaa näyttää siltä, että tapahtumia kutsutaan 'itsestään'
- perinteisessä ohjelmoinnissa looginen kontrolli on pääohjelmalla, joka kutsuu aliohjelmia, graafisissa kirjastoissa kontrolli on sovelluskehyksellä, joka kutsuu käyttäjän tapahtumakäsittelijöitä
- todellisuudessa tapahtumien pohjalla on edelleen periaatteessa switch/case/if-silmukka, joka käy jatkuvasti läpi mahdollisia tapahtumia
- siis: windows-ohjelma(kin) on syöte/käsittely/tuloste-muotoa oleva, pääohjelmasta ja aliohjemista muodostuva ohjelma
- pääohjelma ja kaikille ohjelmille yhteiset alustukset piilotettu käyttäjältä (sovelluskehys, Application Framework)
- sovelluskehittäjän ei yleensä (onneksi!) tarvitse välittää tästä ns. Windowsin viestisilmukasta
- tapahtumakutsut ovat tavallisia funktiokutsuja, jotka esim. kasvattavat kutsupinoa (ks. debug)
- VAROITUS: toisiaan kutsuvien tapahtumakäsittelijöiden avulla on yllättävän helppoa tehdä ikuinen silmukka...
- jos käsittelijöitä on PAKKO kutsua 'päällekkäin', kannattaa käyttää esim. laskuria tai muuta tilamuuttujaa, joka varmistaa, ettei ikuista silmukkaa pääse syntymään
- Javan oiopohjainen tapahtumakäsittelymalli
- Tapahtumat ovat olioita, jotka on peritty Event-luokasta
- Tapahtumakäsittelijät ovat olioita, jotka toteuttavat EventListener -tyyppisen rajapinnan
- Usein (mutta ei mitenkään välttämättä) toteutetaan kirjoittamalla lomakeluokan sisään nimetön sisäluokka, jossa tapahtumankäsittelijä on
- Raskasta, monimutkaista ja monipuolista verrattuna funktio-osoitinpohjaiseen malliin
- Moni eri tapahtumankäsittelijä voi rekisteröityä "kuuntelemaan" tiettyä komponenttia (vrt Delphin Message-tyyppiset metodit)
- Sama olio voi kuunnella montaa eri tapahtumaa riippuen siitä, mitä rajapintoja se toteuttaa (jopa niin, että sama olio on sekä tapahtuman lähettäjä ja kuuntelija)
- JavaBeans-komponenttimalli
- Käytännössä kaikki java-sovelluksissa näkyvät (ja myös monet näkymättömät) komponentit ovat JavaBeaneja
- Vastaa suurinpiirtein Borlandin Delphi/BCB-komponentteja ja Microsoftin ActiveX-komponentteja
- Komponentteja, joilla on standardit get/set-metodit ominaisuuksien muuttamiseen graafisella editorilla (nimeämiskäytäntö)
- lisäksi javabeaneilta vaaditaan tukea serialisoinnille
- JavaBeaneja voi kehittää 'visuaalisesti'
- Esimerkkejä toteutustavoista
- Perinteinen desktop-sovellus
- Moderni desktop-sovellus (rich client)
- .net-markkinointia (myös java web start voitaneen sisällyttää tähän)... tarkoittaa käytännössä sovellusta, jonka komponentteja voidaan automaattisesti ladata verkosta ja jonka käyttöliittymä on web-tyylinen, mutta suoritus tapahtuu edelleen käyttäjän koneella
- ks. Microsoft: return of the rich clients
- [ http://msdn.microsoft.com/netframework/programming/winforms/richclient.aspx ]
- (käyttöliittymämielessä) kevyt WWW-sovellus (HTML+javascript)
- Raskas WWW-sovellus (HTML+Javascript + Sovelmia tai ActiveX-kontrolleja)
- Hyvänä puolena monipuolisten komponenttien sisällyttäminen osaksi web-sivua, haittapuolena mahdolliset epästandardit selainlaajennukset, tietoturvaongelmat...
- Lisäksi erityisesti sovelmien osalta kommunikointia ympäröivän selaimen kanssa ja esim. verkkoyhteyksien tai tiedostojen käyttöä on rajoitettu - voidaan säätää javan tietoturvamallilla
- Huom. johtuen javan eri versioista ja eri selaimista kaikkialla toimivan sovelman (> java 1.1) sijoittaminen web-sivulle voi olla yllättävän hankalaa, ellei käyttäjällä ole uusinta java plug-inia (ks. sunin versions-sivu)
- [ http://java.sun.com/products/plugin/versions.html ]
- Esim. IE vaatii hieman erilaisen kutsumekanismin kuin muut selaimet (voidaan hoitaa esim. javascriptillä, ks xcm2kg)
- Esim.