Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

1 Ohjelmointiprojekti I (2 ov) kevät 2005 Lehtori Jussi Salmi Luentoja 10 tuntia, Ryhmätyö.

Samankaltaiset esitykset


Esitys aiheesta: "1 Ohjelmointiprojekti I (2 ov) kevät 2005 Lehtori Jussi Salmi Luentoja 10 tuntia, Ryhmätyö."— Esityksen transkriptio:

1 1 Ohjelmointiprojekti I (2 ov) kevät 2005 Lehtori Jussi Salmi Luentoja 10 tuntia, Ryhmätyö

2 2 Kurssin sisältö Appletit –toimintaympäristö, filosofia –erot Java-ohjelmaan (application) –rajapinnan metodit –grafiikka –www:n käyttö –rajoitukset

3 3 Kurssin sisältö Tiedostojenkäsittely –erilaiset tiedostot –olioiden sarjallistaminen –tiedostojen käsittelyyn tarvittavat luokat –erilaisia apuluokkia tekstin käsittelyyn Poikkeustenkäsittely –Poikkeusten käyttötarkoitus –Poikkeusten toiminnan rakenne –Omien poikkeusten määrittely

4 4 Kurssin sisältö Javadoc-dokumentointi –Javan dokumentoinnin rakenne –Javadocin tagien muoto –Javan dokumentoinnin käytännöt Tapahtumankäsittely –Javan komponenttien rakenne –Komponenttien kommunikointi –Käyttöesimerkki

5 5 Appletit Appletit eivät ole itsenäisiä ohjelmia WWW-sivulla kerrotaan, että halutaan ladata appletti Selain käynnistää virtuaalikoneen, jonka sisällä appletti pyörii Appletti ei näe selaimen ulkopuolelle, se voi käyttää vain selaimen palveluja Selain tarkistaa appletin oikeellisuutta Appletti voi sisältää monta luokkaa

6 6 Kuva selaimen ja appletin suhteesta Selain VirtuaalikoneSelaimen palvelut -Pyörittää applettia -Pyytää selaimelta palveluja -Saa selaimelta palvelujen tulokset -Ei voi viitata virtu- aalikoneen ”hiekka- laatikon” ulkopuolelle -Käynnistää virtuaali- koneen tarvittaessa -Kuuntelee virtuaali- koneen pyyntöjä -Toteuttaa ne, jos ne eivät riko turvalli- suusmääräyksiä ja ne on selaimessa määritelty Pyynnöt Vastaukset

7 7 Appletin käynnistäminen www-sivulta <applet code=”sovelma.class” CODEBASE=”http://www.appletti.fi/a/” WIDTH=250 Height=70>

8 8 Erot Java-sovelluksiin (application) Appletit eivät ole itsenäisiä ohjelmia, vaan ne vaativat selaimen toimiakseen Appleteista puuttuu Main-metodi Appletit on tarkoitettu ladattavaksi verkon yli, niissä pyritään keveyteen Appletit perivät Applet-luokan ”public class LuokanNimi extends Applet” Appleteissa ei ole konstruktoria Appletit toimivat aina graafisesti

9 9 Turvallisuusrajoitukset Tiedostoja ei voi lukea isäntäkoneelta Verkkoyhteyden voi ottaa vain samalle palvelimelle, josta appletti ladattiin Ei voi käynnistää ohjelmia isäntäkoneelta Ei voi tutkia isäntäkoneen ominaisuuksia Ei voi käynnistää natiivimetodeja Voi käyttää vain selaimen virtuaalikoneen palveluja, ei muiden osapuolten java- pakkauksia

10 10 Applet-luokasta periytyvät metodit init() –Appletin alustus, muuttujien alustus start() –Selain kutsuu tätä metodia kun suoritus alkaa stop() –Selain kutsuu tätä metodia, kun suoritus keskeytyy destroy() –Varattujen resurssien vapauttaminen juuri ennen appletin suorituksen lopettamista

11 11 getParameter(String param) –Hakee HTML-sivun parametrin param arvon getDocumentBase() –Palauttaa HTML-sivun hakemiston URL:n getCodeBase() –Palauttaa URL:n hakemistoon, josta appletin tavukoodi on ladattu paint(Graphics g) –Appletin piirtävä metodi

12 12 getImage(URL url) –Lataa kuvan osoitteesta url getAudioClip(URL url) –Lataa äänitiedoston osoitteesta url play(URL url) –Soittaa äänitiedoston osoitteesta url

13 13 import java.awt.Graphics; import java.applet.*; public class Appletti extends Applet{ public void paint (Graphics g) { g.drawString(getParameter("etu"),10,10); g.drawString(getParameter("suku"),10,20); }

14 14 import java.awt.Graphics; import java.applet.*; public class Initialisoitu extends Applet{ String teksti; public void init() { teksti="On käynnistetty."; } public void start() { teksti=teksti+" Ja taas."; } public void paint (Graphics g) { g.drawString(teksti, 10,10); }

15 15 Appletti ja grafiikka Appletti on täysin graafinen olio Kaikki tulokset täytyy näyttää graafisesti –Appletviewer kykenee näyttämään System.out.println()-tulostuksia komentorivi- ikkunassa Jotta voisi käyttää appletteja, täytyy hallita ainakin alkeet grafiikan tekemisestä appleteilla

16 16 Grafiikan perusteet Appletilla Kaksi tapaa: AWT ja Swing AWT on vanhempi, mutta laajalti käytössä AWT on yksinkertaisempi Swing käydään läpi APSK-kurssilla Luokka Applet kuuluu AWT:hen Swingiin liittyy luokka JApplet

17 17 Toimintaperiaate Joko piirretään suoraan Appletin (tai sovelluksen) piirtopinnalle, jos appletti on yksinkertainen eikä siinä ole interaktiivisuutta, tai Sijoitetaan komponentit applettiin, ja laitetaan komponentteihin halutut tiedot komponenteissa on metodit, joiden avulla niiden tilaa muutetaan tai tutkitaan

18 18 AWT:ssa on monta erilaista komponenttia:

19 19 Container on komponenttisäiliö. Nämä eivät itse näy, mutta ne sisältävät lisää komponentteja tai säiliöitä – Panel perussäiliö. Näitä on usein monta yhdessä ruudussa. Niiden avulla voi vaikkapa ryhmitellä eri komponentteja yhdeksi ryhmäksi. Panelia voi kätevästi käyttää piirtoalustana, kun sen periyttää ja ylikirjoittaa paint -metodin. – ScrollPane on kuten Panel, mutta siihen tulee vierityspalkit, kun sisältö ei mahdu näkyviin.

20 20 – Applet sisältää yhteistoiminnallisuuden selainten kanssa. Appletilla on piirtopinta, johon voidaan suoraan piirtää. Applettiin laitettavat muut komponentit tulevat tämän piirtopinnan päälle. – Window päätason tyhjä ikkuna. –Dialogit luovat valmiin sapluunan yksinkertaiseen kommunikointiin käyttäjän kanssa. – Frame Window:n alainen luokka, joka tulee koko ikkunan ja komponenttisäiliöiden väliin. Tässä on jo otsikko ja menut.

21 21 Panel-luokka – add -metodilla lisätään paneeliin komponentti. – update - ja repaint -metodeilla käsketään paneelia piirtämään itsensä uudelleen – setSize ja setLocation -metodeilla asete- taan paneelin (ja muiden komponenttien) paikka ja koko, setBounds:illa molemmat. –Tapahtumankäsittelijöillä voi seurata hiiren liikkeitä paneelin (ja muiden Component- luokan jälkeläisten) alueella, esimerkiksi jos haluaa, että hiirellä voi piirtää komponenttiin.

22 22 Frame-luokka (näkyvä ikkuna palkkeineen) –Frame asetetaan näkyviin metodilla show() ja piilotetaan hide(). –Frameen liitetään menupalkki metodilla setMenuBar(). –Frame kokoa ja paikkaa voi muuttaa samoilla metodeilla kuin Panelinkin. Nämä muutokset kannattaa yleensä tehdä vasta kun on jo kutsuttu metodia show(). –Metodilla pack() Framen koko muuttuu pienimmäksi mahdolliseksi, kun otetaan huomioon siinä olevien komponenttien koko.

23 23 Menun käyttö –Kolme hierarkiaa: koko menun käsite (luokka MenuBar), yksittäinen menun alue (Esim. File, luokka Menu) sekä yksittäinen menun kohta (Esim. Open, luokka MenuItem). –Liitetään Framen instanssiin ensin MenuBar, sitten tähän Menu:olioita, joihin taas lisätään MenuItem:olioita. –Menun valintoihin reagoiminen vaatii tapahtumankäsittelijän käyttöä. –Voi helposti liittää näppäinoikopolkuja käyttäen luokkaa MenuShortcut sekä alimenuja, jotka ovat Menu-olioita.

24 24 Applet luokka toimii komponenttisäiliönä –komponentit ovat käyttöliittymän elementtejä –säiliöön voi lisätä ja poistaa komponentteja –säiliöön voi asettaa layout-managereita –komponentit on esitelty omissa luokissaan Appletti Komponentti 2 Kompo- nentti 1 Komponentti 3

25 25 Component on yläluokka kaikille komponenteille. Button on tavallinen painonappi, joka laukaisee toimenpiteen –Buttonia luodessa sille voidaan antaa teksti, joka ilmestyy nappulaan: "Yes", "No" –Se voidaan asettaa päälle tai pois päältä kuten kaikki Component -luokan perilliset metodilla setEnabled(boolean state) –Nappulaa painettaessa halutaan usein tapahtuvan jotain, tämä vaatii Javassa tapahtumankäsittelijän käyttöä.

26 26 Canvas piirtopinta –Canvas on tyhjä suorakaiteen muotoinen alue, joka voidaan sijoittaa ohjelman ruudulle. –Canvasiin voidaan piirtää haluttuja kuvioita tai vaikkapa sijoittaa siihen kuva. –Ongelma on siinä, että jos ohjelma kerran piirtää Canvasiin jotain, piirretty kuvio häviää kun virtuaalikone piirtää Canvasin uudestaan. –Ratkaisuna on Canvasin perintä ja sen paint- metodin ylikirjoitus. –Virtuaalikone kutsuu paint-metodia aina kun Canvas piirretään uudelleen.

27 27 Checkbox valintaruutu –Valintaruutu on pieni ruutu, johon ilmestyy ruksi, kun se on valittu, sekä teksti joka kuvailee valinnan sisältöä. –Näitä on kahta tyyppiä: joko toisistaan riippumattomia (Windowsissa neliskanttisia) tai toisistaan riippuvaisia (vain yksi voidaan valita, Windowsissa pyöreitä). –Jotta ne voisivat riippua toisistaan, pitää ne laittaa samaan CheckboxGroupin määrittelemään ryhmään. Tällöin valintaruutua luotaessa kerrotaan, mihin ryhmään se tulee. –Valintaruudun tilaa voi kysyä getState()- metodilla, joka palauttaa joko true tai false

28 28 Choice pudotusvalikko –Choice on valikko, josta näkyy ensin vain yksi rivi, ja josta klikkaamalla saadaan näkyviin lisää vaihtoehtoja. –Choiceen asetetaan vaihtoehto metodilla add(String item). –Choicessa valittuna olevaa valintaa voi kysyä metodeilla getSelectedItem() tai getSelectedIndex() –Choiceen voidaan asettaa ItemListener - tapahtumankäsittelijä, jolloin suoraan vaihtoehdon valinnasta seuraa toiminto.

29 29 List vyörytyslista –List muistuttaa Choicea, mutta tässä ei tapahdu valikon alasputoamista, vaan valikko on kiinteä kokoinen. Jos kaikki vaihtoehdot eivät mahdu valikkoon, tulee käyttöön vierityspalkit. –Käytössä on metodit getSelectedItem(), getSelectedIndex() ja add() kuten Choicessakin. –Usean vaihtoehdon yhtäaikainen valinta voidaan asettaa metodilla setMultipleMode(), jolloin tuloksien lukemiseen käytetään monikollisia metodeja.

30 30 Label tekstilaatikko –Label on yksinkertainen yksirivinen teksti, joka näkyy ruudulla, ja jota käyttäjä ei voi muokata. –Labelia on kätevä käyttää esim. käyttäjän opasteena, mitä eri komponentit tekevät, tai vaikkapa ohjelman statuksen kertomiseen ("loading image, please wait...") –Labelin teksti asetetaan joko sitä luodessa tai metodilla setText(String text)

31 31 ScrollBar liu’utin –Scrollbaria voi käyttää numeeristen arvojen saantiin käyttäjältä. Esimerkiksi oheisessa kuvassa käyttäjä voi liuttamalla kolmea palkkia valita kolmelle muuttujalle arvot. –Se voi olla horisontaalinen tai vertikaalinen, liu'uttimen koko voi vaihdella, arvoille voidaan määrätä tietty väli. Arvo luetaan metodilla getValue(). –Arvoihin reagoimiseksi lennosta täytyy käyttää AdjustmentListener -tapahtumankäsittelijää. –Voi myös olla, että käyttäjä liu'uttaa palkkia edelleen, jolloin kannattaa tutkia liu'uttamisen lopettamista metodilla getValueIsAdjusting().

32 32 TextComponent- luokka tekstin lukemiseen ja näyttämiseen. Tämä jakaantuu kahteen: – TextArea monirivinen tekstikenttä – TextField yksirivinen tekstikenttä –Teksti luetaan metodilla getText(). –Yksirivinen tekstikenttä voidaan asettaa reagoimaan vaikkapa returnin painallukseen käyttämällä ActionListener - tapahtumankäsittelijää. –Monirivinen tekstikenttä voi sisältää vierityspalkit. Tämä määritellään konstruktorissa.

33 33 Komponenttien asettelu säiliöissä (Panel, Frame) –Halutaan komponenttien tulevan tietylle paikalle käyttöliittymäikkunaan. –Kaksi tapaa: Asetetaan manuaalisesti paikat pikseleinä välittämättä ohjaimesta. –Työläs tapa. –Voi tarkasti määrätä paikat. Käytetään Javan omia asetteluohjaimia (Layout Manager). –Komponentit asettuvat automaattisesti paikoilleen. –Pitää miettiä miten ohjain toimii.

34 34 Layout managereita on AWT:ssa 6 kappaletta: –BorderLayout Komponentit asetellaan pääilmansuuntien + keskustan mukaan (5 paikkaa). Oletuksena Frame-luokassa. –CardLayout Metaforana kortit pakassa, vain päällimmäinen näkyy. Metodeja korteilla pelaamiseen. –FlowLayout Asettaa komponentit vasemmalta oikealle lisäysjärjestyksessä. Oletuksena Panelissa.

35 35 –GridLayout Asettaa komponentit suorakulmaiseen ruudukkoon. –GridBagLayout Monimutkainen ja joustava, ruudukko ei välttämättä ole tasavälinen. Komponenteille voidaan asettaa rajoituksia, jotka ohjain ottaa huomioon komponentteja asettaessaan.

36 36 Appletille piirtäminen –Applet samoin kuin esim. Panel ja Button ovat Component -luokan perillisiä. –Component-luokassa on metodi paint (Graphics g), joka piirtää komponentin. –Jos halutaan piirtää omia kuvioita näihin pitää periä komponentti ja ylikirjoittaa paint-metodi. Eli siis pitää tehdä oma luokka johon kirjoitetaan otsikkoon extends Applet (tai Panel jne.) Omaan luokkaan laitetaan metodi paint (Graphics g), jota virtuaalikone kutsuu automaattisesti. Luokka Graphics edustaa komponentin näkyvää piirtopintaa. Esim. Panel-luokan omaa versiota voi sitten käyttää normaalisti Panelin sijasta.

37 37 Piirtopinnalle piirtäminen –Käytetään Graphics-luokan metodeita piirtämiseen: drawImage (Image img, int x, int y, ImageObserver observer ) –piirtää ladatun kuvan ( Image ) paikkaan (x,y) drawLine (int x1, int y1, int x2, int y2) –piirtää viivan (x1,y1) -> (x2,y2) drawOval (int x,int y,int width,int height ) –Piirtää ovaalin paikkaan (x,y), leveys on width ja korkeus height

38 38 drawPolygon (int[] xPoints,int[] yPoints, int nPoints) –piirtää polygonin, 1. ja viimeinen piste yhdistetään drawPolyline (int[] xPoints, int[] yPoints,int nPoints) –piirtää murtoviivan drawRect (int x,int y,int width,int height ) –piirtää suorakulmion drawString (String str,int x,int y) –piirtää tekstiä annettuun paikkaan

39 39 getClipBounds() – palauttaa viittauksen piirtoalueen kokoon. getClipBounds().width palauttaa piirtoalueen leveyden ja.height korkeuden setColor(Color c) –Vaihtaa piirtovärin. Käyttö esim. setColor(Color.black) tai setColor(new Color(0,15,200))

40 40 Fontin käyttö: setFont(Font f) –asettaa fontin. Esim. setFont(new Font("TimesRoman",Font.BOLD, 36)) –luokka Font määrittelee fontin.

41 41 Skaalaus Usein tulee tilanne, että piirrettävää kuviota pitää skaalata siten, että se täyttää aina kulloisenkin piirtotilan Esim. viiva piirretään määrätyistä koordinaateista määrättyihin koordinaatteihin getClipBounds-metodilla saadaan piirtoalueen koko

42 42 Esim. Ajatellaan, että ruutu on x*y pikseliä Halutaan piirtää suorakulmio, jonka vasen ylänurkka on suhteellisesti pisteessä (10%,10%) ja oikea alanurkka pisteessä (90%,90%) kuvaruudun koosta x=getClipBounds().width //ruudun x-koko y=getClipBounds().height //ruudun y-koko piirtokäsky: drawRect((int)0.1*x, (int)0.1*y, (int)0.9*x, (int)0.9*y);

43 43 Tapahtumankäsittely Applettiin ja tavalliseen sovellukseen voi lisätä graafisia komponentteja, kuten painonappuloita ja valintaruutuja. Niihin voi kirjoittaa tekstiä, piirtää kuvia yms., mutta hyödyllistä olisi myös, jos ne voisivat käynnistää jotain toimenpiteitä Tähän tarvitaan tapahtumankäsittelyä Tapahtuma (event) on luokka, joka kuvaa jotain tapahtunutta toimenpidettä, eri tapahtumatyypeille on omat luokkansa

44 44 Käyttäjän toimenpiteet, kuten painonappulan painaminen, generoivat tapahtuman. Tapahtumat sisältävät tietoa siitä, mikä komponentti ne on generoinut, mitä nappulaa käyttäjä on painanut

45 45 Hiireen liittyvät tapahtumat (MouseEvent): hiiren nappulaa on painettu hiiren nappula on vapautettu hiirellä on klikattu hiiri saapuu komponentin päälle hiiri poistuu komponentin päältä Hiiren liikkeet generoivat ylläolevat tapahtumat sille komponentille, jonka päällä hiiri sattuu olemaan, jos komponentti ottaa ne vastaan.

46 46 Komponentti ei reagoi tapahtumiin, ellei sille ole määritelty tapahtumankäsittelijää näille tapahtumilla Hiiren liikkeitä käsittelee MouseMotionListener- tapahtumankäsittelijä-rajapinta Hiiren nappuloiden painalluksia käsittelee MouseListener-tapahtumankäsittelijä- rajapinta Tässä rajapinnassa on seuraavat metodit

47 47 void mouseClicked(MouseEvent) –Kutsutaan kun hiiren nappulaa napsautetaan void mouseEntered(MouseEvent) –Kutsutaan kun hiiri osuu komponentin alueelle void mouseExited(MouseEvent) –Kutsutaan kun hiiri häipyy alueelta void mousePressed(MouseEvent) –Kutsutaan, kun hiiren nappula painetaan alas void mouseReleased(MouseEvent) –Kutsutaan kun edelläoleva tilanne päättyy

48 48 Kaikki edellämainitut metodit saavat parametrina MouseEvent-tyyppisen tapahtumaolion Tällä oliolla on mm. seuraavat metodit: public int getButton() –mitä nappia painettiin (1=vasen, 3=oikea) public int getClickCount() –Kuinka monta klikkausta tapahtui public int getX() –missä tapahtuma tapahtui

49 49 Graafisten komponenttien käyttäminen tapahtumankäsittelijöiden kanssa Graafisia komponentteja olivat AWT:ssa seuraavat mm.: Button, CheckBox, Choice, List, TextArea, TextField Näihin voi liittyä toimintoja kuten nappulan painaminen, valinnan tekeminen listasta, kirjaimen kirjoittaminen tekstikenttään jne. Tapahtumat käsitellään asiaanliittyvillä tapahtumankäsittelijöillä

50 50 Katsotaan, miten tapahtuma käsitellään Button in tapauksessa Tarpeellinen tapahtumankäsittelijä on ActionListener-rajapinta Tässä on vain yksi toteutettava metodi: void actionPerformed( ActionEvent e) –Kutsutaan, kun nappulaan kohdistuu tapahtuma –Tapahtumaa kuvaa ActionEvent-olio

51 51 ActionEvent-luokka Parametrina välitetään ActionEvent -olio Luokan tärkeimmät metodit: public String getActionCommand() –palauttaa esim. nappulan tekstin public int getModifiers() –palauttaa tiedon, painettiinko samalla Shift, Control, tms. näppäimiä

52 52 WindowListener-tapahtumankäsittelijä –Kuuntelee ikkunan tapahtumia. –Jos halutaan, että ohjelma loppuu, kun käyttäjä napsauttaa ikkunan sulkupainiketta, pitää toteuttaa WindowListener-rajapinta. –Siinä on 7 metodia, jotka pitäisi toteuttaa, vaikka haluttaisiin toteuttaa vain yksi, se jota kutsutaan, kun käyttäjä on napsauttanut painiketta (windowClosing). –Javassa on tästä syystä luokka WindowAdapter, jossa nämä metodit on toteutettu, ja tämän luokan voi periä ja sen metodeista ylikirjoittaa vain ne, jotka haluaa.

53 53 –Riittää siis se, että kirjoitetaan luokan otsikkoon extends WindowAdapter ja ylikirjoitetaan metodi windowClosing: public void windowClosing(WindowEvent e) { System.exit(0); }

54 54 Muita tapahtumankäsittelijöitä ComponentListener –kuuntelee, tuleeko graafinen komponentti näkyville FocusListener –kuuntelee, aletaanko komponenttiin kirjoittaa ListSelectionListener –kuuntelee, tehdäänkö listasta valinta

55 55 Tiedostojen käsittely Perusyksikkö on tiedosto Tiedosto koostuu loogisesti yhteenkuuluvista tiedoista Tiedostot tallennetaan pysyvästi levylle Levyllä olevat tiedostot sijaitsevat hakemistohierarkiassa Hakemistot käsitetään Javassa myös tiedostoiksi Javassa tiedostoa kuvaa luokka File Appletti ei voi ladata tiedostoja levyltä

56 56 File-luokka Konstruktorit: File(String pathname) –Luo uuden File-olion, joka viittaa parametrina annettuun tiedostoon – File f =new File(”tiedosto.txt”) Luo viittauksen tiedosto.txt-tiedostoon oletushakemistossa (suhteellinen osoitustapa)

57 57 – File f=new File (”\\hakemisto\\tiedosto.txt”) Windows-tylinen absoluuttinen osoitus. Mainitaan tiedoston koko hakupolku. Tarvitaan kaksi ”\”- merkkiä, koska yksi tunnistettaisiin erikoismerkin edeltäjäksi. – File f=new File (”/hakemisto/tiedosto.txt”) UNIX ja Apple –tyylinen osoitus Käytössä olevan hakemistoeroittimen saa selville attribuutista File.separator Voi käyttää File f=new File (File.separator+”hakemisto”+ File.separator+”tiedosto”)

58 58 Muita metodeja boolean exists() –palauttaa tosi, jos tiedosto on olemassa String getAbsolutePath() –palauttaa absoluuttisen polun boolean isFile() –palauttaa tosi, jos tiedosto on tiedosto boolean isDirectory() –palauttaa tosi, jos tiedosto on hakemisto

59 59 Muita metodeja boolean delete() –palauttaa epätosi, jos ei onnistunut boolean mkdir() –luo hakemiston, palauttaa onnistuiko canRead() –voiko lukea? canWrite() –voiko kirjoittaa? createNewFile() –luo uuden tiedoston

60 60 Tiedostovirta Java-ohjelmat eivät suoraan lue laitteilta Luodaan virta (stream), joka yhdistää Java-ohjelman haluttuun tiedostoon jollain laitteella Java-ohjelma Tiedostovirta Levy

61 61 Tiedostovirtoja käsittelevät luokat voidaan jakaa neljään ryhmään: 1.InputStream-ryhmän luokat lukevat tietoa tavuittain 2.OutputStream-ryhmän luokat kirjoittavat tietoa tavuittain 3.Reader-ryhmän luokat lukevat tietoa merkeittäin 4.Writer-ryhmän luokat kirjoittavat tietoa merkeittäin

62 62 Tiedostoja on kahta päätyyppiä: –tekstitiedosto sisältää tekstimuotoista tietoa, jota voi editorilla muokata. Esim..java- tiedostot) –binääritiedosto sisältää tietoa ei- tekstimuodossa, sen sisällön voi lukea vain ohjelmalla, joka tätä tietoa osaa lukea. Esim..class-tiedostot Ero on siis esitysmuodossa

63 63 Tekstitiedosto Tekstitiedostossa tiedot ovat riveittäin Rivillä on päätösmerkki (eol (end-of-line)) Tiedostoa luetaan rivi kerrallaan merkeittäin Tiedoston loppumerkki on eof (end-of- file) Binääritiedosto Sisältää tietoa, jota täytyy lukea tavuittain Voi olla vaikkapa kuvatiedosto, olioita

64 64 Tiedoston avaamisprosessi etenee seuraavasti: 1.Määritellään tiedosto, jota käytetään 2.Avataan siihen tiedostovirta 3.Luetaan (tai kirjoitetaan) tiedostovirrasta sopivalla lukijalla Sopivan lukijan valinta riippuu luettavasta tai kirjoitettavasta tiedosta

65 65 Käsitellään seuraavaksi tekstitiedoston lukemista Tekstitiedoston tiedostovirta kuuluu Reader-ryhmään Ryhmän yläluokka on Reader, jonka alaluokkana on mm. BufferedReader

66 66 BufferedReader-luokka Konstruktori BufferedReader(Reader in) –Konstruktori vaatii parametrinaan Reader- tyyppisen parametrin, joka edustaa tiedostovirtaa. Reader on itse abstakti luokka, joten se ei käy. Olio-ohjelmoinnin sääntöjen mukaan parametriksi käy myös Readerin perillinen. Sopiva luokka tähän on FileReader. Se luo merkkien lukemisvirran parametrinaan saamaansa File -olioon.

67 67 Muita metodeja String readLine() –lukee yhden rivin tekstiä int read() –lukee yhden merkin, jonka palauttaa ilman koodausta kokonaislukuna void close() –sulkee tiedoston –on tärkeää muistaa aina sulkea tiedosto

68 68 Muita metodeja void mark(long readAheadLimit) –merkitsee kohdan virrassa. Parametri kertoo kuinka monta merkkiä enintään täytyy merkintä muistaa void reset() –palaa edelliseen merkittyyn kohtaan virrassa void skip(long n) –ohittaa seuraavat n merkkiä virrassa

69 69 BufferedWriteriä käytetään vastaavasti kirjoittamaan tiedostoon. Sen tärkeimmät metodit ovat: void close() –sulkee tiedoston void flush() –kirjoittaa puskurin sisällön tiedostoon. Tällöin ei ole vaaraa, että tiedot jäävät kirjoittamatta vaikkapa ohjelman kaatumisen takia. void newLine() –rivinvaihto

70 70 Muita metodeja void write(String st) –tämä metodi oikeastaan peritään Writer- luokasta. Se kirjoittaa tekstin st tiedostoon ilman rivinvaihtoa. Rivinvaihdon voi kirjoittaa joko käyttämällä newLine-metodia tai kirjoittamalla write(st+”\n”)

71 71 Binääritiedoston kirjoittaminen ja lukeminen ● Periaatteet ovat samat, käytetään vain eri luokkia ● Nämä luokat kuuluvat InputStream ja OutputStream –ryhmiin ● Binääritiedostojen lukemisessa ja kirjoittamisessa eteen voi tulla kaksi tapausta: 1. Halutaan lukea Java-olioita 2. Halutaan lukea yleistä binääridataa

72 72 Tapauksessa 2 voidaan käyttää FileInputStream ja FileOutputStream – luokkia FileInputStream luokka avaa tiedostovirran tiedostoon. Sen konstruktori on seuraava: FileInputStream(File file) –parametrina annetaan tiedosto file Luokan metodeja ovat: int read() –palauttaa yhden tavun tiedostovirrasta. Tavu palautetaan kokonaislukuna.

73 73 Muita metodeja int read(byte[] b) –lukee b.length tavua taulukkoon b. Tavut ovat muodossa byte (8 bittiä). void skip(long n) –ohita n tavua virrassa void close() –sulje lukuvirta

74 74 FileOutputStream FileOutputStream(File file) –avaa kirjoitusvirran tiedostoon file FileOutputStream(File file, boolean append) –avaa kirjoitusvirran. Jos append on tosi, lisätään tavut tiedoston loppuun. Luokan metodeja: void write(int b) –kirjoittaa tavun kirjoitusvirtaan

75 75 Muita metodeja void write(byte[] b) –kirjoittaa taulukon b kirjoitusvirtaan void close() –sulkee tiedoston void flush() –tyhjentää kirjoitusvirran tiedostoon. Tällöin vältetään tavujen menetys ohjelman kaatuessa.

76 76 Tapaus 1:ssä haluttiin tallentaa olioita. Jotta oliot voisi tallentaa, ne täytyy sarjallistaa

77 77 Sarjallistaminen Normaalisti oliot ovat muistissa jossain kohtaa, eivät välttämättä yhdessä kohtaa Tavukoodissa tallennetaan luokan koodi, ei erillisten olioiden sisältöjä Niiden attribuutit voisi tallentaa erikseen, mutta tällöin monimutkaisten olioiden tallentaminen olisi tavattoman työlästä Ratkaisu ongelmaan on sarjallistaminen (serialization): oliot koodataan tavupötköksi, joka sitten kirjoitetaan levylle

78 78 Sarjallistamiseen vaaditaan, että luokka toteuttaa Serializable-rajapinnan. Tämä rajapinta ei vaadi oliolta mitään, se vain kertoo kääntäjälle, että olio saatetaan sarjallistaa Kun olio sarjallistetaan, se muutetaan tavupötköksi, kun se luetaan tavupötkö muutetaan olioksi.

79 79 Oliot voidaan tallentaa levylle käyttäen edellä mainittuja FileInputStreamia ja FileOutputStreamia. Tällöin täytyy näiden lisäksi käyttää ObjectInputStream ja ObjectOutputStream –luokkia, jotka hoitavat sarjallistamisen ObjectInputStreamin metodit: ObjectInputStream( InputStream in) –luo uuden lukuvirran. Parametrina käy vaikka FileInputStream-olio, jollaisia edellä käsiteltiin.

80 80 Object readObject() –lukee olion lukuvirrasta. Koska Javassa kaikki luokat ovat luokan Object periviä, voi tällä metodilla lukea minkä tahansa olion. Lisäksi luokassa ovat samat close(), mark() ja reset() metodit kuin BufferedReader-luokassa.

81 81 ObjectOutputStream ObjectOutputStream(OutputStream out) –konstruktorissa voidaan käyttää parametrina FileOutputStream –oliota Muita metodeja: writeObject(Object obj) –metodi kirjoittaa objektin, jonka voi lukea ObjectInputStreamin avulla Lisäksi käytössä ovat normaalit close() ja flush() -operaatiot

82 82 Esimerkki. Kirjoitetaan ja luetaan kolme oliota käyttäen tiedostoa t.tmp. FileOutputStream fos = new FileOutputStream("t.tmp"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeInt(12345); oos.writeObject("Today"); oos.writeObject(new Date()); oos.close();

83 83 FileInputStream fis = new FileInputStream("t.tmp"); ObjectInputStream ois = new ObjectInputStream(fis); int i = ois.readInt(); String today = (String) ois.readObject(); Date date = (Date) ois.readObject(); ois.close();

84 84 Tekstitiedoston parserointi Parserointi tarkoittaa jäsentelyä tutkitaan, miten voidaan lukea monimutkaisesta tekstitiedostosta halutut kohdat Periaatteena on, että tunnetaan tiedoston formaatti, ja tiedetään missä kohtaa halutut tiedot ovat Voidaan myös tuntea tekstin seasta avainsanoja, joiden jälkeen tiedetään seuraava haluttu tieto

85 85 Apuna käytetään StringTokenizer - luokkaa, jonka avulla voidaan paloitella merkkijono osiin: StringTokenizer(String str, String delim) –luo StringTokenizer-olion –parametri str on merkkijono, joka halutaan jäsentää –parametri delim on erotin merkkijonon eri osien välillä

86 86 Metodeja: String nextToken() –palauttaa seuraavan osan tekstiä boolean hasMoreTokens() –kertoo, onko vielä tekstiä käsittelemättä int countTokens() –palauttaa jäljellä olevien tekstin osien määrän

87 87 Esim.: käsitellään opiskelijaa kuvaava merkkijonoa mjono=”paavo;väyrynen;TKT;2000”; StringTokenizer st=new StringTokenizer(mjono,”;”); String nimi=st.nextToken(); String suku=st.nextToken(); String ko=st.nextToken(); int aloitusvuosi=Integer. parseInt(st.nextToken());

88 88 Java 1.5:ssä on uusi menetelmä tekstitiedostojen käsittelyyn: Scanner- luokka. ● Sen avulla voi helposti lukea tekstitiedostoja rivi tai muu alue kerrallaan. ● Scannerilla voi lukea mitä tahansa merkkijonoja ja määritellä merkki, johon alue katsotaan päättyväksi käyttäen useDelimiter-metodia. ● Parametriksi annetaan String tai Pattern- tyyppinen säännöllinen ilmaus.

89 89 ● Säännöllisiä ilmauksia on esim. ”a*b”, jota vastaavat esim. Ilmaisut ”ab”, ”aab”, ”aaaaaab” jne. ● Pattern ja Matcher-luokkia käyttäen voi laatia hyvin monenlaisia ilmauksia. ● Scanner sisältää paljon metodeja joilla voi esim. automaattisesti lukea seuraavan kokonaisluvun hypäten yli tekstin siihen saakka (nextInt()-metodi).

90 90 Verkkoyhteyksien käyttäminen ● Javassa voi ottaa monenlaisia verkkoyhteyksiä 1. Voi lukea sivuja HTTP-protokollalla 2. Voi kutsua hajautettuja sovelluksia 3. Voi ottaa socket-yhteyden Tutkitaan ensin pintapuolisesti vaihtoehtoa 3

91 91 Socket-yhteys Socket on kaksisuuntaisen keskusteluyhteyden toinen pää Palvelin kuuntelee yhteydenottopyyntöjä tietyssä portissa socketilla Asiakas lähettää yhteyspyynnön

92 92 Palvelin ottaa yhteyspyynnön vastaan ja antaa asiakkaan käyttöön uuden socketin, joka on jossain toisessa portissa Sitten palvelin jatkaa yhteydenottoportin kuuntelua, josko muutkin haluaisivat yhteyttä Asiakas kommunikoi palvelimen kanssa

93 93 Socketteja voidaan käyttää Javassa java.net-paketissa olevan Socket-luokan avulla. Socketit ovat alhaisen tason keskusteluväline HTTP-yhteydet käyttävät socketteja toteutuksessaan Java appletit eivät voi ottaa socket- yhteyksiä muualle kuin siihen palvelimeen, josta ne ladattiin

94 94 Hajautetut sovellukset Javassa voidaan sovelluksia hajauttaa Tämä tapahtuu mahdollistamalla metodikutsut verkon yli Yhdelle koneella toimiva ohjelma voi esittää metodikutsuja normaaliin tapaan käyttäen RMI-protokollaa Samalla voi siirtää parametreissa tietoa Hyvin tehokas korkean tason järjestelmä

95 95 HTTP-protokollan käyttö Javassa voi luoda HTTP-yhteyksiä Appletit eivät saa ottaa HTTP-yhteyksiä muualle kuin siihen koneeseen, josta ne ladattiin Java-sovellukset voivat käyttää HTTP- yhteyksiä vapaasti Ei vaadi www-palvelimelta mitään ylimääräistä

96 96 HTTP-yhteydet määrittelee URL-osoite URL=Uniform Resource Locator URL:n muoto on seuraava: URL koostuu siis kahdesta osasta, joita erottaa kaksoispiste Ensimmäisenä on protokolla, jota käytetään, toisena osoite, johon viitataan

97 97 URL-osoite voi viitata monenlaiseen protokollaan: ftp://ftp.mozilla.org/ http://www.it.utu.fi/ mailto:jussi.salmi@it.utu.fi Myös Gopher, News, File-protokollat http://www.it.utu.fi/ajankohtaista/ Osoitteessa näkyy protokolla, palvelin ja polku haluttuun tiedostoon. Pelkkä / palvelimen tai hakemiston jälkeen tarkoittaa index.html-tiedostoa

98 98 Javassa mallinnetaan URL:ää luokalla URL, joka löytyy java.net-paketista URL-luokka: konstruktori: URL(String spec) –spec-parametri on URL-osoite URL(String protocol, String host, String file) –Määritellään kaikki erikseen

99 99 Tiedostojen lukeminen URL:stä Tiedostojen lukemiseen tarvitaan lukuvirta URL:stä saadaan lukuvirta käyttämällä URL-luokan openStream-metodia: InputStream openStream() Metodi palauttaa InputStream-tyyppisen lukuvirran Tämä on siis tavuittain lukeva lukuvirta Sitä voidaan käyttää yhdessä vaikkapa ObjectInputStreamin kanssa lukemaan sarjallistettuja olioita

100 100 Seuraava ohjelma käyttää ObjectInputStreamia olioiden lukemiseen aiemmasta esimerkistä, jossa talletettiin muutama olio levylle Huom! luettavan tiedoston tulee olla samalla palvelimella kuin appletti Tuloksena näytetään yhden olion sisältö Label-tyyppisessä tekstipalkissa Samalla tavalla voitaisiin lukea muitakin binääritiedostoja verkon yli

101 101 try { URL sivu = new URL("http://staff.cs.utu.fi/staff/jussi.s almi/tmp"); ObjectInputStream p = new ObjectInputStream(sivu.openStream()); int i = p.readInt(); String today = (String)p.readObject(); Date date = (Date)p.readObject(); p.close(); Label label = new Label(today); add(label); } catch (Exception e) {}

102 102 Tekstitiedostojen lukeminen Aiemmin käytettiin Reader-tyyppistä tiedostovirtaa tekstitiedostojen lukemiseen URL-luokassa on kuitenkin vain metodi tavutyyppisen tiedon lukemiseen On kuitenkin olemassa luokka InputStreamReader, joka mahdollistaa tavujen lukemisen virrasta merkkeinä Tekstiä voidaan lukea sitä käyttäen lisäksi voidaan käyttää mitä tahansa haluttua lukijaa merkkien lukemiseen

103 103 Esimerkki tekstitiedoston lukemiseen verkon yli käyttäen BufferedReader -luokkaa BufferedReader vaatii konstruktorissaan jonkin Reader -tyyppisen olion InputStreamReader on itse Readerin perillinen, mutta se vaatii konstruktorissaan InputStream - tyyppistä parametria Niinpä se käy BufferedReaderille ja hyväksyy openStream -metodin palauttaman InputStream -virran

104 104 try { URL url = new URL("http://staff.cs.utu.fi/staff/j ussi.salmi/tekstitiedosto"); InputStreamReader isr= new InputStreamReader( url.openStream()); BufferedReader br=new BufferedReader(isr); String teksti=br.readLine(); br.close(); } catch (Exception e) {}

105 105 Tiedostoon kirjoittaminen verkon yli Tämä on paljon vaikeampaa Lukemisessa riittää, kun luettava tiedosto on laitettu oikeaan paikkaan palvelimelle Kirjoittamisessa täytyy jonkun olla palvelimen päässä kuuntelemassa kirjoituspyyntöjä Appletissa on helppoa lähettää kirjoituskutsuja Tällä kurssilla ei tarvitse oppia kirjoitusta

106 106 URL-luokassa on metodi URLConnection openConnection() –avaa yhteyden URL:ään –palauttaa URLConnection-olion, jota voi käyttää niin lukemiseen kuin kirjoittamiseen – openStream -metodi käyttää oikeastaan myös openConnection -metodia –URLConnection-luokassa on metodi void setDoOutput (boolean dooutput) –laitetaan dooutput todeksi, jolloin voidaan kirjoittaa seuraavan esimerkin mukaisesti

107 107 Kirjoittaminen tapahtuu hyväksikäyttäen cgi-bin-menetelmää Tällöin palvelimella on määrätty cgi-bin hakemisto, johon sijoitetaan ohjelmat, jotka osaavat käsitellä verkon yli tulevaa tietoa. Jotta seuraava ohjelma toimisi, tulee palvelimella java.sun.com olla olemassa cgi-bin –hakemistossa ohjelma backwards Samalla menetelmällä toimivat mm. verkossa täytettävät HTML-lomakkeet

108 108 URL url = new URL("http:// java.sun.com/cgi-bin/backwards"); URLConnection c = url.openConnection(); c.setDoOutput(true); PrintWriter out = new PrintWriter(c.getOutputStream()); out.println(“morjens!”); out.close();

109 109 Poikkeustenkäsittely Ohjelmia suoritettaessa tulee tilanteita, jolloin suorituksessa oleva metodi ei pysty jatkamaan suoritusta Tämä voi johtua virheellisestä syötteestä tai vaikkapa jonkin ohjelman ulkopuolelta pyydetyn palvelun epäonnistumisesta Tällainen voi tapahtua vaikkapa tilanteessa, jossa tiedoston luku tai verkkoyhteyden otto epäonnistuu

110 110 Ensimmäiseksi metodi yrittää toipua virheestä. Tämä ei aina onnistu. Tämä jälkeen seuraa tilanne, jossa ongelma on hoidettava ylemmällä tasolla. Metodi itse ei välttämättä tiedä, mihin kokonaisuuteen epäonnistunut tehtävä kuului, ja miten se vaikuttaa ohjelman suorituksessa eteenpäin Muissa ohjelmointikielissä tämä tilanne voitaisiin hoitaa lopettamalla aliohjelman suoritus ja palauttamalla tieto virheestä

111 111 Javassa on kuitenkin käytössä erillinen poikkeuskäsittely Poikkeus on ilmoitus kohdatusta virhetilanteesta Tällöin metodi virheen kohdatessaan, kun se ei pysty itse virheestä toipumaan, nostaa poikkeuksen. Poikkeus lopettaa metodin suorituksen, kontrolli palaa metodia kutsuneelle metodille

112 112 Tämä ratkaisee, osaako se toipua kohdatusta virheestä Jos luokassa ei ole virheenkäsittelyosiota, jatkaa poikkeus ylemmälle tasolla Poikkeus palaa ylöspäin kutsupinossa, kunnes joku sen käsittelee Jos ei kukaan osaa käsitellä, ohjelman suoritus päättyy

113 113 Poikkeus on teknisesti toteutettu luokkana sekä mekanismina poikkeuksien välittämiseen Luokan attribuutit kertovat millaisesta virhetilanteesta on kysymys ja minkä metodien kautta virhe on tullut Poikkeusten käsittelymekanismi on seuraava:

114 114 try { } määrittelee lohkon, josta voi syntyä poikkeus Mikäli metodissa suoritetaan operaatioita, jotka voivat nostaa poikkeuksen, täytyy ne laittaa try -lohkoon try -lohkon jälkeen on catch –lohko, jossa virheet käsitellään catch -lohkoja voidaan määritellä useita erilaisille virhetilanteille finally-lohkossa estitetään toimenpiteet, jotka suoritetaan joka tapauksessa

115 115 Poikkeuksia on kiinniotettavia ( checked ) ja läpipäästettäviä ( unchecked ). Läpipäästettäviä ei tarvitse ottaa kiinni try-catch -rakenteella Läpipäästettävät poikkeukset ovat RuntimeException -luokan perillisiä Muut poikkeukset täytyy ottaa kiinni, tai ne täytyy määritellä metodin otsikossa throws -määreellä. throws -määre kertoo,että metodi lähettää eteenpäin määreessä ilmoitetun virheen

116 116 try { File f=new File(”uusi”); f.createNewFile(); //throws IOException } catch (IOException e) { //käsitellään IO-poikkeus } finally { //suoritetaan joka tapauksessa }

117 117 public void esim(File f) throws IOException { f.createNewFile(); }

118 118 Luokka Throwable on kaikkien Javan virheitä käsittelevien luokkien yliluokka Sen jälkeläiset jakaantuvat kahteen ryhmään: Error ja sen jälkeläiset ovat vakavia ongelmia, jotka eivät liity Javan tavalliseen käyttöön; ohjelmoijan ei tarvitse niistä välittää Exception käsittelee normaaleja virhetilanteita, jotka voivat liittyä normaaliin ohjelman toimintaan

119 119 Luokka Exception konstruktorit Exception(String message) –Luo uuden poikkeuksen, johon liittyy virheilmoitus message Exception(String message, Throwable cause) –Tähän liittyy myös poikkeuksen syy, joka on itsessään jokin poikkeus. Tarkoituksena on välittää viesti siitä, mikä virheen aiheutti. Käyttäen tätä ylempi taso ei ole sidottu alemman tason toteutukseen.

120 120 try { lowLevelOp(); } catch (LowLevelException le) { throw new HighLevelException(le); // ketjuuntuva konstruktori }

121 121 Omien poikkeusten määrittely Poikkeuksia voi itse määritellä 1.Käyttäen jo olemassa olevia poikkeuksia 2.Periyttämällä oman poikkeusluokan Exception-luokasta Tapauksessa 1 voidaan toimia vaikkapa näin:

122 122 public void tutkiLuku(int l) throws Exception { final int MIN=10; final int MAX=25; if (l MAX) { Exception ongelma=new Exception (”Luku ei ole arvovälillä”); throw ongelma; }

123 123 Tapauksessa 2 pitää periä Exception- luokka, muuten Java ei ymmärrä kyseessä olevan poikkeuksen Tällöin voidaan poikkeukseen määritellä omia toimintoja kuten yleensäkin perittäessä Yleisesti ottaen kuitenkin perityn poikkeuksen tärkein anti on se, että sen nimi kuvastaa tapahtunutta tilannetta Edellinen esimerkki käyttäen omaa poikkeusta

124 124 public class LukuKelvoton extends Exception { public LukuKelvoton(String v) { super(v); }

125 125 public void tutkiLuku(int l) throws LukuKelvoton { final int MIN=10; final int MAX=25; if (l MAX) { LukuKelvoton ongelma=new LukuKelvoton (”Luku ei ole arvovälillä”); throw ongelma; }

126 126 Java-ohjelmien dokumentointi 1. Dokumentaatiolla on monta tehtävää 2. Dokumentaatio kertoo ohjelmoijalle, mitä hän on ohjelmaa kirjoittaessaan ajatellut ohjelmansa tekevän. 3. Dokumentaatio kertoo muille kuin ohjelmoijalle, mitä ohjelma tekee. Tätä tarvitaan, kun he joutuvat ylläpitämään sitä 4. Dokumentaatio voi sisältää oikeellisuuden toteamiseen tarkoitettuja väitteitä 5. Dokumentaatio toimii käyttöohjeena

127 127 Dokumentaatiota on monenlaista Ohjelmakoodin kommentointi –Ohjelman sekaan kirjoitetut kommentit –Auttavat ohjelmakoodin toiminnan ymmärtämistä –Hyödyllistä, kun ohjelmaa pitää muuttaa Ohjelmakoodin koottu tekninen dokumentointi –Kertoo, mitä metodeja tai luokkia ohjelmassa on, ja miten niitä käytetään –Auttaa ymmärtämään ohjelman korkeamman tason toimintalogiikkaa

128 128 –Tällaista dokumentaatiota tarvitsee henkilö, joka käyttää luokkia ja metodeja hyödyksi omassa ohjelmassaan Ohjelman käyttäjälle suunnattu dokumentaatio –Ei kuvaa ohjelman sisäistä toimintaa, vaan kertoo miten sitä käytetään

129 129 Ohjelmakoodin kommentointi on eri kielissä samankaltaista Syntaksi kommenttien kirjoittamiseen vaihtelee Javassa kommentin erottimena toimii –”//” yksiriviselle kommentille –”/* kommentti */” moniriviselle kommentille –Samat kommentointikonventiot ovat käytössä myös C++:ssa

130 130 Ohjelmakoodin teknisessä dokumentoinnissa Javassa on käytössä apuväline, JavaDoc JavaDoc nojautuu tietyllä formaatilla kirjoitettuun kommentointiin Dokumentoinnilla saadaan aikaiseksi luokkien kuvaukset sekä metodien kuvaukset parametreineen, palautusarvoineen sekä poikkeuksineen helposti luettaviksi HTML-tiedostoiksi

131 131 JavaDoc-kommenttien formaatti /**Tämän metodin tarkoituksena *on palauttaa kahdesta luvusta *suurempi. * *Metodi palautuu aina *@param x Toinen luku *@param y Toinen luku *@return suurempi parametreista x ja y *@ see Integer

132 132 ● JavaDoc-kommentteihin voi siis laittaa monenlaista HTML- ohjattua tietoa. ● Tärkeää tietoa on ennenkaikkea se, jossa kerrotaan metodin ulkoinen liittymä, sen sisäinen toiminta ei saa käydä näistä dokumentoinneista ilmi, vaan se on ohjelmakoodin muun kommentoinnin asia (// ja /*.. */ kommentit koodin seassa). http://java.sun.com/j2se/javadoc /

133 133 ● Harjoitustyön dokumentoinnista tulisi käydä ilmi ainakin seuraavat asiat: ● Tehtävänanto juuri sellaisena kuin se on sovittu tai määritelty ● Ratkaisun periaatteet ● Missä ympäristössä tehtävä on ratkaistu ● Ratkaisun tunnetut ongelmat ● Mahdollisuudet jatkokehitykseen ● Ratkaisun yksityiskohtaisempi kuvaus ● Mitä luokkia ja metodeja on käytetty, mikä on niiden rooli kokonaisuuden kannalta

134 134 ● Pääasialliset tavat, miten kutsut tapahtuvat ● Testiajot ● Mikäli kyseessä on graafinen ohjelma, dokumenttiin tulee laittaa selostus siitä, mitä testejä ohjelmalle on tehty sekä kuvaruutukaappauksia ohjelman toiminnasta ● Jos ohjelma antaa tuloksensa tekstinä komentoriville tai tiedostoon, on tulosteet syytä laittaa mukaan ● Ohjelmakoodi ● Ohjelmakoodi liitetään dokumenttiin liitteenä


Lataa ppt "1 Ohjelmointiprojekti I (2 ov) kevät 2005 Lehtori Jussi Salmi Luentoja 10 tuntia, Ryhmätyö."

Samankaltaiset esitykset


Iklan oleh Google