Osa I. Pohjan luominen. Copyright IT Press Tämän e-kirjan kopiointi, tulostaminen ja jakeleminen eteenpäin luvatta on kielletty.
|
|
- Anne Hämäläinen
- 9 vuotta sitten
- Katselukertoja:
Transkriptio
1 Osa I Pohjan luominen
2
3 1 Olioperusteisen ohjelmoinnin teoria Tämän luvun päätavoite on käydä läpi olioperusteisen ohjelmoinnin (OOP:n) käsitteet ja antaa sinulle käsitys siitä, miten merkityksellinen oliperusteinen menetelmä ohjelmoinnissa on. Monen ohjelmointikielen, kuten C++:n ja Microsoft Visual Basicin, sanotaan tukevan objekteja, mutta harvat ohjelmointikielet tosiasiassa tukevat kaikkia olioperusteiseen ohjelmointiin liittyviä käsitteitä. C# on yksi näistä kielistä: se on suunniteltu perusteista lähtien täysin olioperusteiseksi, komponenttipohjaiseksi kieleksi. Eli, jotta saisit tästä kirjasta mahdollisimman paljon irti, tarvitset tässä luvussa esitettävän tukevan pohjan olioperusteisesta ohjelmointitekniikasta. Tiedän, että tämän tapaisen teoreettisen luvun jättävät usein väliin ne lukijat, jotka haluavat sukeltaa suoraan koodiin, mutta jos et pidä itseäsi olioguruna, suosittelen tämän luvun lukemista. Ne teistä, jotka tuntevat jonkin verran olioperusteista ohjelmointia, saavat tästä luvusta hyvän kertauksen. Pidä myös mielessä, että seuraavat luvut tulevat käyttämään tässä esitettyjä termejä ja käsitteitä. Kuten sanoin, monet ohjelmointikielet väittävät olevansa oliokieliä tai olioperusteisia kieliä, mutta harvat todella ovat. C++ ei ole sen vastaansanomattoman tosiasian takia, että sen juuret ovat syvällä upoksissa C-kieleen. Liian monet OOP:n periaatteista on uhrattu, jotta vanha C-koodin tuki säilyisi. Jopa Javalla, niin hyvä kuin se onkin, on joitakin rajoituksia olioperusteisena kielenä. Viittaan erityisesti siihen tosiasiaan, että Javassa sinulla on perustyyppejä (primitive types) ja objektityyppejä (object types), joita käsitellään ja jotka 3
4 Osa I Pohjan luominen käyttäytyvät hyvin erilaisesti. Tämän luvun päämäärä ei ole kuitenkaan eri ohjelmoinkielten vertailu olio-ominaisuuksien määrän ja puhtauden perusteella. Sen sijaan tässä luvussa esitetään objektiiviset ja kielistä riippumattomat OOP:n pääperiaatteet. Ennen kuin jatkamme, haluan sanoa, että olioperusteinen ohjelmointi on paljon enemmän kuin markkinointitermi (vaikka siitä on joillekin tullut sellainen), uusi syntaksi tai uusi sovelluksen ohjelmointirajapinta (API). Olioperusteinen ohjelmointi on täydellinen joukko käsitteitä ja ajatuksia. Se on erilainen tapa ajatella tietokoneohjelman avulla ratkaistavaa ongelmaa ja ratkaista se luonnollisemmalla ja siksi myös tuotteliaammalla tavalla. Ensimmäisessä työpaikassani käytin Pascal-kieltä tehdessäni lipunmyynti- ja matkasuunnitteluohjelman Holiday On Ice -kiertueelle. Kun siirryin muihin tehtäviin ja muihin sovelluksiin, tein ohjelmia PL/1:llä ja RPG III:lla (ja RPG/400:lla). Muutaman vuoden kuluttua aloin tekemään sovelluksia C-kielellä. Kussakin tilanteessa oli helppoa soveltaa edellisissä tehtävissä saatua kokemusta. Kunkin uuden ohjelmointikielen oppimiskäyrä oli lyhyempi riippumatta kielen monimutkaisuudesta. Tämä johtui siitä, että siihen asti, kun aloitin ohjelmoinnin C++:lla, olivat kaikki kielet olleet proseduraalisia kieliä ja siten eronneet toisistaan pääasiassa vain rakenteensa puolesta. Jos kuitenkaan et ole aiemmin ohjelmoinut oliperusteisesti, ota huomioon: aiempi proseduraalisen ohjelmointikielen tuntemus ei auta sinua nyt! Olioperusteinen ohjelmointi on erilainen tapa ajatella miten ongelman ratkaisu suunnitellaan ja toteutetaan. Itse asiassa tutkimukset ovat osoittaneet, että sellaiset henkilöt, jotka eivät ole aiemmin ohjelmoineet, oppivat olioperusteisen ohjelmoinnin paljon nopeammin kuin jotain BASICin, COBOLin tai C:n tapaista proseduraalista kieltä osaavat. Tällaisten henkilöiden ei tarvitse unohtaa sellaisia proseduraalisen ohjelmoinnin huonoja tapoja, jotka hidastavat OOP-ymmärrystä. He aloittavat puhtaalta pöydältä. Jos olet ohjelmoinut vuosia proseduraalisella kielellä ja C# on ensimmäinen olioperusteinen kielesi, paras neuvoni sinulle on, että pidät mielesi avoimena ja sulattelet kirjassa antamani ajaukset ennen kuin nostat kätesi ylös ja sanot Voin tekaista tämän hetkessä [lisää tähän oman proseduraalisen suosikkikielesi nimi]. Jokainen, joka on tullut proseduraalisesta maailmasta oliperusteiseen, on käynyt läpi tämän oppimiskäyrän ja se on ollut vaivan arvoista. Olioperusteisen ohjelmoinnin edut ovat huomattavat sekä tehokkaamman koodin kirjoittamisen kannalta että helposti muokattavan ja laajennettavan valmiin sovelluksen kannalta. Saattaa tosin olla, että edut eivät näy hetkessä. Kuitenkin lähes 20 vuoden ohjelmointiura (johon sisältyy viimeiset 8 vuotta oliperusteista ohjelmointia), on osoittanut minulle, että OOP-periaatteet, kun niitä sovelletaan oikein, täyttävät lupauksensa. Pitemmittä puheitta kääritään hihat ja ryhdytään tutkimaan, mistä tässä kaikessa oikeastaan on kysymys. 4
5 Olioperusteisen ohjelmoinnin teoria Luku 1 Kaikki ovat objekteja Todellisessa olioperusteisessa kielessä kaikki ongelman piiriin kuuluvat käsitteet esitetään objekteina. (Käytän tässä kirjassa Coad/Yourdonin määritelmää ongelman piirille. Määritys kuuluu suunnilleen näin: Ongelman piiri on se ongelma, jota yrität ratkaista täysin määriteltynä eli huomioiden sen monimutkaisuus, käsitteet, haasteet ja niin edelleen.) Kuten ehkä arvaatkin, objekti on keskeinen olioperusteisen ohjelmoinnin käsite. Useimmat meistä eivät kuljeksi ympäriinsä ajatellen sellaisin käsittein kuin tietue, datapaketti, funktiokutsu tai osoitin; sen sijaan me yleensä ajattelemme objektikäsittein. Katsotaanpa esimerkkiä. Jos kirjoitat laskutussovellusta ja sinun pitää kirjata laskun yksittäiset rivit, niin kumpi seuraavista ajatusmalleista olisi ymmärrettävämpi asiakkaan kannalta katsottuna? Perinteinen ajatusmalli Minun pitää hakea laskun otsikkoa esittävä tietorakenne. Siihen kuuluu kaksisuuntainen laskurivin tietorakenteen sisältävä linkitetty lista, joihin sisältyy rivin summa. Siksi, jotta saisin laskun loppusumman selville, minun pitää määritellä vaikkapa totalinvoiceamountniminen muuttuja ja antaa sen alkuarvoksi 0, hakea osoitin laskun otsikkorakenteeseen, hakea laskurivien linkitetyn listan pää ja sen jälkeen käydä laskurivit läpi. Kunkin laskurin kohdalla haen sen jäsenmuuttujasta rivin summan ja lisään sen totalinvoiceamount-muuttujaan. Olioperusteinen ajatusmalli Minulla on lasku-objekti. Lähetän viestin sille pyytäen kokonaisummaa. Minun ei tarvitse ajatella, miten tiedot objektin sisällä on tallennettu, kuten perinteisessä ajatusmallissa pitää tehdä. Käsittelen objektiä yksinkertaisen luonnollisesti, pyytäen siltä erilaisia asioita lähettämällä sille viestejä. (Sitä joukkoa viestejä, joita objekti voi käsitellä, kutsutaan kokonaisuutena objektin rajapinnaksi. Seuraavassa kappaleessa selitän, miksi oliperusteisessa ajatustavassa on parempi ajatella rajapintaa kuin toteutusta, kuten olen tässä tehnyt) Oliperusteinen ajatustapa on selvästikin intuitiivisempi ja lähempänä sitä mallia, jota useimmat meistä käyttävät ongelmaa ratkaistessaan. Toisessa ratkaisussa laskuobjekti luultavasti käy läpi kokoelman laskuriviobjekteja, lähettäen kullekin niistä viestin ja pyytäen rivin summaa. Jos kuitenkin haluat tietää kokonaissumman, sinua ei kiinnosta miten se saadaan selville. Et välitä siitä, koska yksi oliperusteisen ohjelmonnin peruspilari on kapselointi 5
6 Osa I Pohjan luominen (encapsulation) eli objektin mahdollisuus piilottaa sisäiset tietonsa ja metodinsa ja esittää rajapinta, jonka avulla objektin tärkeitä osia voidaan ohjelmallisesti käsitellä. Se, miten objekti sisäisesti tehtävänsä tekee, ei ole tärkeää niin kauan, kuin se pystyy tehtävänsä tekemään. Sinulle on kerrottu objektin rajapinta ja käytät tuota rajapintaa saadaksesi objektin tekemään haluamasi asiat puolestasi. (Selitän myöhemmin tässä luvussa tarkemmin kapseloinnin ja rajapinnan käsitteet.) Ajatuksen ydin tässä on se, että ohjelmat, jotka on tehty olioperusteisesti ongelman piirissä olevia todellisia objekteja vastaavasti, ovat helpommin suunniteltavia ja toteutettavia, koska voimme ajatella niiden toimintaa luonnollisella tavalla. Huomaa, että toinen ajatusmalli vaatii objektin, joka tekee työn puolestamme eli laskee rivien kokonaisumman. Objekti ei sisällä pelkästään tietoja kuten tietueet tekevät. Määritelmän mukaan objektit koostuvat tiedoista ja noita tietoja käsittelevistä metodeista. Tämä tarkoittaa, että kun työskennellään ongelman kimpussa, voimme tehdä enemmän kuin pelkästään miettiä tietorakenteen. Voimme myös miettiä, mitä metodeja kuhunkin objektiin tulee liittää niin, että siitä tulee tietojen suhteen täysin kapseloitu, sisältäen vain joukon toimintoja eli metodeja. Seuraava esimerkki ja tulevien kappaleiden esimerkit selventävät tätä ajatusmallia. Huomaa Tämän luvun koodiesimerkit esittelevät olioperusteisen ohjelmoinnin periaatteita. Vaikka monet koodipätkät onkin tehty C#:lla, pidä mielessä, että periaatteet sinänsä ovat yleisiä OOP:n periaatteita eivät minkään erityisen kielen ominaisuuksia. Vertailun vuoksi näytän tässä luvussa esimerkit myös toteutettuna C-kielellä, joka ei ole olioperusteinen kieli. Oletetaan, että teet sovellusta, joka laskee uuden yhtiösi ainoa työnekijän Amyn palkan. C-kielellä tekisit jotain seuraavanlaista liittäen työntekijään määrätyn tietotyypin: struct EMPLOYEE char szfirstname[25]; char szlastname[25]; ; int iage; double dpayrate; 6
7 Olioperusteisen ohjelmoinnin teoria Luku 1 Näin lasket Amyn palkan käyttäen EMPLOYEE-tietuetta: void main() double dtotalpay; struct EMPLOYEE* pemp; pemp = (struct EMPLOYEE*)malloc(sizeof(struct EMPLOYEE)); if (pemp) pemp->dpayrate = 100; strcpy(pemp->szfirstname, Amy ); strcpy(pemp->szlastname, Anderson ); pemp->iage = 28; dtotalpay = pemp->dpayrate * 40; printf( Total Payment for %s %s is %0.2f", pemp->szfirstname, pemp->szlastname, dtotalpay); free(pemp); Tässä esimerkissä koodi perustuu tietueessa oleviin tietoihin ja ulkoiseen (tietueen kannalta) koodiin, joka käyttää tietuetta. Eli missä on ongelma? Suurin ongelma on abstraktiossa: EMPLOYEE-tietueen käyttäjän pitää tietää aivan liian paljon työntekijän tiedoista. Miksi? Sanotaan, että myöhemmin haluat muuttaa tapaa, jolla Amyn palkka lasketaan. Haluat esimerkiksi ottaa huomioon erilaiset vakuutusmaksut, jotta saat laskettua maksettavan nettopalkan. Et pelkästään joudu muuttamaan koodia, joka käsittelee EMPLOYEE-tietuetta vaan sinun pitää myös dokumentoida (yrityksesi muita koodaajia varten) se tosiasia, että on tapahtunut muutoksia sen käytössä. Katsotaan nyt tämän esimerkin C#-versioita: using System; class Employee public Employee(string firstname, string lastname, int age, double payrate) this.firstname = firstname; this.lastname = lastname; this.age = age; this.payrate = payrate; (jatkuu) 7
8 Osa I Pohjan luominen protected string firstname; protected string lastname; protected int age; protected double payrate; public double CalculatePay(int hoursworked) // Calculate pay here. return (payrate * (double)hoursworked); class EmployeeApp public static void Main() Employee emp = new Employee ( Amy", Anderson", 28, 100); Console.WriteLine( \namy s pay is $ + emp.calculatepay(40)); EmployeeApp-esimerkin C#-versiossa voi objektin käyttäjä yksinkertaisesti kutsua objektin CalculatePay-metodia, jolloin objekti laskee oman palkkansa. Tämän mallin etu on siinä, että käyttäjän ei enää tarvitse huolehtia siitä, miten palkan laskenta täsmällisesti suoritetaan. Jos joskus tulevaisuudessa päätät muokata palkan laskentatapaa, muutoksella ei ole vaikutusta olemassa olevaan koodiin. Abstraktion taso on yksi objektien käytön suurimmista eduista. Yksi asiallinen kommentti tässä vaiheessa on se, että voit abstraktoida C-koodin luomalla funktion, joka käsittelee EMPLOYEE-tietuetta. Kuitenkin se tosiasia, että minun pitää luoda tämä funktio täysin erillään tietueesta, jota se käsittelee, on tarkkaan ottaen ongelma. Kun käytät C#:n tapaista olioperusteista kieltä, objektin tiedot ja metodit, jotka sitä käsittelevät (sen rajapinta) ovat aina yhdessä. Pidä mielessä, että objektin metodit käsittelevät objektin muuttujia. Kuten näet edellä olevassa esimerkissä, kukin Employee-jäsenmuuttuja on määritelty käsittelymääreellä protected lukuunottamatta CalculatePay-metodia, joka on määritelty sanalla public. Käsittelymääreitä käytetään määrittämään taso, jolla periytetyt luokat ja asiakasohjelman koodi voivat käsitellä jäsenmuuttujia. protected-määre tarkoittaa, että periytetty luokka voi käsitellä sitä, mutta asiakasohjelma ei. public-määre tekee muuttujasta käsiteltävän sekä periytetyssä luokassa että asiakasohjemassa. Puhun näistä määreistä tarkemmin luvussa 5, Luokat, mutta oleellinen asia muistaa on se, että käsittelymääreiden avulla voit suojata luokkasi jäsenmuuttujia virheelliseltä käytöltä. 8
9 Olioperusteisen ohjelmoinnin teoria Luku 1 Objektit ja luokat Instantiointi Termien luokka ja objekti välinen ero aiheuttaa yleensä väärinkäsityksia niille, jota eivät ole aiemmin tutustuneet olioperusteiseen ohjelmointiin. Selventääksemme näiden termien välistä eroa, tehdään EmloyeeApp-sovelluksesta totuudenmukaisempi olettamalla, että yhtiössämme on useampia työntekijöitä. C-kielellä voisimme määritellä työntekijätaulukon, joka sisältäisi EMPLOYEEtietueita ja jatkaa siitä. Koska emme tiedä, montako työntekijää yhtiöllämme joskus tulee olemaan, voimme luoda taulukon kiinteällä elementtien määrällä, esimerkiksi 10000:lla. Koska yhtiöllä kuitenkin tällä hetkellä on palkkalistoillaan vain Amy, sellainen taulukko olisi resurssien tuhlausta. Sen sijaan voisimme luoda EMPLOYEE-tietueista linkitetyn listan ja dynaamisesti varata tarpeen mukaan tilaa sovelluksessa. Ajatukseni on se, että tässä teemme juuri sitä, mitä meidän ei pitäisi. Kulutamme ajatusenergiaa miettimällä ohjemointikieltä ja konetta (kun mietimme miten paljon muistia varataan ja koska), sen sijaan, että keskittyisimme varsinaiseen ongelmaan. Objekteja käyttämällä voimme keskittyä ongelmamme ratkaisevaan liiketoimintalogiikkaan laitteiston sijaan. On monia tapoja määritellä luokka ja erottaa se objektista. Voit ajatella luokkaa yksinkertaisena tyyppinä (kuten char, int tai long), johon on liitetty metodeja. Objekti on tyypin tai luokan instanssi. Pidän kuitenkin itse eniten seuraavasta määritelmästä: luokka on objektin suunnitelma. Sinä ohjelmoijana teet tämän suunnitelman aivan kuten insinööri tekee talon suunnitelman. Kun suunnitelma on valmis, sinulla on vain yksi suunnitelma kustakin talotyypistä. Suunnitelman voi kuitenkin hankkia vaikka kuinka monta ihmistä ja rakentaa samanlaisen talon. Saman periaatteen mukaan luokka on suunnitelma määrätystä joukosta toimintoja ja tuon luokan perusteella luotu objekti sisältää nuo toiminnot. Olioperusteiselle ohjelmoinnille tyypillinen termi on instantiointi (instantiation, luominen). Se tarkoittaa instanssin luomista luokasta. Luotu instanssi on objekti. Seuraavassa esimerkissa teemme luokan eli määrittelyn objektille. Toisin sanoen, esimerkissä ei varata muistia, koska meillä on olemassa vasta objektin piirustus, ei vielä itse objektia. class Employee public Employee(string firstname, string lastname, int age, double payrate) (jatkuu) 9
10 Osa I Pohjan luominen this.firstname = firstname; this.lastname = lastname; this.age = age; this.payrate = payrate; protected string firstname; protected string lastname; protected int age; protected double payrate; public double CalculatePay(int hoursworked) // Palkka lasketaan tässä. return (payrate * (double)hoursworked); Jotta saisimme instantioitua tämän luokan ja käytettyä sitä, meidän tulee määritellä sen instanssi seuraavanlaisella metodilla: public static void Main() Employee emp = new Employee ( Amy", Anderson", 28, 100); Tässä esimerkissä emp määritellään olevan tyyppiä Employee ja se instantioidaan operaattorilla new. Muuttuja emp esittää Employee-luokan instanssia ja sitä käsitellään Employeeobjektina. Instantioinnin jälkeen voimme käsitellä objektia sen julkisten jäsenten kautta. Voimme esimerkiksi kutsua emp-objektin CalculatePay-metodia. Emme voisi tehdä sitä, jos meillä ei olisi todellista objektia. (Tähän on yksi poikkeus ja se liittyy staattisiin jäsenmuuttujiin. Kerron staattisista jäsenmuuttujista sekä luvussa 5 että luvussa 6, Metodit ) Katsotaan seuraavaa C#-koodia: public static void Main() Employee emp = new Employee(); Employee emp2 = new Employee(); Tässä meillä on samasta Employee-luokasta kaksi instanssia (emp and emp2). Vaikka ohjelmallisesti kummallakin objektilla on samat ominaisuudet, kumpikin instanssi sisältää omat tietonsa ja niitä voidaan käsitellä erikseen. Saman periaatteen mukaan voimme luoda näitä Employee-objekteja kokonaisen taulukon tai kokoelman. Luvussa 7, Ominaisuudet, taulukot ja indeksoijat, puhumme lisää taulukoista. Seikka, jonka haluan tässä esittää, on 10
11 Olioperusteisen ohjelmoinnin teoria Luku 1 se, että useimmat olioperusteiset kielet tukevat mahdollisuutta määritellä objektitaulukko. Siten voit helposti ryhmitellä objektit ja käydä ne läpi kutsumalla objektitaulukon metodeja tai käsittelemällä taulukkoa. Vertaa tätä työhön, joka sinun pitää tehdä linkitetyn listan kanssa, jossa sinun pitää itse liittää sen kukin jäsen edellä ja jäljessä tulevaan jäseneen. Olioperusteisen ohjelmointikielen kolme perusominaisuutta Kapselointi C++-kielen kehittäjän Bjarne Stroustrupin mukaan ohjelmointikieli voi kutsua itseään olioperusteiseksi, jos se tukee kolmea periaatetta: objekteja, luokkia ja periytymistä. Olioperusteiseksi kieleksi katsotaan kuitenkin nykyään yleisesti kielet, jotka tukevat seuraavia kolmea asiaa: kapselointia, periytymistä ja monimuotoisuutta (encapsulation, inheritance ja polymorphism). Syy tälläiseen ajatustavan muutoksen on se, että vuosien aikana olemme ymmärtäneet, että kapselointi ja monimuotoisuus ovat yhtä olennaisia osia olioperusteisissa järjestelmissä kuin luokka ja periytyminen. Kuten aiemmin mainitsin, kapselointi, jota joskus kutsutaan myös termillä informaation kätkentä, on objektin ominaisuus, jolla voit kätkeä sen sisäisen olemuksen ja tarjota rajapinnassa vain ne jäsenet, jotka haluat antaa asiakasohjelman käyttöön. Puhuin kuitenkin samassa yhteydessä myös abstraktiosta, joten tässä kappaleessa selvennän näiden kahden samantyyppisen asian eroa. Kapselointi tarjoaa muurin luokan ulkoisen rajapinnan (eli niiden julkisten jäsenten, jotka näkyvät luokan käyttäjälle) ja sen sisäisen toteutuksen yksityiskohtien välille. Kapseloinnin etu luokan ohjelmoijan kannalta on se, että hän voi tehdä näkyväksi luokan jäsenen, joka voi jäädä staattiseksi tai muuttumattomaksi samalla kun piilottaa dynaamisemman ja muuttuvan sisäisen toiminnan. Kuten näit aiemmin tässä luvussa, kapselointi toteutetaan C#:ssa liittämällä kuhunkin luokan jäseneen käsittelymääre (public, private tai protected). Abstraktioiden suunnittelu Abstraktio viittaa siihen, miten annettu ongelma esitetään ohjelmassa. Ohjelmointikielet sinällään tarjoavat abstraktion. Ajattele asiaa näin: Milloin jouduit viimeksi huolehtimaan prosessorin rekistereistä ja pinosta? Vaikka olisit alunperin opetellut ohjelmoimaan assemblerilla, lyön vetoa, että siitä on todella kauan, kuin jouduit ajattelemaan sellaisia alhaisen tason konekohtaisia ominaisuuksia. Syy on se, että useimmat ohjelmointikielet abstraktoivat eli piilottavat sinulta nuo yksityiskohdat, jotta voit keskittyä varsinaiseen ongelmaan. 11
12 Osa I Pohjan luominen Olioperusteiset ohjelmointikielet antavat sinun määritellä luokkia, joiden nimet ja rajapinnat muistuttavat todellisia ongelman käsitteitä siten, että objektien käyttäminen antaa ongelmiin luonnollisemman tuntuman. Tuloksena siitä, että poistetaan ne osat, jotka eivät suoraan liity ratkaistavaan ongelmaan, on se, että pystyt keskittymään todelliseen ongelmaan ja tuottavuus nousee. Itse asiassa, mukaillen Bruce Eckeliä väitettä, jonka hän esitti kirjassaan Thinking in Java (Prentice Hall Computer Books, 2000), kyky ratkaista useimmat ongelmat on suoraan verrannollinen käytetyn abstraktion laatuun. Se on kuitenkin vain yksi abstraktion taso. Mene askel pidemmälle, koska luokan suunnittelijana sinun pitää miettiä, miten voit parhaiten suunnitella sellaisen abstraktion luokkasi käyttäjälle, joka mahdollistaa käyttäjän keskittymisen oleelliseen eikä juuttuvan luokan toimintaan liittyviin yksityiskohtiin. Tässä vaiheessa hyvä kysymys on Miten luokan rajapinta liittyy abstraktioon? Luokan rajapinta on abstraktion toteutus. Käytän ohjelmointikursseilta tuttua esimerkkiä auttaakseni kirkastamaan nämä kaksi käsitettä: juoma-automaatin sisäinen toiminta. Juoma-automaatin sisäinen toiminta on melko mutkikas. Toimiakseen kunnolla sen tulee hyväksyä kolikot ja rahakkeet, palauttaa vaihtorahat ja antaa valittu tuote. Juoma-automaatilla on kuitenkin rajattu joukko toimintoja, joita sen tulee tarjota käyttäjilleen. Tämä rajapinta on toteutettu kolikkoaukolla, valintapainikkeilla, vaihtorahojen pyyntövivulla, vaihtorahakaukalolla ja napilla, joka sylkee valitun tuotteen ulos. Kukin näistä osista esittää osaa koneen rajapinnassa. Juomaautomaatti on pysynyt suurin piirtein samanlaisena keksimisestään asti. Syy on se, että huolimatta sisäisestä muutoksesta tekniikan kehityksen myötä, ei sen perusrajapintaa ole tarvinnut juuri muuttaa. Oleellinen osa luokan rajapinnan suunnittelussa on ongelman kokonaisvaltainen ymmärtäminen. Tämän ymmärryksen myötä kykenet suunnittelemaan rajapinnan, joka antaa käyttäjälle ne tiedot ja toiminnot, jotka hän tarvitsee, mutta erottaa hänet luokan sisäisestä toiminnasta. Sinun pitää suunnitella rajapinta, ei pelkästään ratkaisemaan nykyiset ongelmat, vaan myös abstraktoimaan luokan sisäisen toiminnan niin, että yksityiset luokan jäsenet voivat käydä läpi rajattomasti muutoksia ilman, että se vaikuttaa olemassa olevaan koodiin. Toinen yhtä tärkeä asia luokan abstraktion suunnittelussa on pitää kaiken aikaa mielessä asiakasohjelma. Kuvittele, että olet tekemässä yleistä tietokantamoottoria. Jos olet tietokantaguru, tunnet varmaan hyvin sellaiset termit kuin cursor, commitment control ja tuples. Kuitenkin useimmat ohjelmoijat, jotka eivät ole tehneet paljoa tietokantaohjelmointia, eivät välttämättä tunne näitä termejä. Käyttämällä termejä, jotka ovat luokkasi käyttäjille outoja, olet unohtanut koko abstraktion tarkoituksen, eli lisätä ohjelmoijan tuottavuutta esittämällä ongelma luonnollisilla termeillä. 12
13 Olioperusteisen ohjelmoinnin teoria Luku 1 Toinen esimerkki tilanteesta, jossa asiakasohjelma kannattaa pitää mielessä, on sen määrittäminen, mitkä luokan jäsenistä tulee olla yleisesti käytettäviä. Tässäkin auttaa itse ongelman ymmärtäminen. Tietokantamoottoriesimerkissämme et luultavasti halua asiakasohjelmien käsittelevän suoraan jäseniä, jotka edustavat sisäisiä tietopuskureita. Näiden puskurien ohjelmointi voi helposti tulevaisuudessa muuttua. Koska puskurit ovat myös oleellisen tärkeitä moottorisi kokonaistoiminnan kannalta, haluat ilman muuta varmistaa, että niitä käsitellään vain metodiesi kautta. Tällä tavalla voit varmistaa, että niitä käsitellään huolellisesti. Huomaa Saatat kuvitella, että olioperusteiset järjestelmät on suunniteltu pääasiassa luokkien helpon luonnin näkökulmasta. Vaikka tällainen periaate toisikin lyhyellä tähtäimellä hyviä tuloksia, kestäviä etuja saavutetaan vasta, kun ymmärretään, että tärkeintä on luokan asiakasohjelmien ohjelmoinnin helpottaminen. Pidä aina luokkia suunnitellesasi mielessäsi ohjelmoija, joka instantioi tai periyttää niitä. Hyvän abstraktion edut Luokkien abstraktion suunnittelu niin, että siitä on mahdollisimman paljon hyötyä niitä käyttäville ohjelmoijille, on ensiarvoisen tärkeää uudelleenkäytön kannalta. Jos pystyt tekemään vakaan ja staattisen rajapinnan, joka säilyy toteutuksen muutoksissakin, niin sovelluksesi tarvitsee aikojen kuluessa vähän muutoksia. Ajatellaanpa esimerkkinä edellä ollutta palkanlaskenta-sovelluksen koodia. Employee-objekstin ja palkanlaskennan toiminnallisuuden kannalta oleellisia metodeja on vain muutama, esimerkiksi CalculatePay, GetAddress ja GetEmployeeType. Jos tunnet palkanlaskennan hyvin, voit helposti määritellä ne metodit, joita luokan käyttäjät tulevat tarvitsemaan. Jos yhdistät luokan suunnittelussa yleisen tietämyksesi asiasta harkintaan ja hyvään suunnitteluun, voit olla suhteellisen varma, että suurin osa tämän luokan rajapinnoista tulee säilymään muuttumattomana huolimatta tulevista muutoksista luokan toteutuksessa. Loppujen lopuksi käyttäjän näkökulmasta se on vain Employee-luokka. Käyttäjän näkökulmasta oikeastaan mitään ei tule muuttumaan versiosta versioon. Käyttäjän ja toteutuksen yksityiskohtien yhdistäminen on se, joka tekee koko järjestelmästä helpommin ymmärrettävän ja siksi helpomman ylläpitää. Vertaa tätä C:n tapaiseen proseduraaliseen kieleen, jossa jokaisen moduulin tulee täsmällisesti nimetä ja käsitellä annetun tietueen jäseniä. Tällöin joka kerta, kun tietueen jäsen muuttuu, jokainen koodirivi, joka viittaa tuohon tietueeseen, pitää myös muuttaa. 13
14 Osa I Pohjan luominen Periytyminen Periytyminen viittaa ohjelmoijan mahdollisuuteen määritellä, että tietyllä luokalla on kindof-yhteys toiseen luokkaan. Periytymisen avulla voit luoda (tai periyttää) uuden luokan, joka perustuu olemassa olevaan luokkaan. Voit sen jälkeen määritellä luokan haluamallasi tavalla ja luoda periytetystä luokasta uusia objekteja. Tämä kyky on välttämätön, kun luodaan luokkien hierarkkioita. Lukuunottamatta abstraktiota, periytyminen on merkittävin osa järjestelmän kokonaissuunnittelua. Periytetty luokka (derived class) on uusi luokka ja kantaluokka (base class) on se, josta uusi luokka periytyy. Uusi periytetty luokka perii kaikki kantaluokan jäsenet ja voit siten hyödyntää aiemmin tehtyä työtä. Huomaa C#:ssa kerrotaan mitkä kantaluokan jäsenet peritään jäsenen määrittelyssä annettavalla käsittelymääreellä. Tähän asiaan palataan luvussa 5. Tässä vaiheessa voit olettaa, että periytyvä luokka perii kaikki kantaluokkansa jäsenet. Esimerkkinä siitä, milloin ja miten käytät periytymistä katsotaan uudelleen EmployeeApp-esimerkkiä. Meillä tulee melko varmasti olemaan eri tyyppisiä työntekijöitä, kuten kuukausipalkkaisia, urakoitsijoita ja tuntipalkkaisia. Vaikka kaikilla näillä Employeeobjekteilla on samanlainen rajapinta, ne kuitenkin toimivat monessa suhteessa eri tavalla. Esimerkiksi CalculatePay-metodi toimii eri tavalla kuukausipalkkaisella kuin urakoitsijalla. Haluat kuitenkin tarjota käyttäjälle aina saman CalculatePay-rajapinnan riippumatta työntekijän tyypistä. Jos et ole aiemmin tutustunut olio-ohjelmointiin, saatat miettiä Enhän edes tarvitse objekteja tässä. Miksi en yksinkertaisesti voi ottaa EMPLOYEE-tietuetta ja employeetyyppistä jäsentä ja kirjoittaa seuraavanlaisen funktion? Double CalculatePay(EMPLOYEE* pemployee, int ihoursworked) // Tutkitaan pemployee-osoitinta. if (pemployee->type == SALARIED) // Lasketaan kuukausipalkka. else if (pemployee->type == CONTRACTOR) // Lasketaan urakoitsijan palkka. else if (pemployee-> == HOURLY) 14
15 Olioperusteisen ohjelmoinnin teoria Luku 1 // Lasketaan tuntipalkka. else // Muu tapaus. // Palautetaan jonkin valintarakenteen // laskema arvo. Tässä koodissa on muutama ongelma. Ensinnäkin, CalculatePay-funktion onnistuminen on tiiviisti yhteydessä EMPLOYEE-tietueeseen. Kuten aiemmin mainitsin, tämän tyyppinen yhteys on ongelma, koska jokainen EMPLOYEE-tietueeseen tehty muutos rikkoo koodin. Olioperusteisena ohjelmoijana viimeinen asia, jolla haluat luokkasi käyttäjää rasittaa on se, että hänen pitäisi tietää luokkasi sisäinen rakenne. Se olisi kuin juoma-automaatti, jonka valmistaja vaatisia sinua ymmärtämään automaatin sisäisen toiminnan ennen kuin antaisi ostamasi pullon. Toiseksi, tämä koodi ei tue uudelleenkäyttöä. Heti kun alat ymmärtää, miten periytyminen tukee uudelleenkäyttöä, huomaat, että luokat ja objektit ovat hyvä asia. Tässä tapauksessa määrittelisit kaikki jäsenet kantaluokassa, joka toimisi samoin riippumatta työntekijän tyypistä. Jokainen periytetty luokka voisi sitten periä tämän toiminnallisuuden ja muuttaa sitä tarpeen mukaan. Esimerkkimme näyttäisi C#:lla tällaiselta: class Employee public Employee(string firstname, string lastname, int age, double payrate) this.firstname = firstname; this.lastname = lastname; this.age = age; this.payrate = payrate; protected string firstname; protected string lastname; protected int age; protected double payrate; public double CalculatePay(int hoursworked) (jatkuu) 15
16 Osa I Pohjan luominen // Laskenta tehdään tässä. return (payrate * (double)hoursworked); class SalariedEmployee : Employee public string SocialSecurityNumber; public void CalculatePay (int hoursworked) // Kuukauspalkan laskenta. class ContractEmployee : Employee public string FederalTaxId; public void CalculatePay (int hoursworked) // Urakoitsijan palkan laskenta. Edellä olevassa esimerkissä on kolme huomionarvoista seikkaa: Kantaluokka Employee sisältää jäsenen nimeltä EmployeeId, joka periytyy sekä SalariedEmployee- että ContractEmployee-luokkaan. Kaksi periytyvää luokkaa eivät tee mitään saadakseen tämän jäsenen, ne perivät sen automaattisesti Employeeluokasta. Molemmat periytyvät luokat toteuttavat oman versionsa metodista CalculatePay. Huomaa kuitenkin, että molemmat perivät rajapinnan ja vaikka ne muuttavat sisäistä koodiaan itselleen sopivaksi, käyttäjän koodi pysyy samana. Molemmat periytyvät luokat lisäävät jäsenen kantaluokasta perimiensä jäsenten lisäksi. SalariedEmployee-luokka määrittelee merkkijonojäsenen SocialSecurityNumber ja ContractEmployee-luokkan sisältyy jäsenen FederalTaxId määrittely. Olet nähnyt tästä pienestä esimerkistä, että periytymisen ansiosta voit käyttää koodia uudelleen periyttämällä toiminnallisuuden kantaluokasta. Ja enemmänkin, sillä voit laajentaa luokkaa lisäämällä siihen omia muuttujia ja metodeja. 16
17 Olioperusteisen ohjelmoinnin teoria Luku 1 Asianmukaisen periytymisen määrittely Osoittaakseni asianmukaisen peritytymisen tärkeyden, käytän Marshall Clinen ja Greg Lomowin kirjassaan C++ FAQs (Addison-Wesley, 1998) esittämää termiä: korvattavuus (substitutability). Se tarkoittaa, että periytyvän luokan ilmoitettu käyttäytyminen on korvattavissa kantaluokassa. Mieti hetken tätä sääntöä, se on tärkein yksittäinen sääntö, mitä tulee toimivan luokkahierarkian rakentamiseen. Toinen sääntö, joka kannattaa pitää mielessä, kun suunnittelee luokkahierarkkiaa, kuuluu näin: periytyvän luokan ei pidä vaatia enempää eikä luvata vähempää kuin sen kantaluokka missään periytyvässä rajapinnassa. Tästä säännöstä poikkeaminen rikkoo olemassa olevan koodin. Luokan rajapinta on sitova sopimus luokan itsensä ja luokkaa käyttävän koodin välillä. Kun ohjelmoijalla on viittaus periytyvään luokkaan, hän voi aina luottaa, että sitä voi käsitellä kuin kantaluokkaa. Tätä kutsutaan englanninkielisellä termillä upcasting. Jos asiakasohjelmalla esimerkissämme on viittaus ContractEmployee-objektiin, sillä on samalla viittaus sen kantaluokkaan Employee-objektiin. Niinpä määrityksen mukaan ContractEmployeeobjektin tulee aina kyetä toimimaan kuin kantaluokkansa objektin. Huomioi, että tämä sääntö koskee vain kantaluokkaa. Periytetty luokka voi lisätä rajoittavia metodeja ja luvata niin vähän kuin haluaa. Siksi tätä sääntöä sovelletaan vain perittyihin jäseniin, koska olemassa olevalla koodlla on sopimus vain niihin. Monimuotoisuus Paras ja lyhin määritelmä, jonka olen kuullut monimuotoisuudesta, kuuluu näin: monimuotoisuus on toiminnallisuus, jossa vanha koodi kutsuu uutta koodia. Tämä on ilman muuta suurin etu olioperusteisesta ohjelmoinnista, koska se mahdollistaa järjestelmän laajentamisen ja parantamisen olemassa olevaa koodia muokkaamatta tai rikkomatta. Oletetaan, että kirjoitat metodia, jonka pitää käydä läpi Employee-objektien kokoelma ja kutsua jokaisen CalculatePay-metodia. Tämä toimii hienosti, kun yhtiölläsi on vain yhden tyyppisiä työntekijöitä, koska voit silloin lisätä kokoelmaan tarkkaan määrätyn objektityypin. Mutta mitä tapahtuu, kun palkkaat uuden tyyppisen työntekijän? Jos sinulla esimerkiksi on luokka nimeltä Employee, joka toteuttaa kuukausipalkkaisen työntekijän toiminnallisuuden, mutta palkkaatkin tuntipalkkaisia työntekijöitä, joiden palkka pitää laskea eri tavalla? Proseduraalisessa ohjelmoinnissa muokkaisit laskentafunktiota käsittelemään uuden työntekijätyypin, jonka seurauksena vanha koodi ei ymmärtäisi, miten uutta koodia tulee käsitellä. Olioperusteinen ratkaisu käsittelee tällaiset erot monimuotoisuuden avulla. 17
18 Osa I Pohjan luominen Määrittelet kantaluokan nimeltä Employee. Sen jälkeen määrittelet periytyvän luokan kullekin työntekijätyypille (kuten olemme tehneet aiemmin). Kullakin periytetyllä työntekijäluokalla on sitten oma toteutuksena CalculatePay-metodista. Nyt tapahtuu ihmeitä. Monimuotoisuuden ansiosta, kun sinulla on ylöspäin tyyppimuunnettu (upcasted) -osoitin objektiin ja kutsut objektin metodia, kielen ajonaikainen ympäristö varmistaa, että kutsutaan metodin oikeaa versiota. Tässä koodi, joka selventää tätä asiaa: using System; class Employee public Employee(string firstname, string lastname, int age, double payrate) this.firstname = firstname; this.lastname = lastname; this.age = age; this.payrate = payrate; protected string firstname; protected string lastname; protected int age; protected double payrate; public virtual double CalculatePay(int hoursworked) Console.WriteLine( Employee.CalculatePay ); return 42; // satunnaisluku class SalariedEmployee : Employee public SalariedEmployee(string firstname, string lastname, int age, double payrate) : base(firstname, lastname, age, payrate) public override double CalculatePay(int hoursworked) Console.WriteLine( SalariedEmployee.CalculatePay ); return 42; // satunnaisluku class ContractorEmployee : Employee 18
19 Olioperusteisen ohjelmoinnin teoria Luku 1 public ContractorEmployee(string firstname, string lastname, int age, double payrate) : base(firstname, lastname, age, payrate) public override double CalculatePay(int hoursworked) Console.WriteLine( ContractorEmployee.CalculatePay ); return 42; // bogus value class HourlyEmployee : Employee public HourlyEmployee(string firstname, string lastname, int age, double payrate) : base(firstname, lastname, age, payrate) public override double CalculatePay(int hoursworked) Console.WriteLine( HourlyEmployee.CalculatePay ); return 42; // bogus value class PolyApp protected Employee[] employees; protected void LoadEmployees() Console.WriteLine( Loading employees... ); // Todellisessa sovelluksessa saisimme // tämän tietokannasta. employees = new Employee[3]; employees[0] = new SalariedEmployee ( Amy", Anderson", 28, 100); employees[1] = new ContractorEmployee ( John", Maffei", 35, 110); employees[2] = new HourlyEmployee ( Lani", Ota", 2000, 5); Console.WriteLine( \n ); protected void CalculatePay() (jatkuu) 19
20 Osa I Pohjan luominen foreach(employee emp in employees) emp.calculatepay(40); public static void Main() PolyApp app = new PolyApp(); app.loademployees(); app.calculatepay(); Ohjelman kääntäminen ja ajaminen aiheuttaa seuraavat tulokset: c:\>polyapp Loading employees... SalariedEmployee.CalculatePay ContractorEmployee.CalculatePay HourlyEmployee.CalculatePay Huomaa, että monimuotoisuus tarjoaa vähintään kaksi etua. Ensinnäkin se antaa mahdollisuuden ryhmitellä objektit, joilla on yhteinen kantaluokka ja käsitellä niitä samalla tavalla. Vaikka minulla yllä olevassa esimerkissä oli teknisessä mielessä kolme erilaista objektityyppiä, SalariedEmployee, ContractorEmployee ja HourlyEmployee, pystyin käsittelemään niitä kaikkia Employee-objektina, koska ne kaikki periytyivät Employee-kantaluokasta. Siten pystyin käsittelemään niitä taulukossa, joka oli määritelty Employee -objektien taulukoksi. Kun kutsuin yhtä noiden objektien metodeista, monimuotoisuuden ansiosta ajonakainen ympäristö varmisti, että kutsuttiin oikean periytetyn luokan metodia. Toinen etu on se, jonka mainitsin kappaleen alussa: vanha koodi voi käyttää uutta koodia. Huomaa, että PolyApp.CalculatePay-metodi käy läpi luokan Employee-objektien jäsentaulukon. Koska tämä metodi käsittelee objekteja Employee-objekteina ja monimuotoisuuden ajonaikainen toteutus varmistaa, että oikean periytetyn luokan metodia kutsutaan, voin lisätä muita periytettyjä työntekijätyyppejä järjestelmään, lisätä ne Employee objektitaulukkoon ja kaikki koodini toimii edelleen ilman, että olen joutunut muuttamaan alkuperäistä koodia lainkaan! 20
21 Olioperusteisen ohjelmoinnin teoria Luku 1 Yhteenveto Tämä luku on vienyt sinut pikaiselle matkalle niiden termien ja käsitteiden pariin, jotka sisältyvät termin olioperusteinen ohjelmointi alle. Aiheen täydellinen käsittely vaatisi useita kappaleita ja veisi siksi sivuun tämän kirjan varsinaisesta aiheesta. Olioperusteisen ohjelmoinnin perustuntemus on kuitenkin tarpeellista, jotta saisit kaiken irti C#-kielestä. Käsittelimme tässä luvussa vain muutamia aiheita. Olioperusteisen järjestelmän ymmärtämisen perusedellytys on erottaa luokat, objektit ja rajapinnat ja tietää, miten nämä liittyvät tehokkaaseen ratkaisuun. Hyvä olioperusteinen ratkaisu riippuu myös kolmen olioperusteisen ohjelmoinnin perusasian toteutuksesta. Nämä kolme ovat: kapselointi, periytyminen ja monimuotoisuus. Tässä luvussa esitetyt periaatteet luovat pohjan seuraavalle luvulle, joka esittelee Microsoft.NET Frameworkin ja Common Runtime Libraryn. 21
22
Olio-ohjelmoinnissa luokat voidaan järjestää siten, että ne pystyvät jakamaan yhteisiä tietoja ja aliohjelmia.
4. Periytyminen 4.1. 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
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
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
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.
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.
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
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
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
Delegaatit ja tapahtumakäsittelijät
14 Delegaatit ja tapahtumakäsittelijät Toinen käyttökelpoinen keksintö C#-kielessä ovat delegaatit. Periaatteessa ne palvelevat samaa tarkoitusta kuin C++:n funktio-osoittimet. Delegaatit ovat kuitenkin
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ä.
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
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ä
Muutamia peruskäsitteitä
Muutamia peruskäsitteitä Huom. 1: nämä peruskäsitteet eivät muodosta hyvin määriteltyä keskenään yhteensopivien käsitteiden joukkoa, vaan käsitteet ovat osittain päällekkäisiä ja eri yhteyksissä niillä
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.
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
ITKP102 Ohjelmointi 1 (6 op)
ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 22. huhtikuuta 2016 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille! Kirjoittamasi luokat, funktiot ja aliohjelmat
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.
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
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:
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
Saa mitä haluat -valmennus
Saa mitä haluat -valmennus Valmennuksen jälkeen Huom! Katso ensin harjoituksiin liittyvä video ja tee sitten vasta tämän materiaalin tehtävät. Varaa tähän aikaa itsellesi vähintään puoli tuntia. Suosittelen
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
TT00AA12-2016 - Ohjelmoinnin jatko (TT10S1ECD)
TT00AA12-2016 - Ohjelmoinnin jatko (TT10S1ECD) Ohjelmointikäytännöt 21/3/11 Mikko Vuorinen Metropolia Ammattikorkeakoulu 1 Sisältö 1) Mitä on hyvä koodi? 2) Ohjelmointikäytäntöjen merkitys? 3) Koodin asettelu
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,
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
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ä
Tietotekniikan valintakoe
Jyväskylän yliopisto Tietotekniikan laitos Tietotekniikan valintakoe 2..22 Vastaa kahteen seuraavista kolmesta tehtävästä. Kukin tehtävä arvostellaan kokonaislukuasteikolla - 25. Jos vastaat useampaan
Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti
Luku 6 Dynaaminen ohjelmointi Dynaamisessa ohjelmoinnissa on ideana jakaa ongelman ratkaisu pienempiin osaongelmiin, jotka voidaan ratkaista toisistaan riippumattomasti. Jokaisen osaongelman ratkaisu tallennetaan
Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2
6. Metodit 6.1 Sisällys Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2 Oliot viestivät metodeja kutsuen Olio-ohjelmoinnissa ohjelma
Taulukot. Jukka Harju, Jukka Juslin 2006 1
Taulukot Jukka Harju, Jukka Juslin 2006 1 Taulukot Taulukot ovat olioita, jotka auttavat organisoimaan suuria määriä tietoa. Käsittelylistalla on: Taulukon tekeminen ja käyttö Rajojen tarkastus ja kapasiteetti
812347A Olio-ohjelmointi, 2015 syksy 2. vsk. II Johdanto olio-ohjelmointiin
812347A Olio-ohjelmointi, 2015 syksy 2. vsk II Johdanto olio-ohjelmointiin Sisältö 1. Abstraktiosta 2. Olio-ohjelmoinnin historiaa 3. Olioparadigmasta 4. Peruskäsitteiden esittely 2 II.1 Abstraktiosta
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
Osoitin ja viittaus C++:ssa
Osoitin ja viittaus C++:ssa Osoitin yksinkertaiseen tietotyyppiin Osoitin on muuttuja, joka sisältää jonkin toisen samantyyppisen muuttujan osoitteen. Ohessa on esimerkkiohjelma, jossa määritellään kokonaislukumuuttuja
tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla
2.5. YDIN-HASKELL 19 tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla kirjaimilla. Jos Γ ja ovat tyyppilausekkeita, niin Γ on tyyppilauseke. Nuoli kirjoitetaan koneella
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
815338A Ohjelmointikielten periaatteet
815338A Ohjelmointikielten periaatteet 2015-2016 V Abstraktit tietotyypit ja olioohjelmointi Sisältö I. Abstraktit tietotyypit II. 1. Johdatus abstrakteihin tietotyyppeihin 2. Abstraktit tietotyypit Adassa
Tietueet. Tietueiden määrittely
Tietueet Tietueiden määrittely Tietue on tietorakenne, joka kokoaa yhteen eri tyyppistä tietoa yhdeksi asiakokonaisuudeksi. Tähän kokonaisuuteen voidaan viitata yhteisellä nimellä. Auttaa ohjelmoijaa järjestelemään
Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia.
Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen raine.kauppinen@haaga-helia.fi 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-ympäristö Java-ohjelma ja ohjelmaluokka
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
ITKP102 Ohjelmointi 1 (6 op)
ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 20. huhtikuuta 2018 Vastaa kaikkiin tehtäviin. Tee kukin tehtävä omalle konseptiarkille. Noudata ohjelmointitehtävissä kurssin koodauskäytänteitä.
Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi
Solidity älysopimus ohjelmointi Sopimus suuntautunut ohjelmointi Merkle puu Kertausta eiliseltä Solidity on korkean tason älysopimus ohjelmointikieli Muistuttaa olio-ohjelmointia Javalla Sopimuskoodi on
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ää
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.
812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä
812347A Olio-ohjelmointi, 2015 syksy 2. vsk X Poikkeusten käsittelystä Sisältö 1. Yleistä poikkeusten käsittelystä 2. Poikkeuskäsittelyn perusteita C++:ssa 3. Standardissa määritellyt poikkeukset 4. Poikkeusvarmuus
Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto
Sisällys 18. bstraktit tietotyypit Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.1 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:
Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista
Sisällys 1. Omat operaatiot Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma
ohjelman arkkitehtuurista.
1 Legacy-järjestelmällä tarkoitetaan (mahdollisesti) vanhaa, olemassa olevaa ja käyttökelpoista ohjelmistoa, joka on toteutettu käyttäen vanhoja menetelmiä ja/tai ohjelmointikieliä, joiden tuntemus yrityksessä
Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit
Liite E - Esimerkkiprojekti E Esimerkkiprojekti Olet lukenut koko kirjan. Olet sulattanut kaiken tekstin, Nyt on aika soveltaa oppimiasi uusia asioita pienen, mutta täydellisesti muotoiltuun, projektiin.
Java-kielen perusteet
Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, literaalivakio, nimetty vakio Tiedon merkkipohjainen tulostaminen 1 Tunnus Java tunnus Java-kirjain Java-numero
2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)
2. Lisää Java-ohjelmoinnin alkeita Muuttuja ja viittausmuuttuja Vakio ja literaalivakio Sijoituslause Syötteen lukeminen ja Scanner-luokka 1 Muuttuja ja viittausmuuttuja (1/4) Edellä mainittiin, että String-tietotyyppi
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
58131 Tietorakenteet ja algoritmit (syksy 2015)
58131 Tietorakenteet ja algoritmit (syksy 2015) Harjoitus 2 (14. 18.9.2015) Huom. Sinun on tehtävä vähintään kaksi tehtävää, jotta voit jatkaa kurssilla. 1. Erään algoritmin suoritus vie 1 ms, kun syötteen
Pong-peli, vaihe Aliohjelman tekeminen. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana
Muilla kielillä: English Suomi Pong-peli, vaihe 3 Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana Jaetaan ohjelma pienempiin palasiin (aliohjelmiin) Lisätään peliin maila (jota ei voi vielä
Nimeni on. Tänään on (pvm). Kellonaika. Haastateltavana on. Haastattelu tapahtuu VSSHP:n lasten ja nuorten oikeuspsykiatrian tutkimusyksikössä.
1 Lapsen nimi: Ikä: Haastattelija: PVM: ALKUNAUHOITUS Nimeni on. Tänään on (pvm). Kellonaika. Haastateltavana on. Haastattelu tapahtuu VSSHP:n lasten ja nuorten oikeuspsykiatrian tutkimusyksikössä. OSA
Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo
Concurrency - Rinnakkaisuus Group: 9 Joni Laine Juho Vähätalo Sisällysluettelo 1. Johdanto... 3 2. C++ thread... 4 3. Python multiprocessing... 6 4. Java ExecutorService... 8 5. Yhteenveto... 9 6. Lähteet...
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
Olio-ohjelmointi: Luokkien toteuttaminen. Jukka Juslin
Olio-ohjelmointi: Luokkien toteuttaminen Jukka Juslin Luokkien kirjoittaminen Tähän mennessä on käytetty valmiiksi määritettyjä luokkia. Nyt opimme kirjoittamaan omia luokkia olioiden kuvaamiseksi Seuraavaksi
Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä
Rekursiolause Laskennan teorian opintopiiri Sebastian Björkqvist 23. helmikuuta 2014 Tiivistelmä Työssä käydään läpi itsereplikoituvien ohjelmien toimintaa sekä esitetään ja todistetaan rekursiolause,
ITKP102 Ohjelmointi 1 (6 op)
ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 12. huhtikuuta 2019 Tee kukin tehtävä omalle konseptiarkille. Noudata ohjelmointitehtävissä kurssin koodauskäytänteitä. Yksi A4-kokoinen lunttilappu
Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen
Sisällys 6. Metodit Oliot viestivät metodeja kutsuen. Kuormittaminen. Luokkametodit (ja -attribuutit).. Metodien ja muun luokan sisällön järjestäminen. 6.1 6.2 Oliot viestivät metodeja kutsuen Oliot viestivät
18. Abstraktit tietotyypit 18.1
18. Abstraktit tietotyypit 18.1 Sisällys Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:
Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2
4. Attribuutit 4.1 Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2 Yleistä Luokan lohkossa, mutta metodien ulkopuolella esiteltyjä
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
8/20: Luokat, oliot ja APIt
Ohjelmointi 1 / syksy 2007 8/20: Luokat, oliot ja APIt Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/8 Kohti
Ohjelmointi 1. Kumppanit
Ohjelmointi 1 Kumppanit November 20, 2012 2 Contents 1 Mitä ohjelmointi on 7 2 Ensimmäinen C#-ohjelma 9 2.1 Ohjelman kirjoittaminen......................... 9 A Liite 11 3 4 CONTENTS Esipuhe Esipuhe 5
12. Monimuotoisuus 12.1
12. Monimuotoisuus 12.1 Sisällys Johdanto. Periytymismekanismi määrittää alityypityksen. Viitteiden sijoitus ja vertailu. Staattinen ja dynaaminen luokka. Myöhäinen ja aikainen sidonta. Parametrinvälitys
Attribuutit. Copyright IT Press Tämän e-kirjan kopiointi, tulostaminen ja jakeleminen eteenpäin luvatta on kielletty.
8 Attribuutit Useimmat ohjelmointikielet on suunniteltu tavoitteena määrätty joukko ominaisuuksia. Kun esimerkiksi ryhdyt tekemään kääntäjää, mietit millainen uudella kielellä tehty sovellus on rakenteeltaan,
Ohjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 5: Sijoituslause, SICP-oliot, tietorakenteen muuttaminen (mm. SICP 33.1.3, 3.33.3.2) Riku Saikkonen 6. 11. 2012 Sisältö 1 Muuttujan arvon muuttaminen:
ITKP102 Ohjelmointi 1 (6 op)
ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 7. huhtikuuta 2017 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille. Kirjoittamasi luokat, funktiot ja aliohjelmat
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
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
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,
812341A Olio-ohjelmointi, I Johdanto
812341A Olio-ohjelmointi, 2016 I Johdanto Sisältö 1. Abstraktiosta 2. Olio-ohjelmoinnin historiaa 3. Olioparadigmasta 4. Peruskäsitteiden kertausta 812341A Olio-ohjelmointi, Johdanto 2 1 Abstraktiosta
Tietorakenteet ja algoritmit - syksy 2015 1
Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 2 Tietorakenteet ja algoritmit Johdanto Ari Korhonen Tietorakenteet ja algoritmit - syksy 2015 1. JOHDANTO 1.1 Määritelmiä
7/20: Paketti kasassa ensimmäistä kertaa
Ohjelmointi 1 / syksy 2007 7/20: Paketti kasassa ensimmäistä kertaa Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007
Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen
Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari 1 1. JOHDANTO 1.1 Määritelmiä 1.2 Tietorakenteen ja algoritmin valinta 1.3 Algoritmit ja tiedon määrä 1.4 Tietorakenteet ja toiminnot 1.5 Esimerkki:
815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 2 vastaukset Harjoituksen aiheena on BNF-merkinnän käyttö ja yhteys rekursiivisesti etenevään jäsentäjään. Tehtävä 1. Mitkä ilmaukset seuraava
1. Miten tehdään peliin toinen maila?
Muilla kielillä: English Suomi Pong-peli, vaihe 4 Tässä oppaassa teemme toisenkin mailan. 1. Miten tehdään peliin toinen maila? Maila tehtiin edellisessä vaiheessa, aliohjelmassa LuoKentta, seuraavasti:
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.
12. Javan toistorakenteet 12.1
12. Javan toistorakenteet 12.1 Sisällys Yleistä toistorakenteista. Laskurimuuttujat. While-, do-while- ja for-lauseet. Laskuri- ja lippumuuttujat. Tyypillisiä ohjelmointivirheitä. Silmukan rajat asetettu
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ä).
1. Kun käyttäjä antaa nollan, niin ei tulosteta enää tuloa 2. Hyväksy käyttäjältä luku vain joltain tietyltä väliltä (esim tai )
Tehtävä do while + Viikko 1 Tehtävä 27. Salasana (MOOC) Viikko 1 Tehtävä 28. Lämpötilat (MOOC) Tehdään ohjelma, joka kysyy käyttäjältä lukua. Luku kerrotaan aina seuraavalla käyttäjän antamalla luvulla
Virtuaalifunktiot ja polymorfismi
Virtuaalifunktiot ja polymorfismi 16 Virtuaalifunktiot ja polymorfismi Polymorfismi on niin tehokas olio-ohjelmoinnin ominaisuus, että tulet varmastikin käyttämään sitä lähes kaikissa C++-ohjelmissasi.
Antti-Jussi Lakanen Ohjelmointi 1, C# / kevät 2011
Antti-Jussi Lakanen Ohjelmointi 1, C# / kevät 2011 Yleistä olioista ja OOP:sta OOP, eng. Object Oriented Programming C#:ssa oliot luodaan käyttämällä (olio)luokkia Olio tarkoittaa yksinkertaisesti ohjelman
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 15.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 15.3.2010 1 / 56 Tiedostoista: tietojen tallentaminen ohjelman suorituskertojen välillä Monissa sovelluksissa ohjelman
TIE-20200 Ohjelmistojen suunnittelu. Luento 8..9: moniperintä
TIE-20200 Ohjelmistojen suunnittelu Luento 8..9: moniperintä 1 Ajankohtaista Harjoitustyön suunnittelusessiot pidetty, työt jatkuvat, välivaiheen esittely seuraavana Viimeinen viikkoharjoituskerta, palataan
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
Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2
4. Attribuutit 4.1 Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2 Yleistä Luokan lohkossa, mutta metodien ulkopuolella esiteltyjä muuttujia ja vakioita. Esittely
14. Hyvä ohjelmointitapa 14.1
14. Hyvä ohjelmointitapa 14.1 Yleistä Ohjelman elinkaari ei tyypillisesti pääty sen toteuttamiseen; ohjelmaa voidaan käyttää ja ylläpitää jopa vuosikymmeniä. Jotta koodin muuttaminen on mahdollista, sen
HELIA 1 (14) Outi Virkki Käyttöliittymät ja ohjlmiston suunnittelu
HELIA 1 (14) Luento 7 Käyttöliittymäolio... 2 Olioajattelun perusteet... 3 Tavoitteet... 3 Peruskäsitteet... 4 Olio / Olioinstanssi / Olion esiintymä... 4 Ominaisuudet... 4 Toiminnot... 4 Olioluokka /
Jypelin käyttöohjeet» Ruutukentän luominen
Jypelin käyttöohjeet» Ruutukentän luominen Pelissä kentän (Level) voi luoda tekstitiedostoon "piirretyn" mallin mukaisesti. Tällöin puhutaan, että tehdään ns. ruutukenttä, sillä tekstitiedostossa jokainen
4. Olio-ohjelmoinista lyhyesti 4.1
4. Olio-ohjelmoinista lyhyesti 4.1 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen. 4.2 Yleistä Olio-ohjelmointia käsitellään hyvin
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print
TIE Tietorakenteet ja algoritmit 1. TIE Tietorakenteet ja algoritmit
TIE-20100 Tietorakenteet ja algoritmit 1 TIE-20100 Tietorakenteet ja algoritmit TIE-20100 Tietorakenteet ja algoritmit 2 Lähteet Luentomoniste pohjautuu vahvasti prof. Antti Valmarin vanhaan luentomonisteeseen
Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen
Ohjelmointitaito (ict1td002, 12 op) Kevät 2009 Raine Kauppinen raine.kauppinen@haaga-helia.fi 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-kehitysympäristö Java-ohjelma ja luokka
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.
Sisältö. 22. Taulukot. Yleistä. Yleistä
Sisältö 22. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 22.1 22.2 Yleistä
Ohjelmoinnin perusteet, syksy 2006
Ohjelmoinnin perusteet, syksy 2006 Esimerkkivastaukset 1. harjoituksiin. Alkuperäiset esimerkkivastaukset laati Jari Suominen. Vastauksia muokkasi Jukka Stenlund. 1. Esitä seuraavan algoritmin tila jokaisen
Java-kielen perusteet
Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, Vakio Tiedon merkkipohjainen tulostaminen Ohjelmointi (ict1tx006) Tunnus (5.3) Javan tunnus Java-kirjain Java-numero
JUnit ja EasyMock (TilaustenKäsittely)
OHJELMISTOJEN TESTAUS JA HALLINTA Syksy 2015 / Auvo Häkkinen JUnit ja EasyMock (TilaustenKäsittely) Tehtävässä tarvittava koodi löytyy osoitteella http://users.metropolia.fi/~hakka/oth/mockesimerkki.zip