Olio-ohjelmointi Suunnittelumallit Adapter ja Composite. 1. Adapter
|
|
- Raili Korpela
- 9 vuotta sitten
- Katselukertoja:
Transkriptio
1 Olio-ohjelmointi Suunnittelumallit Adapter ja Composite Rakennemalleissa päähuomio kohdistetaan siihen, miten luokkia ja olioita yhdistellään muodostamaan laajempia rakenteita. Rakenteelliset luokkamallit käyttävät enimmäkseen periytymistä niiden luomiseksi, kun taas rakenteelliset oliomallit kuvaavat, miten saadaan aikaan uusia toimintoja olioita yhdistelemällä. Tässä osassa tutustutaan kahteen rakennemalliin (Adapter eli Sovitin ja Composite eli Rekursiokooste) suurimmaksi osaksi lähteen [Gam] pohjalta. 1. Adapter Olio-ohjelmoinnissa sattuu varsin usein, että käytettävissä on luokka, jonka toiminta vastaa ohjelman vaatimuksia, mutta sen rajapinta ei sovellu uuteen ympäristöön tai sen käyttö on hankalaa uudessa ympäristössä. Ongelma kohdataan usein pyrittäessä uudelleenkäyttöön. Luokka voi olla kirjastoluokka tai muuten sellainen, että sen rajapintaa ei voi muuttaa. Ongelma voidaan usein ratkaista kirjoittamalla sovitinluokka vanhan luokan ja uuden ohjelmakoodin väliin. Ratkaisu tunnetaan Adapter- eli Sovitin-suunnittelumallina. Javan luokkakirjastoissa mallia käytetään usein. Tutustutaan hieman graafisen käyttöliittymän ohjelmointiin käyttäen Swing-luokkia. Graafiseen käyttöliittymän perustuvan sovelluksen on aina perittävä ikkunaluokka JFrame, jotta voitaisiin toteuttaa sovelluksen pääikkuna. Usein laajennetaan suoraan luokkaa JFrame, mutta myös siitä perittyjä luokkia voi käyttää sovelluksen luokkana. Toteutus tapahtuu niin, että määritellään sovelluksen luokka JFramen aliluokaksi, sen muodostimessa tai muussa metodissa tehdään ikkunan alustustoimenpiteet. Yleensä mainmetodissa luodaan ikkuna ja näytetään se omassa säikeessään. Seuraavassa esimerkissä sovellus ainoastaan avaa uuden ikkunan, jonka otsikkona on Varsin mallikas ikkuna. Sovelluksen toteuttavan luokan nimeksi annetaan EkaIkkuna ja sen konstruktorissa annetaan sille otsikko ja asetetaan sen koko. Sovelluksen päämetodissa luodaan uusi olio luokasta ja näytetään se luotavassa uudessa säikeessä Frame-luokan setvisible() - metodilla. Huomaa, että jos tämä lause jätetään pois ohjelmasta, ikkuna kyllä luodaan, mutta se jää näkymättömiin. 1
2 Esimerkki. Ikkunan luova sovellus: import javax.swing.*; class EkaIkkuna extends JFrame { public EkaIkkuna() { // Annetaan ikkunalle otsikko this.settitle("varsin mallikas ikkuna."); // Määrätään ikkunan koko this.setsize(300,100); public void laitaesiin() { // Laitetaan näkyviin setvisible(true); public static void main(string[] args) { // Luodaan uusi EkaIkkuna -olio final EkaIkkuna akkuna = new EkaIkkuna(); ); // Näytetään ikkuna omassa säikeessään javax.swing.swingutilities.invokelater(new Runnable() { public void run() { akkuna.laitaesiin(); Ikkunan luomiseksi ei siis tarvita paljonkaan koodia, mutta edellistä sovellusta tutkittaessa huomataan, että mikäli ikkuna suljetaan normaaliin tapaan, jää itse sovellus vielä pyörimään ja se on lopetettava kirjoittamalta konsolilta Ctrl-c. Tämä vakavasti otettavissa sovelluksissa kiusallinen ominaisuus on JFrame-ikkunan sulkemisesta aiheutuva oletustapahtuma. Sovelluksen lopettaminen voidaan tehdä muuttamalla oletustapahtumaa tai, kuten seuraavassa, sopivan rajapinnan avulla. Kun painetaan hiirellä otsikkopalkin ristiä, aiheutuu ikkunatapahtuma, mutta sovellus ei reagoi siihen odotetusti. Javassa ikkunatapahtumia voidaan käsitellä sovelluksissa toteuttamalla AWTkirjastoon kuuluva WindowListener-rajapinta. Tämä rajapinta käsittää metodit 2
3 public void windowopened(windowevent e) Järjestelmä kutsuu tapahtuman kuuntelijan tätä metodia, kun ikkuna on avattu public void windowclosed(windowevent e) Järjestelmä kutsuu tapahtuman kuuntelijan tätä metodia, kun ikkuna on suljettu public void windowactivated(windowevent e) Järjestelmä kutsuu tapahtuman kuuntelijan tätä metodia, kun ikkuna on aktivoitu public void windowdeactivated(windowevent e) Järjestelmä kutsuu tapahtuman kuuntelijan tätä metodia, kun ikkuna menettää aktiivisuutensa public void windowiconified(windowevent e) Järjestelmä kutsuu tapahtuman kuuntelijan tätä metodia, kun ikkuna pienennetään public void windowdeiconified(windowevent e) Järjestelmä kutsuu tapahtuman kuuntelijan tätä metodia, kun ikkuna suurennetaan public void windowclosing(windowevent e) Järjestelmä kutsuu tapahtuman kuuntelijan tätä metodia, kun ikkuna suljetaan Sovelluksiin ei tarvitse aina liittää toimintoa jokaista ikkunatapahtumaa varten. Kun rajapinta toteutetaan, on kuitenkin sen jokainen metodi implementoitava. Tällaisessa tapauksessa riittää kun kirjoittaa tyhjän metodirungon niihin metodeihin, jotka vastaavat sovelluksen kannalta yhdentekeviä tapahtumia. Kun halutaan toteuttaa ainoastaan ikkunan sulkeminen, tarvitaan vain windowclosing()-metodiin koodia. Jotta voitaisiin käyttää rajapinnan metodeja, on koodissa toteutettava seuraavat asiat: 1) Luokan on toteutettava WindowListener rajapinta, mitä varten on myös importoitava java.awt.event-paketti. 2) On kirjoitettava kaikki rajapinnan metodit ja niistä windowclosing() metodiin lause System.exit(0); mikäli sovelluksen halutaan loppuvan ikkunan sulkemiseen. 3) Luotuun ikkunaan on lisättävä ikkunatapahtumien kuuntelija. Tämän voi tehdä kutsumalla ikkunan metodia addwindowlistener(). Usein kuuntelijaksi ilmoitetaan olio itse ja sen luokkaan kirjoitetaan tapahtumat käsittelevä koodi, mutta tapahtuman kuuntelijaolio voi olla jokin muukin. Kun tehdään nämä muutokset EkaIkkuna-luokan koodiin, saadaan seuraava sovellus: 3
4 import javax.swing.*; import java.awt.event.*; class TokaIkkuna extends JFrame implements WindowListener { public TokaIkkuna() { // Kuten edellisessä esimerkissä public void laitaesiin() { // Laitetaan näkyviin setvisible(true); // Lisätään ikkunaan kuuntelijaksi se itse! addwindowlistener(this); public static void main(string[] args) { // Luodaan uusi TokaIkkuna -olio final TokaIkkuna akkuna = new TokaIkkuna(); ); // Näytetään ikkuna omassa säikeessään javax.swing.swingutilities.invokelater(new Runnable() { public void run() { akkuna.laitaesiin(); /* Nämä metodit on rajapinnan takia implementoitava, mutta niiden rungot voidaan jättää tyhjiksi */ public void windowopened(windowevent e){ public void windowclosed(windowevent e) { public void windowactivated(windowevent e) { public void windowdeactivated(windowevent e) { public void windowiconified(windowevent e) { public void windowdeiconified(windowevent e) { // Vain tähän metodiin tarvitaan koodia! public void windowclosing(windowevent e) { System.exit(0); Nyt päästään Adapter-suunnittelumallin sovellukseen. Mikäli toteuttaa usein edellisen kaltaisia ikkunoita, tyhjien ikkunatapahtumametodien kirjoittaminen alkaa rasittaa mieltä. Siksi Javaan on toteutettu luokka WindowAdapter, joka toimii sovittimena WindowListener-rajapinnan ja ikkunaohjelman välillä. Sovittimeen on valmiiksi kirjoitettu kaikki rajapinnan vaatimat metodit tyhjinä. Näin ollen ohjelmoijan tarvitsee ainoastaan kirjoittaa luokka, joka perii luokan WindowAdapter ja uudelleenmääritellä haluamansa metodit. Tällöin pitää luonnollisesti lisätä ikkunan kuuntelijaksi uuden luokan olio. Esimerkiksi edellisen esimerkin ohjelmasta muodostuisi seuraavan kaltainen: 4
5 import javax.swing.*; import java.awt.event.*; class Poistu extends WindowAdapter { public void windowclosing(windowevent e){ System.exit(0); class TokaIkkunaAdapter extends JFrame { public TokaIkkunaAdapter() { // Kuten ennen public void laitaesiin() { // Laitetaan näkyviin setvisible(true); // Lisätään ikkunaan kuuntelijaksi Lopeta-olio addwindowlistener(new Poistu()); public static void main(string[] args) { // Luodaan uusi TokaIkkunaAdapter -olio final TokaIkkunaAdapter akkuna = new TokaIkkunaAdapter(); ); // Näytetään ikkuna omassa säikeessään javax.swing.swingutilities.invokelater(new Runnable() { public void run() { akkuna.laitaesiin(); Näin selvitään hieman pienemmällä vaivalla ja koodikin on vähän siistimpi. Kiinnostunut lukija löytää lisää tietoa Swing-komponenttien käytöstä lähteestä [Jav]. Adapter-mallin tarkoitus voidaan siis kuvata seuraavasti: Muuntaa luokan rajapinnan asiakkaiden vaatimaan muotoon ja mahdollistaa muuten rajapinnoiltaan yhteensopimattomien luokkien yhteistoiminnan. Adapteria voi soveltaa ainakin seuraaviin tapauksiin: Halutaan käyttää valmista luokkaa, jonka rajapinta ei vastaa tarpeita. Halutaan luoda uudelleenkäytettävä luokka, joka tulee toimimaan toistaiseksi tuntemattomien luokkien kanssa. On käytettävä useaa olemassa olevaa aliluokkaa, mutta ei ole käytännöllistä periä niitä kaikkia. Oliosovitin voi sovittaa yliluokkansa rajapinnan. 5
6 Adapter-mallista on kaksi muotoa: luokkasovitin ja oliosovitin. Luokkasovittimessa sovitettava luokka peritään sovitinluokkaan, kun taas oliosovittimessa sovitinluokka sisältää sovitettavan luokan olion osaolionaan. Alla on luokkasovittimen luokkakaavio: Kuva 1. Adapter-mallin luokkaversio. (Vrt. [Gam]) Huomaa, että malli käyttää moniperiytymistä. Tässä siis oletetaan, että on olemassa valmis luokka Adaptee, joka halutaan sovittaa vastaamaan asiakasluokan Request()-kutsuun. Adapteeluokassa onkin toiminnaltaan sopiva metodi, mutta se on nimeltään SpecificRequest(). Tässä tapauksessa Adaptee peritään luokkaan Adapter, johon kirjoitetaan metodi Request() kutsumaan Adaptee-luokan SpecificRequest-metodia. Olioversion luokkakaavio on seuraavan kaltainen: Kuva 2. Adapter-mallin olioversio. (Vrt. [Gam]) Yllä olevassa versiossa ei tarvitse käyttää moniperiytymistä, koska Adapteesta tulee nyt Adapterin osaolio. 6
7 Mallin osallistujat ovat siis Target Määrittelee sovelluskohtaisen rajapinnan, jonka kautta se voi kommunikoida Clientin kanssa. Client Kommunikoi olioiden kanssa Targetin määräämän rajapinnan kautta. Adaptee Määrittelee rajapinnan, joka on sovitettava uuteen ympäristöön Adapter Sovittaa Adapteen rajapinnan Targetin määräämään rajapintaan. Mallin version valintaan vaikuttaa, miten sovitinta käytetään. Oletetaan, että luokalla Adaptee on aliluokkia ja sen aliluokissa on määritelty operaatioita, jotka on myös sovitettava. Esimerkiksi yllä metodi SpecificRequest voisi olla uudelleenmääritelty Adaptee-luokan aliluokissa. Mikäli joissain tapauksissa olisi suoritettava aliluokan metodi, on käytettävä oliosovitinta. Perittäessähän luokka Adapter perisi ainoastaan Adaptee-luokan toteutuksen. Jos taas Adapterluokan on uudelleenmääriteltävä joitakin Adaptee-luokan toimintoja, on syytä käyttää luokkasovitinta. Aliluokassa uudelleenmäärittely on helpompi toteuttaa. Esitetään vielä esimerkki suunnittelumallin käytöstä. Oletetaan, että ohjelmassa on luokka StringContainer, joka sisältää jäsenmuuttujanaan String-taulukon. Syystä tai toisesta taulukon merkkijonoille on tehtävä jokin mutkikas operaatio ja palautettava muokattu taulukko. Luokan määrittely olisi class StringContainer { private: std::string* stringtable; int length; StringContainer(std::string* intable, int len); ~StringContainer(); int getlength() const; ; // Muokkaa stringtablen merkkijonot ja // palauttaa muokatun taulukon std::string* getmodifiedstrings() const; Tässä vaiheessa huomataankin, että on olemassa kirjastoluokka StringVectorModifier, jonka metodi modify tekee halutun operaation, mutta ei käytäkään taulukkoja vaan C++:n standardikirjaston kokoelmaluokkaa vector. class StringVectorModifier { void modify(std::vector<std::string> &strings); ; Näin ollen luokka StringContainer ei voi suoraan käyttää luokan metodia. Mikäli luokkaa StringContainer ei voida muuttaa, on kätevintä soveltaa Adapter-mallia. Nyt luokka StringContainer vastaa mallin kuvauksessa luokkaa Client ja luokka StringVectorModifier luokkaa Adaptee. Seuraavaksi tarvitaan luokkaa Target vastaava luokka; tämän on sisällettävä metodi, jota voidaan kutsua luokasta StringContainer: 7
8 class StringArrayModifier { virtual std::string* modifyarray(std::string *array, int length)=0; ; Luokan metodilla ei tarvitse olla lainkaan toteutusta, koska luokka peritään luokkaan, joka toteuttaa metodin. Siten metodi voidaan jättää edellisessä luokassa puhtaasti virtuaaliseksi. Tämän jälkeen voidaan kirjoittaa varsinainen sovitinluokka VectorArrayAdapter, joka siis vastaa mallin kuvauksessa luokkaa Adapter. Tehdään ensin mallista luokkaversio, jolloin VectorArrayAdapter perii sekä luokan StringVectorModifier että luokan StringArrayModifier: // Tiedosto VectorArrayAdapter.h class StringAdapter: private StringVectorModifier, public StringArrayModifier { std::string* modifyarray(std::string* array, int length); ; // Tiedosto VectorArrayAdapter.cpp std::string* VectorArrayAdapter::modifyArray(std::string* array, int length){ // Määrittele string-olioita sisältävä vector strings // Kirjoita taulukon array sisältämät merkkijonot // vectoriin strings // Muunna vectorin strings sisältö modify(strings); // Luo uusi taulukko modified_table, kirjoita // vectorin strings merkkijonot siihen // ja palauta taulukko return modified_table; Lopulta on enää lisättävä muunnoksen kutsuminen luokkaan StringContainer. Metodi getmodifiedstrings() voidaan toteuttaa nyt seuraavasti: std::string* StringContainer::getModifiedStrings() const { VectorArrayAdapter va; std::string *modifiedstrings = va.modifyarray(stringtable, length); return modifiedstrings; Käytännön sovelluksissa kannattaa huomata, että metodin palauttama taulukko on dynaamisesti luotu, joten sen tuhoaminen jää kutsujan vastuulle. 8
9 Edellisen ohjelman suunnittelumallin olioversio on muuten samanlainen kuin edellinen, mutta nyt VectorArrayAdapter ei peri luokkaa StringVectorModifier, vaan sisältää StringVectorModifier-olion osanaan. Muutoksia tulee siis ainoastaan luokkaan VectorArrayAdapter: // Tiedosto VectorArrayAdapter.h class VectorArrayAdapter: public StringArrayModifier { private: // Vector modifier as an attribute StringVectorModifier svmmodifier; std::string* modifyarray(std::string* array, int length); ; // Tiedosto VectorArrayAdapter.cpp std::string* VectorArrayAdapter::modifyArray(std::string* array, int length){ // Määrittele string-olioita sisältävä vector strings // Kirjoita taulukon array sisältämät merkkijonot // vectoriin strings // Muunna vectorin strings sisältö svmmodifier.modify(strings); // Luo uusi taulukko modified_table, kirjoita // vectorin strings merkkijonot siihen // ja palauta taulukko return modified_table; 9
10 2. Composite Composite- eli Rekursiokooste-mallin juuret ovat graafisten käyttöliittymäliittymäkomponenttien rakentamisessa. Komponenttien muodostamaa koostetta voidaan käyttöliittymässä käsitellä yksittäisenä komponenttina. Suunnittelumalli syntyy, kun yleistetään tilannetta: muissakin yhteyksissä tarvitaan olioiden ryhmiä, joita halutaan käsitellä kuin yksittäistä oliota. Mallin avulla voidaan luoda luokkahierarkia, jonka eräät luokat määrittelevät alkeisolioita (kuten primitiiviset käyttöliittymäkomponentit) ja toiset luokat määrittelevät yhdisteolioita, jotka koostavat alkeisolioita monimutkaisemmiksi yhdistelmiksi. Rekursiokooste-mallia käsitellään myös kurssissa Oliosuuntautunut analyysi ja suunnittelu. Suunnittelumallin tarkoitus on järjestää oliot puuhierarkioiksi, jotka kuvaavat osa-kokonaisuussuhteita. Malli tekee mahdolliseksi osien ja kokonaisuuksien yhdenmukaisen käsittelyn. Mallin luokkarakenne on kuvattu alla Kuva 3. Composite-mallin luokkakaavio. (Vrt. [Gam]) Component on sekä primitiivisten olioiden (Leaf) että yhdistelmäolioiden (Composite) kantaluokka. Kaaviosta käy ilmi, että Composite-luokka voi sisältää Component-olioita, jotka voivat nyt olla joko Leaf-luokan tai edelleen Composite-luokan olioita. 10
11 Tyypillinen mallia käyttävä oliorakenne voisi olla Kuva 4. Composite-mallin tyypillinen oliokaavio. Mallin toimijat ovat siis Component, joka määrittelee käytettävien olioiden rajapinnan. Toteuttaa oletustoiminnot kaikille luokille. Määrittelee rajapinnan lapsiluokkiensa käsittelyyn. Leaf, joka esittää primitiivisiä koosteen olioita. Leaf-olioilla ei ole lapsia. Composite, joka määrittelee toiminnot niille olioille, joilla voi olla lapsia. Toimii säiliönä lapsikomponenteille. Toteuttaa lapsien käsittelyyn liittyvät Componetrajapinnan operaatiot. Client, joka käsittelee koosteen olioita Component-rajapinnan kautta. Suunnittelumallilla on useita etuja. Sen avulla asiakasluokan koodi voidaan pitää yksinkertaisena, koska sekä yhdistelmäolioita että primitiivisiä olioita voidaan käsitellä yhdenmukaisesti. Asiakasolion ei yleensä tarvitse tietää, käsitteleekö se komponenttia vai primitiivistä oliota. Lisäksi on helppoa lisätä uusia komponentteja ohjelmaan, sillä uusien aliluokkien oliot toimivat automaattisesti entisen ohjelmakoodin kanssa. Siten asiakasolion koodia ei tarvitse muuttaa lisättäessä uusia komponenttiluokkia. Toisaalta mallin yleisyys voi aiheuttaa vaikeuksia. Joskus pitäisi rajoittaa komponentin sisältämien olioiden tyyppiä; tämän voi käytännössä toteuttaa vain ajonaikaisilla tyypintarkistuksilla. 11
12 Tarkastellaan esimerkkiä: Toteutetaan laitevarasto Composite-suunnittelumallin avulla. Varastossa voi olla erilaisia laitteita, joihin voi kuulua erilaisia osakomponentteja. Luokan kantaluokaksi laaditaan mallin mukaan seuraava abstrakti luokka: class EquipmentComponent { virtual void operation()=0; virtual void add(equipmentcomponent *component)=0; virtual void remove(equipmentcomponent *component)=0; virtual EquipmentComponent* getchild(int index)=0; virtual ~EquipmentComponent(){ ; Kaikki varastossa olevat laitteet perivät tämän luokan, myös varasto-olio itse. Huomaa, että luokan aliluokissa metodeista tulee dynaamisesti sidottavia virtual-määreen takia. Toteutetaan tässä varastoluokka, kameraluokka ja objektiiviluokka. Kameraan voi liittyä yksi tai useampia objektiiveja, objektiivi voi olla myös itsenäisenä varastossa. Objektiivit eivät voi sisältää komponentteja, joten ne ovat primitiivisiä olioita: niiden luokka vastaa mallin kuvauksen Leafluokkaa. Varastoluokka ja kameraluokka ovat Composite-tyyppisiä luokkia. Toteutetaan aluksi objektiivia kuvaava luokka: // Tiedosto Objective.h class Objective: public EquipmentComponent { private: std::string name; Objective(std::string s); ~Objective(){ void operation(); void add(equipmentcomponent *component); void remove(equipmentcomponent *component); EquipmentComponent* getchild(int index); ; // Tiedosto Objective.cpp Objective::Objective(std::string s): name(s) { void Objective::operation() { std::cout << "Objective: " << name << std::endl; void Objective::add(EquipmentComponent *component) { throw std::runtime_error("no adding in leaf"); void Objective::remove(EquipmentComponent *component){ throw std::runtime_error("no removing from leaf"); EquipmentComponent* Objective::getChild(int index) { throw std::runtime_error("no components in leaf"); 12
13 Yllä, samoin kuin jatkossa muussakin koodissa on jätetty mainitsematta käytetyt includetiedostot. Tässä tapauksessa oliolle suoritettava operaatio vain tulostaa sen nimen. Primitiivisellä oliolla ei voi olla lapsia, joten niiden käsittelymetodit heittävät poikkeuksen. Seuraavaksi kirjoitetaan kameraa kuvaava luokka, joka on Composite-tyyppinen. Siten siihen on lisättävä lapsien käsittelymetodit. // Tiedosto Camera.h class Camera : public EquipmentComponent { typedef std::vector<equipmentcomponent*> ComponentVector; private: std::string name; ComponentVector children; Camera(std::string s); ~Camera(){; ; void operation(); void add(equipmentcomponent *component); void remove(equipmentcomponent *component); EquipmentComponent* getchild(int index); // Tiedosto Camera.cpp Camera::Camera(std::string s):name(s) { void Camera::operation() { std::cout << "Camera " << name << " with objectives:" << std::endl; ComponentVector::iterator iter; for(iter = children.begin(); iter!= children.end(); iter++) { (*iter)->operation(); std::cout <<" "<<std::endl; void Camera::add(EquipmentComponent *component) { children.push_back(component); void Camera::remove(EquipmentComponent *component){ ComponentVector::iterator iter; iter = std::find(children.begin(),children.end(),component); if(iter!= children.end()){ children.erase(iter); EquipmentComponent* Camera::getChild(int index) { return children.at(index); 13
14 Komponentin lapset sijoitetaan vector-tyyppiseen kokoelmaan. Tällä kertaa operaationa on tulostaa olion nimi ja tehdä kaikille lapsiolioille niiden operaatio. Lisäämiseen ja poistamiseen käytetään vector-luokan metodeja, vectorin selaajaa ja STL-kirjaston algoritmia find. Laaditaan vielä koko varastoa kuvaava luokka (joka voisi myös olla esimerkiksi varaston kameraosasto ja voitaisiin liittää yleisempään laitevarastoon): // Tiedosto EquipmentStore.h class EquipmentStore : public EquipmentComponent { typedef std::vector<equipmentcomponent*> ComponentVector; private: ComponentVector children; EquipmentStore() { ~EquipmentStore(){ void operation(); void add(equipmentcomponent *component); void remove(equipmentcomponent *component); EquipmentComponent* getchild(int index); ; // Tiedosto EquipmentStore.cpp // Muut metodit kuten luokassa Camera void EquipmentStore::operation(){ std::cout << "Store contains following items:" << std::endl; std::cout << "*******************************************" << std::endl; ComponentVector::iterator iter; for(iter = children.begin(); iter!= children.end(); iter++) { (*iter)->operation(); std::cout << "*******************************************" << std::endl; Koodi on operation()-metodia lukuun ottamatta samanlainen kuin luokassa Camera. Lopuksi voitaisiin kirjoittaa luokkia käyttävä asiakasohjelma esimerkiksi seuraavasti: 14
15 int main() { EquipmentComponent *objective1, *objective2, *objective3, *objective4; EquipmentComponent *camera1, *camera2, *camera3; EquipmentComponent *store = new EquipmentStore(); objective1 = new Objective("Tamron "); objective2 = new Objective("Nikon 50"); objective3 = new Objective("Canon "); objective4 = new Objective("Leica 350"); camera1 = new Camera("Canon 1000"); camera2 = new Camera("Leica"); camera3 = new Camera("Nikon pocket"); store->add(camera1); store->add(camera2); store->add(camera3); store->add(objective2); camera1->add(objective1); camera1->add(objective3); camera2->add(objective4); store->operation(); camera1->remove(objective1); store->remove(camera2); store->operation(); // Tuhotaan kekodynaamiset oliot return 0; Tässä luodaan pieni kameravarasto, tulostetaan se, poistetaan yksi kamera ja yksi objektiivi. Lopuksi tulostetaan muokattu varasto. Jos edellisessä ohjelmassa yritettäisiin poistaa komponenttia objektiivista, ajauduttaisiin poikkeustilanteeseen. Koodissa näkyy kuitenkin heikkous, joka aiheutuu mallin yleisyydestä: Kameraolion komponentiksi voitaisiin vaikeuksitta lisätä varasto-olio, vaikka loogisesti se ei ole järkevää. Näin ollen ohjelmassa pitäisi rajoittaa kameran sisältämien komponenttien tyyppi objektiiviksi. Tehdään vielä lopuksi joitakin huomioita Composite-mallin toteutuksesta. Joskus on käytännöllistä pitää lapsikomponenteissa yllä viitettä niiden vanhempaan, toisin sanoen komponenttiin, joka sisältää ko. lapsikomponentin. Tällöin on kiinnitettävä huomiota siihen, että viitteet pysyvät kunnossa, kun rakenteeseen lisätään tai siitä poistetaan komponentteja. Edelleen komponenttien jakaminen voi hankaloitua, mikäli komponentilla voi olla vain yksi vanhempi. Sekä primitiiviset oliot (mallissa luokka Leaf) että alikomponentteja sisältävät komponentit (mallissa luokka Composite) perivät luokan Component. Jotta kummankin tyyppisiä komponentteja voitaisiin käsitellä mahdollisimman yhtenäisesti, tulisi Component-luokan esitellä mahdollisimman monta näiden luokkien yhteistä operaatiota. Tämä kuitenkin rikkoo tietyssä mielessä olio-ohjelmoinnin periaatetta, jonka mukaan kantaluokkaan tulisi määritellä ainoastaan kaikille aliluokille käyttökelpoisia metodeja. Monet operaatiot ovat hyödyllisiä Compositeluokissa, mutta hyödyttömiä Leaf-luokissa, esimerkiksi lapsiin liittyvät operaatiot. Yksi tapa ratkaista asia on kirjoittaa Component-luokkaan sellaiset oletustoteutukset, jotka soveltuvat Leaf- 15
16 luokille. Composite-aliluokat sen sijaan määrittelevät ne tarvittaessa uudelleen. Aiemmassa esimerkissä kantaluokan metodit on jätetty tyhjiksi ja siirretty poikkeuksen aiheuttaminen Objective-luokan metodeihin. Jos haluaa korostaa turvallisuutta käsittelyn yhtenäisyyden kustannuksella, voi siirtää lapsien käsittelymetodit kokonaan Composite-luokkiin. Komponenttien muodostamasta rakenteesta poistetaan olioita dynaamisesti. Oliot on tällöin tuhottava, etteivät ne jää kuormittamaan muistia. Kielissä, joissa ei ole toteutettu roskien keruuta (esimerkiksi C++), on jollekin toimijalle annettava vastuu muistin vapauttamisesta. Yleensä ohjelma suunnitellaan niin, että komponentti tuhoutuessaan tuhoaa myös lapsensa. Edellä Composite-tyyppiset oliot (Camera ja EquipmentStore) on kuitenkin yksinkertaisuuden vuoksi toteutettu siten, että ne eivät ole vastuussa lapsiensa tuhoamisesta, vaan oletetaan, että oliot tuhotaan muualla. Mainittakoon, että Java-kielellä toteutettaessa ominaisuudesta ei syntyisi ongelmaa, koska sen automaattinen roskien keruu vapauttaa oliot, joihin ei enää ole viitteitä. Lähteet [Gam] Gamma, Helm, Johnson, Vlissides: Design Patterns: Elements of Reusable Object- Oriented Software, Addison-Wesley 1995 [Jav] Java tutorials: Creating GUI with Swing (URL: viitattu ) 16
812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VII Suunnittelumallit Adapter ja Composite
2015 syksy 2. vsk VII Suunnittelumallit Adapter ja Composite Sisältö 1. Johdanto rakennemalleihin 2. Adapter (Sovitin) 3. Composite (Rekursiokooste) Suunnittelumallit Adapter ja Composite 2 VII.1 Johdanto
812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton
2015 syksy 2. vsk IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton Sisältö 1. Johdanto luontimalleihin 2. Proxy 3. Factory Method 4. Prototype 5. Singleton Suunnittelumallit Proxy et.
Olio-ohjelmointi Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton. 1. Proxy (Edustaja)
Olio-ohjelmointi Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton Tässä osassa tutustutaan yhteen rakennemalliin (Proxy) ja kolmeen luontimalliin (Factory Method, ) teoksen [Gam] pohjalta.
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset Harjoituksen aiheena ovat aliohjelmat ja abstraktit tietotyypit sekä olio-ohjelmointi. Tehtävät tehdään C-, C++- ja Java-kielillä.
812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VIII Suunnittelumallit Observer ja State
2015 syksy 2. vsk VIII Suunnittelumallit Observer ja State Sisältö 1. Johdanto käyttäytymismalleihin 2. Observer 3. State Suunnittelumallit Observer ja State 2 VIII.1 Johdanto käyttäytymismalleihin Päätarkoitus
Mikä yhteyssuhde on?
1 Yhteyssuhde Mikä yhteyssuhde on? Yhteyssuhde Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma 1 Mikä yhteyssuhde on? Tili - : String - : double * 1 Asiakas - hetu: String - : String
JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?
JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: http://java.sun.com/docs/books/tutorial/index.html Vesterholm, Kyppö: Java-ohjelmointi,
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat Rajapinnat Java-kieli ei tue luokkien moniperintää. Jokaisella luokalla voi olla vain yksi välitön yliluokka. Toisinaan olisi
Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä
Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Matti Luukkainen 10.12.2009 Tässä esitetty esimerkki on mukaelma ja lyhennelmä Robert Martinin kirjasta Agile and Iterative Development löytyvästä
15. Ohjelmoinnin tekniikkaa 15.1
15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Lueteltu tyyppi enum. Override-annotaatio. Geneerinen ohjelmointi. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien
812341A Olio-ohjelmointi Peruskäsitteet jatkoa
812341A Olio-ohjelmointi 2106 Peruskäsitteet jatkoa Luokkakohtaiset piirteet n Yhteisiä kaikille saman luokan olioille n Liittyvät luokkaan, eivät yksittäiseen olioon n Kaikki ko. luokan oliot voivat käyttää
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen Taulukot: Array Taulukko Javassa pitää aina perustaa (new) Yksinkertaisessa tilanteessa taulukon koko tiedetään etukäteen ja
T740103 Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010
12. Periytyminen Johdantoa Käytännössä vähänkään laajemmissa ohjelmissa joudutaan laatimaan useita luokkia, joiden pitäisi pystyä välittämään tietoa toisilleen. Ohjelmien ylläpidon kannalta olisi lisäksi
1 Tehtävän kuvaus ja analysointi
Olio-ohjelmoinnin harjoitustyön dokumentti Jyri Lehtonen (72039) Taneli Tuovinen (67160) 1 Tehtävän kuvaus ja analysointi 1.1 Tehtävänanto Tee luokka, jolla mallinnetaan sarjaan kytkettyjä kondensaattoreita.
Rajapinta (interface)
1 Rajapinta (interface) Mikä rajapinta on? Rajapinta ja siitä toteutettu luokka Monimuotoisuus ja dynaaminen sidonta Rajapinta vs periytyminen 1 Mikä rajapinta on? Rajapintoja käytetään, kun halutaan määritellä
TIE-20200 Ohjelmistojen suunnittelu
TIE-20200 Ohjelmistojen suunnittelu Luento 1: Virtuaalifunktiot, Template method 1 Yleistä asiaa Muistakaa harkkatyöilmoittautuminen 23 ryhmää (mm. lihansyöjäkirahvi), vajaita ryhmiäkin on 44 henkeä vielä
15. Ohjelmoinnin tekniikkaa 15.1
15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Geneerinen ohjelmointi. Lueteltu tyyppi enum. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien silmukoimiseen:
Metodien tekeminen Javalla
1 Metodien tekeminen Javalla Mikä metodi on? Metodin syntaksi Metodi ja sen kutsuminen Parametreista Merkkijonot ja metodi Taulukot ja metodi 1 Mikä metodi on? Metodilla toteutetaan luokkaan toiminnallisuutta.
Ohjelmointi 2 / 2010 Välikoe / 26.3
Ohjelmointi 2 / 2010 Välikoe / 26.3 Välikoe / 26.3 Vastaa neljään (4) tehtävään ja halutessa bonustehtäviin B1 ja/tai B2, (tuovat lisäpisteitä). Bonustehtävät saa tehdä vaikkei olisi tehnyt siihen tehtävään
Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();
Sisällys 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden käsittelyä: sijoitus, vertailu ja varautuminen null-arvoon. Viite metodin paluuarvona.. 7.1 7.2 Olio
Harjoitus 7. 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:
Harjoitus 7 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti: class Lintu //Kentät private int _siivenpituus; protected double _aivojenkoko; private bool _osaakolentaa; //Ominaisuudet public int
JAVA-OHJELMOINTI 3 op A274615
JAVA-OHJELMOINTI 3 op A274615 JFC & Swing, Look & Feel, Events Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: http://java.sun.com/docs/books/tutorial/index.html Vesterholm, Kyppö: Java-ohjelmointi,
Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014
Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Kirjoita jokaiseen palauttamaasi konseptiin kurssin nimi, kokeen päivämäärä, oma nimi ja opiskelijanumero. Vastaa kaikkiin tehtäviin omille konsepteilleen.
812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä
2016 IX Olioiden välisistä yhteyksistä Sisältö 1. Johdanto 2. Kytkentä 3. Koheesio 4. Näkyvyydestä 2 Johdanto n Ohjelmassa syntyy kytkentöjä olioiden välille Toivottuja ja epätoivottuja n Näkyvyys vaikuttaa
4. Luokan testaus ja käyttö olion kautta 4.1
4. Luokan testaus ja käyttö olion kautta 4.1 Olion luominen luokasta Java-kielessä olio määritellään joko luokan edustajaksi tai taulukoksi. Olio on joukko keskusmuistissa olevia tietoja. Oliota käsitellään
Poikkeusten ja tapahtumien käsittely
Poikkeusten ja tapahtumien käsittely Tässä osassa tarkastellaan poikkeusten ja tapahtumien käsittelyä. Aluksi esitellään poikkeusten käsittelyä yleisesti sekä tarkastellaan siihen liittyviä käsitteitä
1. Olio-ohjelmointi 1.1
1. Olio-ohjelmointi 1.1 Sisällys Olio-ohjelmointi on eräs ohjelmointiparadigma. Olio-ohjelmoinnin muotoja. Ohjelmiston analyysi ja suunnittelu. Olioparadigman etuja ja kritiikkiä. 1.2 Ohjelmointiparadigmoja
Olio-ohjelmointi Javalla
1 Olio-ohjelmointi Javalla Olio-ohjelmointi Luokka Attribuutit Konstruktori Olion luominen Metodit Olion kopiointi Staattinen attribuutti ja metodi Yksinkertainen ohjelmaluokka Ohjelmaluokka 1 Olio-ohjelmointi
Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance)
Sisällys JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys Periytyminen (inheritance) Näkyvyys (visibility) Eero Hyvönen Tietojenkäsittelytieteen laitos Helsingin yliopisto 13.10.2000 E. Hyvönen: Java Osa
Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki
Sisällys JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta Abstrakti luokka ja metodi Rajapintamäärittely (interface) Eero Hyvönen Tietojenkäsittelytieteen laitos Helsingin yliopisto 13.10.2000 E.
9. Periytyminen Javassa 9.1
9. Periytyminen Javassa 9.1 Sisällys Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Ilmentymämetodien korvaaminen. Luokkametodien peittäminen. Super-attribuutti. Override-annotaatio.
Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.
11. Rajapinnat 11.1 Sisällys Johdanto. Abstrakti luokka vai rajapinta? Rajapintojen hyötyjä. Kuinka rajapinnat määritellään ja otetaan käyttöön? Eläin, nisäkäs, kissa ja rajapinta. Moniperiytyminen rajapintojen
9. Periytyminen Javassa 9.1
9. Periytyminen Javassa 9.1 Sisällys Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Metodien korvaaminen ja super-attribuutti. Attribuutin peittäminen periytymisen kautta. Rakentajat
Ohjelmistotekniikan menetelmät, suunnittelumalleja
582101 - Ohjelmistotekniikan menetelmät, suunnittelumalleja 1 Suunnittelumallit (design patterns) Kuvaus sellaisesta luokkarakenteesta & olioiden vuorovaikutuksesta, joka ratkaisee tietyn yleisen ongelman
GRAAFISEN KÄYTTÖLIITTYMÄN OHJELMOINTI JAVA SWING
GRAAFISEN KÄYTTÖLIITTYMÄN OHJELMOINTI JAVA SWING Käyttöliittymäkomponentteja Sovelluksen pääikkunan luominen Rinnakkainen toiminnallisuus Miten käyttöliittymä lopetetaan? Ikkunan peruskomponentit Mihin
Pakkauksen kokoaminen
13. Pakkaukset 13.1 Sisällys Pakkauksen kokoaminen (package). Pakkaukset ja hakemistorakenne. Pakkauksen luokkien käyttö muissa pakkauksissa (import). Pakkaukset ja näkyvyys. 13.2 Pakkauksen kokoaminen
JavaRMI 1 JAVA RMI. Rinnakkaisohjelmoinnin projekti 1 osa C Tekijät: Taru Itäpelto-Hu Jaakko Nissi Mikko Ikävalko
JavaRMI 1 JAVA RMI Rinnakkaisohjelmoinnin projekti 1 osa C Tekijät: Taru Itäpelto-Hu Jaakko Nissi Mikko Ikävalko JavaRMI 2 Table of Contents...1 JAVA RMI...1 Yleistä...4 Arkkitehtuuri...5 Java RMI kerrosarkkitehtuuri...5
Olio-ohjelmointi Käyttöliittymä
Olio-ohjelmointi 2016 Käyttöliittymä n Javalla on helppo toteuttaa yksinkertainen graafinen käyttöliittymä n AWT/Swing n JFC (Java Foundation Collection) n AWT-sisältää Javan grafiikka GUI-komponmentit
5. HelloWorld-ohjelma 5.1
5. HelloWorld-ohjelma 5.1 Sisällys Lähdekoodi. Lähdekoodin (osittainen) analyysi. Lähdekoodi tekstitiedostoon. Lähdekoodin kääntäminen tavukoodiksi. Tavukoodin suorittaminen. Virheiden korjaaminen 5.2
8. Näppäimistöltä lukeminen 8.1
8. Näppäimistöltä lukeminen 8.1 Sisällys Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. In-luokka, käännös ja tulkinta Scanner-luokka. 8.2 Yleistä Näppäimistöltä annettujen arvojen (syötteiden)
Ohjelmointikielet ja -paradigmat 5op. Markus Norrena
Ohjelmointikielet ja -paradigmat 5op Markus Norrena Ko#tehtävä 4 Viimeistele "alkeellinen kuvagalleria". Käytännössä kaksi sivua Yksi jolla voi ladata kuvia palvelimelle (file upload) Toinen jolla ladattuja
Sisällys. 11. Rajapinnat. Johdanto. Johdanto
Sisällys 11. ajapinnat. bstrakti luokka vai rajapinta? ajapintojen hyötyjä. Kuinka rajapinnat määritellään ja otetaan käyttöön? Eläin, nisäkäs, kissa ja rajapinta. Moniperiytyminen rajapintojen avulla.
A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)
1(37) PERIYTYMINEN (inheritance) YLILUOKKA (superclass) ALILUOKKA (subclass) A) on käytännöllinen ohjelmointitekniikka = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys) B) on käsitteiden
14. Poikkeukset 14.1
14. Poikkeukset 14.1 Sisällys Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla poikkeuksella? Poikkeusten heittäminen.
Sisällys. 14. Poikkeukset. Johdanto. Johdanto
Sisällys 14. Poikkeukset Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla poikkeuksella? Poikkeusten heittäminen.
P e d a c o d e ohjelmointikoulutus verkossa
P e d a c o d e ohjelmointikoulutus verkossa Java-kielen perusteet Teoria ja ohjelmointitehtävät Java-kielen perusteet 3 YLEISKATSAUS KURSSIN SISÄLTÖIHIN 10 JAVA-KIELEN PERUSTEET 10 OPISKELUN ALOITTAMINEN
TIE-20200 Samuel Lahtinen. Lyhyt UML-opas. UML -pikaesittely
Lyhyt UML-opas UML -pikaesittely UML, Unified Modeling Language Standardoitu, yleiskäyttöinen mallinnuskieli, jota ylläpitää/hallitsee (Object Management Group) OMG Historiaa: 90-luvulla oli paljon kilpailevia
2. Olio-ohjelmoinista lyhyesti 2.1
2. Olio-ohjelmoinista lyhyesti 2.1 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen. 2.2 Yleistä Olio-ohjelmointia käsitellään hyvin
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet Pakkaukset ja määreet Toisiinsa liittyvät luokkatiedostot voidaan koota pakkauksiksi. Luo hierarkiaa ja järjestystä ohjelmistotuotteeseen.
Luokat ja oliot. Ville Sundberg
Luokat ja oliot Ville Sundberg 12.9.2007 Maailma on täynnä olioita Myös tietokoneohjelmat koostuvat olioista Σ Ο ω Μ ς υ φ Ϊ Φ Θ ψ Љ Є Ύ χ Й Mikä on olio? Tietokoneohjelman rakennuspalikka Oliolla on kaksi
7. Oliot ja viitteet 7.1
7. Oliot ja viitteet 7.1 Sisällys Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden sijoitus. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona. Viite metodin
Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma
1 Kompositio Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma 1 Mikä kompositio on? Tili - : String - : double 1 1 Kayttoraja
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely Poikkeukset Poikkeuksella tarkoitetaan yllättävää ajonaikaista tilannetta, joka
812347A Olio-ohjelmointi, 2015 syksy 2. vsk. V Geneerisyys
812347A Olio-ohjelmointi, 2015 syksy 2. vsk V Geneerisyys Sisältö 1. Johdanto geneerisyyteen 2. Geneeriset funktiot 3. Geneeriset luokat 4. Standard Template Library (STL) 5. IOStream-kirjasto 812347A
TIE-20200 Ohjelmistojen suunnittelu
TIE-20200 Ohjelmistojen suunnittelu Luento 1: Virtuaalifunktiot, Template method 1 Seuraavaksi tarjolla: Otekn-asiaa vähän pintaa syvemmältä Virtuaalifunktiot ja erikoistaminen, olioiden kopiointi ja elinaika
Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti
Rinnakkaisohjelmointi kurssi Opintopiiri työskentelyn raportti Opintopiiri: Heikki Karimo, Jesse Paakkari ja Keijo Karhu Päiväys: 15.12.2006 Ohjelmointitehtävä C i C i : Säikeet ja kriittisen vaiheen kontrollointi
Aalto Yliopisto T-106.2001 Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa
Aalto Yliopisto T-106.2001 Informaatioverkostot: Studio 1 Oliot ja luokat Javaohjelmoinnissa Vesa Laakso 22.9.2012 Sisällysluettelo Sisällysluettelo... 1 Johdanto... 2 1. Luokka... 2 2. Olio... 2 3. Luokan
812336A C++ -kielen perusteet, 21.8.2010
812336A C++ -kielen perusteet, 21.8.2010 1. Vastaa lyhyesti seuraaviin kysymyksiin (1p kaikista): a) Mitä tarkoittaa funktion ylikuormittaminen (overloading)? b) Mitä tarkoittaa jäsenfunktion ylimääritys
Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki
Tehtävä 1 Koherentti selitys Koherentti esimerkki ½p ½p Tehtävä 2 Täysiin pisteisiin edellytetään pelaajien tulostamista esimerkin järjestyksessä. Jos ohjelmasi tulostaa pelaajat jossain muussa järjestyksessä,
Luokkamalli LUOKKAKAAVIO. Tämän osan sisältö. Luokkamalli. Luokka ja olio. Luokkakaavio (class diagram)
4 Luokkamalli Rakenteet mittojen mukaan. Mitat rakenteen mukaan. Tämän osan sisältö Luokkakaavio luokkakaavion elementti attribuutit operaatiot määreet Olioiden väliset suhteet kytkös kooste yleistys rajapinta
Java kahdessa tunnissa. Jyry Suvilehto
Java kahdessa tunnissa Jyry Suvilehto Ohjelma Ohjelmointiasioita alkeista nippelitietoon n. 45 min Tauko 10 min Oliot, luokat ja muut kummajaiset n. 45 min Kysykää Sisältöä ei oikeasti ole 2x45 min täytteeksi,
Olio-ohjelmointi Johdanto suunnittelumalleihin. 1. Yleistä
Olio-ohjelmointi Johdanto suunnittelumalleihin Hyvin toimivan olio-ohjelmointiparadigmaa noudattavan ohjelman suunnitteleminen ei ole helppo tehtävä. On löydettävä sopiva luokkarakenne kuvaamaan ratkaistavaa
Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä
Sisällys 9. Periytyminen Javassa Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Metodien korvaaminen ja super-attribuutti. Attribuutin peittäminen periytymisen kautta. Rakentajat
on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä
LUOKAN MÄÄRITTELY Luokka, mitä se sisältää Luokan määrittely Olion ominaisuudet eli attribuutit Olion metodit Olion muodostimet ja luonti Olion tuhoutuminen Metodin kutsu luokan ulkopuolelta Olion kopioiminen
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Opintojakso TT00AA11 Ohjelmoinnin jatko (Java) Tavoite Opiskelija ymmärtää olio-ohjelmoinnin problematiikan. Opiskelija osaa määritellä ja käyttää itse
Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen
Pedacode Pikaopas Java-kehitysympäristön pystyttäminen Pikaoppaan sisältö Pikaoppaassa kuvataan, miten Windowstyöasemalle asennetaan Java-ohjelmoinnissa tarvittavat työkalut, minkälaisia konfigurointeja
Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2
6. Tiedostot 6.1 Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2 Johdanto Tiedostoja on käsitelty uudelleenohjattujen standardisyöteja tulostusvirtojen avulla. Tiedostoja voidaan
YHTEYSSUHDE (assosiation)
YHTEYSSUHDE (assosiation) -Mikä on yhteyssuhde? -Miten toteutan yhteyssuhteen? 1 Mikä on yhteyssuhde? Yhteyssuhde kuvaa kahden olion välistä suhdetta: Esim. Auto Henkilö, omistussuhde Tili Asiakas, omistussuhde
JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä 6.11.2002
JReleaser Yksikkötestaus ja JUnit Mikko Mäkelä 6.11.2002 Sisältö Johdanto yksikkötestaukseen JUnit yleisesti JUnit Framework API (TestCase, TestSuite) Testien suorittaminen eri työkaluilla Teknisiä käytäntöjä
Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004
Vertailulauseet Ehtolausekkeet Ehdot, valintalausekkeet Boolean-algebra == yhtäsuuruus!= erisuuruus < pienempi suurempi >= suurempi tai yhtäsuuri Esimerkkejä: int i=7; int j=10;
Yksikkötestaus. import org.junit.test; public class LaskinTest public void testlaskimenluonti() { Laskin laskin = new Laskin(); } }
Yksikkötestauksella tarkoitetaan lähdekoodiin kuuluvien yksittäisten osien testaamista. Termi yksikkö viittaa ohjelman pienimpiin mahdollisiin testattaviin toiminnallisuuksiin, kuten olion tarjoamiin metodeihin.
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 12.4.2010 T-106.1208 Ohjelmoinnin perusteet Y 12.4.2010 1 / 34 Graafiset käyttöliittymät Tähän asti kirjoitetuissa ohjelmissa on ollut tekstipohjainen käyttöliittymä.
Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta
C++ - perusteet Java-osaajille luento 5/7: operaattoreiden ylikuormitus, oliotaulukko, parametrien oletusarvot, komentoriviparametrit, constant, inline, Operaattoreiden ylikuormitus Operaattoreiden kuormitus
Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen
Metodit Metodien määrittely Metodin parametrit ja paluuarvo Metodien suorittaminen eli kutsuminen Metodien kuormittaminen 1 Mikä on metodi? Metodi on luokan sisällä oleva yhteenkuuluvien toimintojen kokonaisuus
Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4
Sisällys 12. Näppäimistöltä lukeminen Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä.. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit. Scanner-luokka.
Vesisika. metsiemme työmyyrä. http://www.billybear4kids.com/animal/whose-toes/capybara.jpg
Vesisika metsiemme työmyyrä http://www.billybear4kids.com/animal/whose-toes/capybara.jpg Faktat Vesisika tykkää vedestä ja näyttää (ja kuulemma maistuu) hieman sialta. Käyttää myös nickiä kapybara. kapiÿva
1. Omat operaatiot 1.1
1. Omat operaatiot 1.1 Sisällys Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma
Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2
26. Tiedostot 26.1 Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2 Johdanto Tiedostoja on käsitelty uudelleenohjattujen standardisyöte- ja tulostusvirtojen avulla. Tiedostoja
C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi
1 C++11 Syntaksi Jari-Pekka Voutilainen 13.4.2012 2 Range-for Iteroi säiliön kaikki alkiot for-silmukassa. Säiliöltä vaaditaan begin- ja end-iteraattorit. Pätee kaikille C++11 STL-säiliöille, taulukoille,
Kertaus: yleistys-erikoistus ja perintä
Kertaus: yleistys-erikoistus ja perintä Nauta, Lehmä ja Kuttu ovat Kotieläimiä, Kotieläimet Eläimiä Kotieläimillä (siis myös Naudoilla, Lehmillä ja Kutuilla) on Omistaja Kuttu ja Lehmä toteuttavat rajapinnan
14. Poikkeukset 14.1
14. Poikkeukset 14.1 Sisällys Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Miten varautua poikkeukseen metodissa? Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla
Sisällys. 14. Poikkeukset. Johdanto. Johdanto
Sisällys 14. Poikkeukset Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Miten varautua poikkeukseen metodissa? Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla
Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä
Sisällys 9. Periytyminen Javassa Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Metodien korvaaminen ja super-attribuutti. Attribuutin peittäminen periytymisen kautta. Rakentajat
Javan perusteita. Janne Käki
Javan perusteita Janne Käki 20.9.2006 Muutama perusasia Tietokone tekee juuri (ja vain) sen, mitä käsketään. Tietokone ymmärtää vain syntaksia (sanojen kirjoitusasua), ei semantiikkaa (sanojen merkitystä).
19/20: Ikkuna olio-ohjelmoinnin maailmaan
Ohjelmointi 1 / syksy 2007 19/20: Ikkuna olio-ohjelmoinnin maailmaan Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007
Poikkeustenkäsittely
1 Poikkeustenkäsittely Mitä poikkeustenkäsittely tarkoittaa? Poikkeuksen käsitteleminen Poikkeusluokkien hierarkia Poikkeuksen heittäminen 1 Mitä poikkeustenkäsittely tarkoittaa? Poikkeus (Exception) on
16. Javan omat luokat 16.1
16. Javan omat luokat 16.1 Sisällys Johdanto. Object-luokka: tostring-, equals-, clone- ja getclass-metodit. Comparable-rajapinta: compareto-metodi. Vector- ja ArrayList-luokat. 16.2 Javan omat luokat
Oliosuunnittelu. Oliosuunnittelu
Oliosuunnittelu Perinnän ja dynaamisen sidonnan hyödyntäminen Tarkastellaan ohjelmaa, jonka tehtävänä on tuottaa erilaisista kuvioista muodostuva kuvaesitys Ratkaisu 1: perinteinen malli - ei perintää
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Tietorakenneluokkia 2: HashMap, TreeMap Tietorakenneluokkia ja -rajapintoja Java tarjoaa laajan kokoelman tietorakennerajapintoja ja - luokkia. Aiemmin
Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2
6. Tiedostot 6.1 Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2 Johdanto Tiedostoja on käsitelty uudelleenohjattujen standardisyöte- ja tulostusvirtojen avulla. Tiedostoja voidaan
Olio-ohjelmointi Syntaksikokoelma
C++-kielen uusia ominaisuuksia Olio-ohjelmointi Syntaksikokoelma 31.10.2008 Bool-tietotyyppi: Totuusarvo true (1), jos ehto on tosi ja false (0) jos ehto epätosi. Dynaaminen muistinvaraus: Yhden muuttuja
Graafinen käyttöliittymä, osa 1
Graafinen käyttöliittymä, osa 1 Idea, MVC-malli ja ensimmäinen ohjelma Graafinen käyttöliittymä Ensimmäisen kerran tavoitteena on oppia graafisen ohjelman perusidea sekä oppia laatimaan esimerkin mukaan
8. Näppäimistöltä lukeminen 8.1
8. Näppäimistöltä lukeminen 8.1 Sisällys Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. In-luokka, käännös ja tulkinta Scanner-luokka. 8.2 Yleistä Näppäimistöltä annettujen arvojen (syötteiden)
Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3
16. Lohkot 16.1 Sisällys Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 16.2 Lohkot Kaarisulut
Ohjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 11: Olioiden toteuttaminen Riku Saikkonen 28. 11. 2011 Sisältö 1 Miten oliot ja metodikutsut toimivat? 2 Oliot Minkä luokan metodia kutsutaan? Python-esimerkki
Graafisen käyttöliittymän ohjelmointi Syksy 2013
TIE-11300 Tietotekniikan vaihtuva-alainen kurssi Graafisen käyttöliittymän ohjelmointi Syksy 2013 Luento 10 Rinnakkaisuus käyttöliittymäohjelmoinnissa Juha-Matti Vanhatupa Rinnakkaisuus ja käyttöliittymäohjelmointi
5. HelloWorld-ohjelma 5.1
5. HelloWorld-ohjelma 5.1 Sisällys Lähdekoodi. Lähdekoodin (osittainen) analyysi. Lähdekoodi tekstitiedostoon. Lähdekoodin kääntäminen tavukoodiksi. Tavukoodin suorittaminen. Virheiden korjaaminen 5.2
Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.
2. Taulukot 2.1 Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.2 Yleistä
Operaattorin ylikuormitus ja käyttäjän muunnokset
13 Operaattorin ylikuormitus ja käyttäjän muunnokset Luvussa 7, "Ominaisuudet, taulukot ja indeksoijat," opit, miten luokan yhteydessä käytetään ohjelmallisesti []-operaattoria, jolloin objektia voidaan
Listarakenne (ArrayList-luokka)
Listarakenne (ArrayList-luokka) Mikä on lista? Listan määrittely ArrayList-luokan metodeita Listan läpikäynti Listan läpikäynti indeksin avulla Listan läpikäynti iteraattorin avulla Listaan lisääminen