- COMP.CS.140
- 13. Harjoitustyön aloitus
- 13.1 Projekti: Sisusta selvää
Projekti: Sisusta selvää¶
Projekti tehdään 2-3 hengen ryhmissä. Jokaisen ryhmän jäsenen henkilökohtainen työpanos on oltava näkyvissä ohjelmassa!
Deadlinet¶
Lopullinen palautus: 9.12.2022
Armonaika päättyy: 16.12.2022.
Projektille myönnetään automaattisesti deadlineviikon perjantaihin lisäaikaa eli ns. armonaika alkaa virallisen deadlinen jälkeen.
Armonajallakin palautus kannattaa tehdä mahdollisimman aikaisin, koska arvostelu kiristyy koko ajan lisäajan kuluessa.
Ykkösen raja pysyy samana armonajasta huolimatta.
Muita arvosanarajoja nostetaan heti armonajalle siirryttäessä puolella arvosanalla. Esimerkiksi jos projekti on palautettu heti normaalin takarajan jälkeen, sen on arvosanan 4 saadakseen saatava arvosanan “4.5” edestä pisteitä, arvosanan 3 uusi raja on arvosanan “3.5” raja jne.
Rajoja nostetaan armonajan kuluessa edelleen niin, että sen lopussa arvosanan 4 raja on alkuperäisen arvosanan 5 tasolla. Muut arvosanat on skaalattu vastaavasti. Rangaistusvaikutus ei ole hyppäyksittäinen, vaan kovenee liukuvasti koko ajan.
Projektista, joka ei täytä minivaatimuksia, voi saada ns. bumerangin, jolloin on viikko aikaa korjata työ.
Osaamistavoitteet¶
Projektissa harjoitellaan seuraavia asioita käytännössä:
Toiminnallisuuden lisääminen sovellukseen olio-ohjelmointia hyödyntäen
Graafisen käyttöliittymän toteuttaminen osaksi ohjelmaa
Oman koodin testaus yksikkötasolla
Ohjelman toteuttaminen tiimityönä
Toteutettava ohjelma¶
Sisu aiheuttaa ennenaikaisia harmaita hiuksia, joten mahdollistaaksesi helpon tavan pitää kirjaa siitä, missä tutkinnon suorituksen kanssa mennään, päätät toteuttaa ohjelman sitä varten. Ohjelmalla voidaan tarkastella Tampereen yliopiston tutkinto-ohjelmien rakennetta. Lisäksi ohjelmassa voi tutkailla käyttäjän omien opintojen etenemistä. Käyttäjä voi määrittää tutkinto-ohjelman omakseen ja merkitä siihen kursseja suoritetuksi sitä mukaa, kun opinnot etenevät.
Ohjelman kulku¶
Ohjelmaa käynnistettäessä näkyviin tulee ensin asetusikkuna, jossa annetaan esimerkiksi opiskelijan nimi ja opiskelijanumero sekä mahdollisesti opintojen aloitusvuosi tai valmistumisen tavoitevuosi. Asetuksien valinnan jälkeen siirrytään ohjelman pääikkunaan, josta valitaan opiskelijalle tutkinto-ohjelma, opintosuuntaus ja muita mahdollisesti tarvittavia tietoja. Tutkinto-ohjelmaa ja opintosuuntausta voi vaihtaa pääikkunassa. Tutkinto-ohjelman valintanäkymän lisäksi voidaan näyttää opiskelijan opintojen etenemisnäkymä, jossa näytetään opiskelijan suoritusten sen hetkinen tilanne. Opiskelija voi tässä näkymässä merkitä kurssejaan suoritetuksi.
Opiskelijatiedot ovat henkilötietoja, joten niiden käsittelyyn on määritelty ohjelmaa varten oma JSON-tiedosto. Ohjelman suoritus päättyy pääikkunasta nappia painamalla. Tällöin opiskelijan eteneminen talletetaan JSON-tiedostoon.
Alla on hahmotelma siitä, miltä ohjelman käyttöliittymä saattaisi näyttää:
Monet ohjelman yksityiskohdat on jätetty tässä tarkoituksella avoimiksi, ja ne voi toteuttaa parhaaksi katsomallaan tavalla. Tällaisia asioita ovat mm.
Ohjelman tarkka alkutilanne: Mikä on ohjelman alkutila ja mitä tietoa se kysyy ohjelman alussa käyttäjältä?
Ohjelman käyttöliittymä: Miten ohjelman eri toimintoja voidaan suorittaa?
Käyttäjän rooli ohjelmassa: Miten opiskelijan eteneminen esitetään?
Kurssitietojen esittäminen: Millaisella näkymällä kurssitiedot esitetään? Millä tarkkuudella yhden kurssin tiedot esitetään?
Työn pohjaksi on tarjottu valmis yksinkertainen JavaFX-projekti, joka luo ja avaa tyhjän ikkunan. Pohja on tarkoitettu lähinnä arvosanaa 1 tavoitteleville.
Pakolliset ominaisuudet¶
Harjoitustyössä on toteutettava ainakin alla olevat ominaisuudet. Minimitoteutuksen täyttävästä työstä voi ansaita hyväksytyn suorituksen (arvosana 1). Perustoteutukselle määriteltyjen ominaisuuksien mukaisella toteutuksella voi työstä ansaita korkeintaan arvosanan 3. Korkeampi arvosana edellyttää perustoteutuksen lisäksi joidenkin lisäosien toteutusta.
Projektipisteistä muodostuu osa-arvosana kaavalla arvosana = pisteet/100. Projektipisteet muodostavat 45% kurssin kokonaisarvosanasta.
Minimitoteutus (maksimiarvosana 1): maksimissaan 140 pistettä. Minitoteutuksesta tulee löytyä seuraavat ominaisuudet:
Ohjelma kääntyy
Ohjelmassa on yksi dialogi-ikkuna (esim. alkumenu)
Ohjelma käyttää pääikkunanaan valmiina annettua toteutusta
Ohjelma hakee tutkintojen rakennetiedot määritellyistä JSON-tiedostoista ja käyttää tiedostojen käsittelyyn tarkoitettua rajapintaa niiden lukemisen toteuttamisessa
Ohjelma osaa näyttää valitun tutkinnon rakenteen pääikkunassa
Ohjelmassa on käytetty periytymistä rakenteen osien toteuttamisessa
Loppudokumentti, josta löytyy:
Luokkien vastuujako (luokkakaavio on tässä hyödyllinen)
Ryhmän työnjako
Toteuttamalla minimitoteutuksen päälle määriteltyjä perus- ja lisäominaisuuksia sekä muilla harjoitustyön ansioilla saa kerrytettyä lisää projektipisteitä.
Perustoteutus (maksimiarvosana 3): vähintään 300 pistettä
Ohjelmaan on toteutettu graafinen käyttöliittymä kokonaan itse (ei käytetä kurssin valmista pohjaa)
Ohjelma hakee tutkintojen rakennetiedot Sisun API:sta ja käyttää API-tietojen lukemisen toteuttamiseen siihen tarkoitettua rajapintaa.
Sisun API:sta lisää alempana.
Ohjelma toimii eli näytettävää tutkintoa voi vaihtaa ja opiskelijan tutkinnon tilanne esitetään ohjelmassa.
Ohjelma selviää hallitusti asetustiedostojen käsittelyssä tapahtuvista virheistä.
Ohjelmalle on toteutettu yksikkötestejä
Toteutuksen bonuspisteillä voi kompensoida virheitä yhden arvosanan verran.
Huipputoteutus (maksimiarvosana 5): vähintään 500 pistettä
Ohjelmassa on toteutettuna vähintään kaksi lisäosaa (yksi lisäosa on lähtökohtaisesti 50-100 pistettä)
Toteutuksen bonuspisteillä voi kompensoida virheitä yhden arvosanan verran
Lisäominaisuudet¶
Alla olevia lisäominaisuuksia ei tarvitse toteuttaa, mutta hyvästä lisäosan toteutuksesta ansaitsee lisäpisteitä. Lähtökohtaisesti kukin lisäosa on arvoltaan 50-100 pistettä. Yksittäisen lisäosan arvoa voidaan kuitenkin tarvittaessa kasvattaa myöhemmin, jos se osoittautuu erityisen työlääksi. Korotuksen saaminen edellyttää, että lisäosa on dokumentoitu palautuksessa siten, että ne selkeästi on esitetty lisäosiksi. Töiden tarkastajat eivät etsi lisäosia palautetusta koodista.
Kurssin katselunäkymä. Vietäessä hiiren kursori jonkin kurssin yläpuolelle, kyseisestä kurssista näytetään lisätietoja näytöllä.
Opiskelija-asetukset. Ohjelman käynnistyksen yhteydessä avataan asetusikkuna, josta voi asettaa ohjelmaa käyttävän opiskelijan tiedot. Suorituksen tilanne haetaan ja tallennetaan JSON-tiedostoon.
Opiskelijan etenemisen aikataulun esittäminen tutkinnon rakenteeseen peilaten.
Opettajaroolin lisääminen ohjelmaan
Sisun API:sta löytyvän jonkin tietokokonaisuuden esim. arviointikohteiden esittäminen osana ohjelmaa
Ohjelmaan on toteutettu graafista käyttöliittymää testaavat yksikkötestit (kts. TestFX-viitekehys JavaFX-ohjelmien testaukseen).
Oma lisäominaisuus. Ohjelmaan on toteutettu jokin itse keksitty tämän listan ulkopuolinen lisäominaisuus.
Huom! Lisäominaisuuden pitää olla selkeästi koodaustyötä vaativa ominaisuus.
Huom! KAIKKI LISÄOSAT PITÄÄ DOKUMENTOIDA PISTEET SAADAKSEEN
Arvosanan määräytyminen¶
Arvosana koostuu erillisistä osioista ja bonuspisteistä. Loppuarvosanaa rajaa yllä määritellut toiminnalliset vaatimukset. Kahden lisäosan toteuttamisen jälkeen bonuspisteet voivat kompensoida kaksi lisäarvosanaa.
Arvosteltavat osiot:
Ohjelman suunnittelu ja kokonaisrakenne
Luokkasuunnittelu ja toteutus
Olio-ohjelmoinnin periaatteiden käyttö
Luokkien dokumentaatio
Poikkeuskäsittely
Poikkeusten oikea käyttö ja käsittely
Koodin laatu
Hyvien ohjelmointitapojen ja -periaatteiden noudattaminen
Koodityyli
Versiohistoria ja tiimityö
Bonuspisteet
Annetaan lisäosista ja erityisen hyvin toteutetuista toiminnallisuuksista
Lisätyö, joka lasketaan bonuspisteisiin:
Ylimääräiset, hyvin toteutetut yksikkötestit (yht. max. 150p)
Grafiikan taso (max. 100p)
Erittäin hyvä käyttöliittymä (max. 100p)
Laadukkaasti dokumentoidut rajapinnat ja luokat (yht. max. 50p)
Ympäristö¶
Työympäristö haetaan Course-Gitlabista. Jokaisella ryhmällä on oma ryhmän nimellä nimetty tietovarasto. Kannattaa huomata, että joidenkin ryhmien nimiä on jouduttu muokkaamaan, jotta ne käyvät GitLabin tietovaraston nimiksi. Versionhallinnan kautta on tarjolla valmis JavaFX-projektipohja sekä Sisun dataa sisältäviä JSON-tiedostoja. Aseta group_template_project remoteksi paikalliseen tietovarastoosi hakeaksesi kurssin puolen muutokset. Versionhallinnan käyttö on sekä arvosteltava osa projektia että osoitus tiimityöstä. Etätietovaraston tulee sisältää jokaiselta ryhmän jäseneltä selkeä kontribuutio projektiin.
Sisun API:n käytöstä¶
Sisun dataan pääsee käsiksi verkossa mm. ns. Kori API:n kautta. Kori API:n tekninen dokumentaatio on tarjolla sivulla https://sis-tuni.funidata.fi/kori/swagger-ui/index.html?configUrl=/kori/v3/api-docs/swagger-config&filter=true. API palauttaa dataa JSON-muodossa.
Harjoitustyön kannalta oleellinen tieto on, että listan yliopistomme tutkintorakenteista saa suorittamalla www-pyynnön https://sis-tuni.funidata.fi/kori/api/module-search?curriculumPeriodId=uta-lvv-2021&universityId=tuni-university-root-id&moduleType=DegreeProgramme&limit=1000.
Tutkintojen rakenteet on kuvattu Sisussa käyttäen suunnilleen seuraavanlaista tyyppihierarkiaa:
Abstrakti kattotyyppi
Module
.Omaa konkreettiset alityypit
Education
,DegreeProgramme
,StudyModule
jaGroupingModule
, jotka kuvaavat koulutuksen ja tutkintorakenteen osia.Harjoitustyön puitteissa emme tarvitse
Education
-tyyppisiä moduleita, joten kyseistä tyyppiä ei esitellä tarkemmin.
Sisun API tarjoaa päätepisteitä modulien hakuun esim.
id
:n taigroupId
:n perusteella.Tietyn
id
:n omaavan modulin (tässä esim.id
on “otm-1d25ee85-df98-4c03-b4ff-6cad7b09618b”) tarkemmat tiedot saa seuraavanlaisella pyynnöllä: https://sis-tuni.funidata.fi/kori/api/modules/otm-1d25ee85-df98-4c03-b4ff-6cad7b09618bTietyn
groupId
:n omaavan modulin (tässä esim.groupId
on “uta-ok-ykoodi-41176”) tarkemmat tiedot saa seuraavanlaisella pyynnöllä: https://sis-tuni.funidata.fi/kori/api/modules/by-group-id?groupId=uta-ok-ykoodi-41176&universityId=tuni-university-root-idSisu palauttaa modulit JSON-muodossa, ja kukin moduli sisältää attribuutin
type
, joka kertoo kyseisen modulin konkreettisen tyypin (jokin yllämainituista alityypeistä).
DegreeProgramme
.Tutkintorakenteen juuritaso, joka kertoo tutkinnon nimen, laajuuden opintopisteinä jne.
StudyModule
.Opintokokonaisuus, jonka alaisuudessa on yleensä useita kursseja tai alimoduleita.
Opintokokonaisuudesta voi saada suoritusmerkinnän opintorekisteriin, ja sen yhteydessä on tietoa esim. opintokokonaisuuden laajuudesta opintopisteinä, arvostelukriteereistä sekä vastuuhenkilöistä.
GroupingModule
.“Tekninen apuväline” kuvaamaan tutkintorakenteen hierarkian välitasoa, jonka alaisuudessa on yleensä useita kursseja tai alimoduleita mutta joka ei kuitenkaan ole varsinainen opintokokonaisuus.
Eroaa opintokokonaisuudesta lähinnä siinä, että tästä ei voi saada erillistä suoritusmerkintää, eikä tämän yhteydessä siten ole tietoa esim. opintopisteistä, yms.
CourseUnit
.Kuvaa opintojakson: esim. koodi, nimi, laajuus opintopisteinä, kurssin kuvaus, jne.
Tämä ei Sisussa ole
Module
:n alityyppi, ja kurssitietoja haetaankin Sisusta API:sta eri päätepisteiden kautta kuin moduleita. Kurssejakin voi hakea esim.id
:n taigroupId
:n perusteella.Tietyn
groupId
:n omaavan kurssin (tässä esim.groupId
on “uta-ykoodi-47926”) tarkemmat tiedot saa seuraavanlaisella pyynnöllä: https://sis-tuni.funidata.fi/kori/api/course-units/by-group-id?groupId=uta-ykoodi-47926&universityId=tuni-university-root-idModulit, joiden alaisuudessa on suoraan kursseja, viittaavat kursseihin niiden
groupId
:n avulla.
Tutkintorakenne koostuu puumaisesta modulihierarkiasta. Kukin moduli, modulin tyypistä riippumatta,
sisältää attribuutin rule
, joka kuvaa kyseisen modulin alimodulit (= sen lapset
puurakenteessa). Tutkintorakenteen voi siten käydä läpi / prosessoida aloittamalla sen juuritasolta
eli sen DegreeProgramme
-modulista, ja käymällä rekursiivisesti läpi kunkin kohdatun modulin
rule
-attribuutin kuvaamat alimodulit. Kunkin yksittäisen konkreettisen rule
:n kohdalla on
ilmaistu sen tyyppi. Esim. CourseUnitRule
ja ModuleRule
kuvaavat tiettyjä suoraan modulin
alaisuuteen kuuluvia kursseja tai moduleita. Sen sijaan AnyCourseUnitRule
ja AnyModuleRule
ilmaisevat, että kyseisen modulin alaisuuteen saa lisätä mitä vain kursseja tai moduleita.
Edellämainittujen tyyppien tekniset kuvaukset löytyvät aiemmin jo mainitun Sisun Kori API:n dokumentaatiosivun https://sis-tuni.funidata.fi/kori/swagger-ui/index.html?configUrl=/kori/v3/api-docs/swagger-config&filter=true alaosasta.