Tiralabra kurssin mukaisesti tässä viikon 5 vertaisarviontini. Projekti ladattu katselmointia varten pe 8.10.21 klo 10:03.
Yleisesti
Hienosti toteutettu sovellus käyttöliittymineen. Mielenkiintoista nähdä animoidusti kuinka toteuttamasi algoritmit toimivat. Vau! Projektin rakenne on järkevä: omat pakkaukset kutakin ylemmän tason toimintoa varten ja näissä olevat luokat ovat linjassa pakkauksen tarkoituksen kanssa ja palvelevat selkeästi juuri omaa tarkoitustaan. Koodiasi on yleisesti helppo lukea ja se on ymmärrettävää. Algoritmien tapauksessa kannattaa kokeilla löytää keinoja vähentää toisteista koodia, jotka on toteutettu kutakin suuntaa ("P","I","L" ja "E") varten. Annan muutamia vinkkejä alla. Lisäksi harkinnan arvoinen vinkki on, että jos kirjoitat kuvaksen, mitä metodin sisällä jokin pidempi koodinpätkä tekee, voi olla edullista tehdä siitä oma metodinsa, jota kutsutaan kommentin kohdassa. Toki oletkin jo toteuttanut järkevästi luokkien yksityisiä metodeja ehdotuksen mukaisesti.
Luokka: DeadEndFilling
Luokkassa on mahdollisuus selkeyttää koodia lisää ja vähentää toistuvia rivejä esimerkiksi seuraavasti korvaamalla rivit 45-81:
int suljettujaNaapureita = laskeSuljetutNaapurit(solmu);
int koko = verkko.hae(solmu).koko();
if (koko - suljettujaNaapureita == 0) {
suljettu[solmu] = true;
polku.lisaa(solmu);
break;
}
if (koko - suljettujaNaapureita == 1) {
int seuraavaSolmu = etsiSeuraavaSolmu(solmu);
solmu = seuraavaSolmu;
}
if (koko - suljettujaNaapureita > 1) {
break;
}
Luokka: Maze
Tässäkin voit kokeilla esim. seuraavaa riviltä n. 68 alkaen, jos haluat välttää toisteista koodia, (vaikkakin ehkä makuasia, kumpi sitten on selkeämpi):
int dx = 0;
int dy = 0;
if (suunta.equals("P")) {
dy = -1;
} else if (suunta.equals("I")) {
dx = 1;
} else if (suunta.equals("E")) {
dy = 1;
} else if (suunta.equals("L")) {
dx = -1;
}
visited[x + dx][y + dy] = true;
pino.lisays(new Pair<>(x + dx, y + dy));
Lisäksi tässä kohtaa voi olla mahdollista välttää suuntien koodaamista kirjaimiksi ja takaisin, mutta toisaalta, lähestymistapasi voi olla helpommin luettava verrattuna pelkkiin koordinaatteihin.
Luokka: WallFollower
Boolean muuttujiin liittyen vinkkinä, että arvon voi antaa suoraan muuttajalle ilman erillistä if-lausetta esim:
b1 = naapuri == solmu - 1;
//tämän sijaan:
if (naapuri == solmu -1) b1 = true;
Tässäkin kohtaa kannattaa miettiä saisiko useat samankaltaiset if-lause ja for-silmukka -osiot yhdistettyä esimerkiksi antamalla suuntakohtaiset muuttajanarvot ja ajaa ne sitten geneerisen loopin läpi.
Jatka samaan malliin, työsi on todella hyvässä vaiheessa! Hyvää työtä!