Skip to content

ohjelmointi2/inheritance-interfaces

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

38 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Note

The English translation for this exercise can be found in this file.

Perintä ja rajapinnat

Tämä repositorio sisältää joukon Java-harjoituksia, joiden avulla perehdyt perintään ja rajapintoihin.

Tehtävän yhteyteen suosittelemme seuraavia itseopiskelumateriaaleja:

Lisäksi sinun tulee etsiä itsenäisesti tietoa erinäisistä lähteistä.

Tehtävän aloittaminen

Aloita kloonaamalla Git-repositorio omalle koneellesi. Harjoitus täytyy tehdä omassa kopiossasi, eli varmista, että repositorion osoitteessa on mukana oma GitHub-käyttäjätunnuksesi! Oman kopiosi saat luotua kurssitoteutuksesi tehtävänannon GitHub classroom -linkin kautta.

git clone https://github.com/varmista-etta-github-tunnuksesi-on-repositorion-osoitteessa.git

Kloonattuasi projektin omalle koneellesi, avaa se koodieditorissasi.

Vastausten lähettäminen

Kun olet saanut osan tai kaikki tehtävistä ratkaistua ja commitoinut vastauksesi, lähetä ratkaisut arvioitavaksi git push-komennolla. Git push käynnistää automaattisesti GitHub actions -workflow:n, joka kääntää sekä testaa ratkaisusi ja antaa jokaisesta testistä joko hyväksytyn tai hylätyn tuloksen.

Kun GitHub Actions on saanut koodisi suoritettua, näet tuloksen GitHub-repositoriosi Actions-välilehdellä. Arvioinnin valmistumiseen menee tyypillisesti pari minuuttia.

Klikkaamalla yllä olevan linkin takaa viimeisintä "GitHub Classroom Workflow" -suoritusta, saat tarkemmat tiedot tehtävän arvioinnista. Sivun alaosassa näkyy saamasi pisteet. Klikkaamalla "Autograding"-otsikkoa pääset katsomaan tarkemmin arvioinnissa suoritetut vaiheet ja niiden tulokset. Kuvitetun ohjeen aiheesta löydät GitHubin dokumentista View autograding results (github.com).

💡 Voit lähettää ratkaisusi arvioitavaksi niin monta kertaa kuin on tarpeen tehtävän määräaikaan asti. Varmista kuitenkin, että viimeisin suoritus tuottaa parhaat pisteet, koska vain viimeisimmät pisteet jäävät voimaan.

Osa 1: perintä (perusteet, 10 % + 10 %)

Tämän tehtäväpohjan inheritance.webshop-paketissa on neljä Java-luokkaa, joiden tarkoitus on mallintaa kuvitteellisessa web-pohjaisessa osto- ja myyntipalvelussa olevia tuotteita. Oletuksena kaikki tuotteet sisältävät tyypistä riippumatta Product-luokassa määritellyt tiedot (title, description, price). Ajoneuvoille, asunnoille ja pääsylipuille on omat luokkansa, jotka sisältävät juuri näille tuotteille ominaisia lisätietoja:

classDiagram
  direction TB

  class Product {
    - title: String
    - description: String
    - price: double
  }

  class Vehicle {
    + title: String
    + description: String
    + price: double
    - manufacturer: String
    - model: String
    - year: int
  }

  class Apartment {
    + title: String
    + description: String
    + price: double
    - numberOfRooms: int
    - size: double
    - floorNumber: int
  }

  class Ticket {
    + title: String
    + description: String
    + price: double
    - eventDateTime: LocalDateTime
  }

  Product <|-- Vehicle: Extends
  Product <|-- Apartment: Extends
  Product <|-- Ticket: Extends
Loading

Tässä tehtävässä sinun tulee ensin toteuttaa Product-luokka siinä olevien kommenttien mukaisesti. Kun olet saanut Product-luokan toteutettua ja se läpäisee luokalle kirjoitetut testit, toteuta Vehicle-luokka siihen kirjoitettujen kommenttien mukaisesti.

Molemmille luokille on omat testit: ProductTest ja VehicleTest. Voit suorittaa testit koodieditorisi testaustyökalulla (VS Code, Eclipse) tai Gradle-automaatiotyökalulla:

./gradlew test --tests ProductTest      # unix
.\gradlew.bat test --tests ProductTest  # windows
./gradlew test --tests VehicleTest      # unix
.\gradlew.bat test --tests VehicleTest  # windows

Apartment- ja Ticket-luokat löytyvät samasta hakemistosta ja voit jatkaa perinnän harjoittelua itsenäisesti niiden parissa. Näiden luokkien toteutus on Vehicle-luokan kanssa niin samankaltainen, ettei niille ole automaattisia testejä eikä niitä huomioida erikseen tehtävän arvioinnissa.

Osa 2: monimuotoisuus (soveltava, 20 %)

Perinnän avulla toteuttamiesi aliluokkien olioita voidaan käyttää yliluokan olioiden paikalla esimerkiksi kokoelmissa tai metodien parametreina. Täydennä WebShop-luokkaan metodit, joiden tarkoituksena on harjoitella sekä eri tyyppisten olioiden käyttämistä yhdessä, että opetella tarvittaessa tunnistamaan, minkä luokan oliosta kulloinkin on tosiasiassa kyse.

Tämä osa tarkastetaan WebShopTest-luokan avulla, jonka voit suorittaa koodieditorissasi tai Gradlen avulla:

./gradlew test --tests WebShopTest      # unix
.\gradlew.bat test --tests WebShopTest  # windows

💡 Tässä osassa hyödynnetään edellisessä osassa toteutettuja Product- sekä Vehicle-luokkia, joten varmista että edellinen osa toimii ennen tähän etenemistä.

Osa 3: Comparable-rajapinta (perusteet, 20 %)

Country.java-tiedostossa on valmiiksi toteutettu tyypillinen Java-luokka, jonka tarkoitus on mallintaa maita ja niiden väkilukuja. Jatkokehitä tätä luokkaa siten, että se toteuttaa Comparable<Country>-rajapinnan.

Comparable-rajapinta löytyy javasta valmiina ja se sisältää vain yhden metodin: compareTo. Toteuta tämä metodi luokassa esitettyjen sääntöjen mukaisesti. Voit testata ratkaisuasi joko valmiin CountryMain-pääohjelmaluokan tai CountryTest-yksikkötestiluokan avulla:

./gradlew test --tests CountryTest      # unix
.\gradlew.bat test --tests CountryTest  # windows

Osa 4: oman rajapinnan toteuttaminen (soveltava, 10 % + 10 %)

MarkdownExport-rajapinta

Tehtävän tässä osassa sinun tulee toteuttaa itse oma rajapinta nimeltä MarkdownExport. Rajapinta toteutetaan tiedostoon MarkdownExport.java. Määrittele tähän rajapintaan yksi metodi: exportMarkdown(). Metodi ei saa ottaa parametreja ja sen tulee palauttaa merkkijono.

Rajapinnan tarkoituksena on määritellä sen toteuttaville luokille exportMarkdown()-metodi, joka muodostaa oliosta markdown-muotoisen merkkijonoesityksen esimerkiksi tiedostoon tallentamista varten. Tehtävän ratkaisemiseksi sinun ei tarvitse tuntea Markdown-syntaksia, riittää että seuraat annettuja esimerkkejä.

Pizza-luokka

Kun olet määritellyt edellä mainitun rajapinnan, muokkaa tehtäväpohjan valmista Pizza-luokkaa siten, että se toteuttaa kyseisen rajapinnan.

Pizza-luokan exportMarkdown()-metodin palauttamassa merkkijonossa on oltava pizzan nimi otsikkona (# nimi) sekä lista täytteistä (- täyte). Merkkijonon lopussa on oltava pizzan hinta, esimerkiksi seuraavasti:

# Hawaiian

Toppings:
- ham
- pineapple
- mozarella

Price: 10.90

MarkdownExport-rajapinta sekä Pizza-luokka testataan valmiilla MarkdownExportTest-testiluokalla:

./gradlew test --tests MarkdownExportTest      # unix
.\gradlew.bat test --tests MarkdownExportTest  # windows

Product-luokka

Jatkokehitä vielä tämän tehtäväpaketin edellisessä osassa kehitettyä Product-luokkaa siten, että myös se toteuttaa MarkdownExport-rajapinnan. Tuotteiden osalta markdown-esityksessä täytyy olla tuotteen nimi, kuvaus ja hinta, mutta muuten voit määritellä merkkijonon muodon vapaasti.

Koska Product-luokka sijaitsee eri paketissa kuin MarkdownExport-rajapinta, tulee siihen kirjoittaa import-komento: import interfaces.markdown.MarkdownExport;

Product-luokan osalta tehtävä tarkastetaan erillisellä ProductMarkdownTest-testiluokalla:

./gradlew test --tests ProductMarkdownTest      # unix
.\gradlew.bat test --tests ProductMarkdownTest  # windows

💡 Huomaa, että koska Vehicle-luokka perii Product-luokan, myös Vehicle täyttää tämän rajapinnan "automaattisesti". Jos haluat, että ajoneuvoilla on erilainen markdown-esitys kuin muilla tuotteilla, voit vapaasti toteuttaa siihen erilaisen toteutuksen exportMarkdown-metodista.

Osa 5: "dependency injection" (edistynyt, 20 %)

Viimeisenä osana tässä tehtäväpaketissa on perintää soveltava "dependency injection"-esimerkki:

"In software engineering, dependency injection is a programming technique in which an object or function receives other objects or functions that it requires, as opposed to creating them internally. Dependency injection aims to separate the concerns of constructing objects and using them, leading to loosely coupled programs"

Dependency injection. Wikipedia. https://en.wikipedia.org/wiki/Dependency_injection

Tehtävän viimeisen osan ratkaiseminen vaatii vain minimaalisen muutoksen lähdekoodiin. Pääpaino tässä osassa onkin siinä, että perehdyt annettuihin luokkiin ja niissä esitettyihin kommentteihin:

Koska tehtävässä ei juurikaan koodata, ei sille ole valmista yksikkötestiä. Varmista ohjelman ja tekemäsi muutoksen toimivuus suorittamalla Main-pääohjelmaluokkaa ja tutustu ohjelman tulosteisiin. Tehtävä arvioidaan automaattisesti suorittamalla Main-luokka Gradle:n avulla ja tutkimalla sen tulosteita:

./gradlew run      # unix
.\gradlew.bat run  # windows

Lisenssi ja tekijät

Tämän tehtävän on kehittänyt Teemu Havulinna ja se on lisensoitu Creative Commons BY-NC-SA -lisenssillä.

Tehtävänannon, lähdekoodien ja testien toteutuksessa on hyödynnetty ChatGPT 3.5 -kielimallia sekä GitHub copilot -tekoälyavustinta.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages