Ohjelman rakenne noudattaa kerrosarkkitehtuuria. Koodin pakkausrakenne on seuraavanlainen:
Pakkaus ui sisältää käyttöliittymästä vastaavat luokat. Entities
-pakkaus sisältää yksittäistä tehtävää kuvaavan luokan ja database-pakkaus sisältää tietokantatiedostot, sekä niihin yhteyden muodostavan luokan. Pakkauksesta services
löytyvät sovelluksen toiminnasta vastaavat luokat.
Käyttöliittymä sisältää seuraavat näkymät:
- Aloitusruutu, josta siirrytään tekemään tehtäviä tai muokkaamaan sanalistoja
- Sanalistanäkymä
- Tehtävänäkymä, josta siirrytään tehtävien omiin näkymiin. Nämä näkymät on toteutettu samassa luokassa
Nämä kolme näkymää on toteutettu omina luokkinaan. Näkyvissä voi olla joko aloitusruutu, tehtävänäkymä tai jonkin tietyn tehtävän oma näkymä. Listanäkymä avautuu omaan ikkunaansa.
Näkymien näyttämisestä vastaava koodi on toteutettu UI-luokassa. ui-pakkaukseen on pyritty toteuttamaan vain graafisesta käyttöliittymästä vastaavaa koodia. Käyttäjältä saatujen syötteiden ja muun tiedon käsittely on pyritty toteuttamaan services-pakkauksessa ja yksittäistä tehtäväinstanssia kuvaavassa Exercise-luokassa.
Sovelluksen keskeisimmän toiminnan muodostavat Exercise- ja Logic-luokat. Exercise
-luokka kuvaa yksittäistä tehtävää, joka saa uudet vastausta ja vastausvaihtoehtoja kuvaavat muuttujansa Logic
-luokan kautta. Exercise
-luokka tarjoaa myös metodin, joka vertaa annettua sanaa sen hetkiseen vastaukseen.
services
-pakkauksen muut luokat sisältävät tietokantaa ja siihen syötettävää tietoa käsitteleviä toimintoja.
Ohjelman käyttämät sanalistat on tallennettu SQLite-tietokantaan, joka löytyy database
-pakkauksesta. Tietokannan taulukkojen käsittelystä vastaavat luokan DatabaseMethods metodit, jotka on toteutettu ulkoisen sqlite-utils-kirjaston avulla.
Sovellus tarjoaa käyttäjälle mahdollisuuden lisätä taulukkoon kerralla useita rivejä csv-tiedostosta. ListFromCSV-luokka vastaa tiedoston sisältämän tiedon muuttamisesta sqlite-utils
-kirjaston vaatimaan muotoon.
Tiedoston tulee noudattaa samaa formaattia kuin tietokannan taulukot - eng, kor. Sovellus tarkistaa, että kaikki tiedoston sisältämät merkkijonot ovat oikeassa muodossa ennen niiden lisäämistä taulukkoon. Taulukot käyttävät pääavaimenaan annettuja koreankielisiä sanoja, jonka seurauksena sanan löytyessä jo kohdetaulukosta sovellus päivittää vain sen englanninkielisen käännöksen. Tämä varmistaa, että taulukoihin ei päädy sama sana useasti.
Sovelluksen käyttämän tietokantatiedoston nimi on määritelty juuressa sijaitsevassa .env-konfiguraatiotiedostossa. Oletustiedosto on nimeltään wordlists.db
.
Listanäkymä vastaa suurinpiirtein SQL-kyselyjen graafista esitystä, minkä takia en koe tarpeelliseksi kuvata niitä erillisillä sekvenssikaavioilla.
Seuraava kaavio kuvaa sovelluksen toimintaa, kun käyttäjä valitsee tehtävätyypin:
Jokaisen tehtävätyypin graafinen esitys on hieman erilainen, mutta ne kaikki toimivat suurinpiirtein samalla, kaavion kuvaamalla, tavalla. Käyttäjän klikatessa tehtävätyyppiä vastaavaa nappulaa, tapahtumankäsittelijä luo uuden Exercise
-objektin. Exercise
-objekti luo uuden Logic
-objektin ja kutsuu sen metodia randomize
, joka kutsuu objektin omaa fetch_wordlist
-metodia, joka hakee DatabaseMethods
-luokan metodin get_table
avulla tietokannasta sille annettua merkkijonoa vastaavan nimisen taulukon. randomize
-metodi arpoo taulukon sisältämästä sanalistasta viisi sanaparia, joista se arpoo vielä yhden oikean vastauksen. Metodi palauttaa nämä muuttujat, jotka käyttöliittymä näyttää käyttäjälle harjoiteltavana sanana ja mahdollisina vastausvaihtoehtoina.
Seuraava kaavio kuvaa vielä sovelluksen toimintaa, kun käyttäjä tarkistaa vastauksensa klikkaamalla Check
-nappulaa.
TableGetter-luokka käytännössä toistaa DatabaseMethods
-luokan metodin get_table
. Metodi erotettiin omaan luokkaansa, jotta koodiin ei muodostuisi riippuvuskehiä, mutta se on todennäköisesti muodostunut turhaksi koodin refaktoroinnin myötä.
Taulukkoon lisättävää tietuetta testaava koodi ei oikeasti tunnista merkkijonojen kieliä vaan tarkistaa pelkästään, että niistä ei löydy kiellettyjä merkkejä. Käytännössä siis eng_is_valid
-metodi päästää läpi minkä tahansa englannin aakkosista koostuvan merkkijonon, esimerkiksi glxblt
. Vastaavasti kor_is_valid
päästää läpi myös muut merkkijonot, jotka koostuvat muista kuin latinalaisista kirjaimista. Sanan tunnistaminen oikeaksi kohdekielen sanaksi vaatisi omat kielentunnistukseen tarkoitetut kirjastonsa.
Käyttöliittymään on jääny jonkin verran toisteisuutta esimerkiksi eri tehtävätyyppien näkymien välillä. Lisäksi jotkin graafiset komponentit voisi toteuttaa fiksummin.