Granigan / dungeongenerator

Dungeon generator algorithm with homemade data structures. Coursework for TIRALABRA @ HY.
0 stars 0 forks source link

Koodikatselmointi 1: to 23.8. n. klo 19:19 #1

Open Jsos17 opened 6 years ago

Jsos17 commented 6 years ago

Koodikatselmointi 1: to 23.8. n. klo 19:19

Katselmoinnin aloitus ja repositorion lataus omalle koneelle to 23.8. n. klo 19:19

Yleinen positiivinen palaute:

Parannusehdotuksia ja (sivu)huomautuksia:

HomemadeRandom luokka

HomemadeRandom luokassa nextInt() metodissa käytetään jakolaskua kun jakajana (divider) on kakkosen potenssi eli 65536 = 2^16. Kuten TiTossa opittiin, luvun bittien siirto yhden vasemmalle kertoo luvun kahdella ja bittien siirto oikealla jakaa luvun kahdella. Näin ollen jakolaskun pystynee korvaamaan ekvivalentilla bittimanipuloinnilla eli bittien siirrolla oikealle eli:

(int) (seed >> 16) 

Tämän pitäisi antaa sama tulos ei-negatiivisilla luvuilla (eli positiivisilla luvuilla ja nollalla) mutta tietokoneelle paljon nopeammalla bittioperaatiolla. Koska näitä pseudosatunnaislukuja tuotetaan joka iteraatiolla esimerkiksi luokan DungeonMap addRooms() metodissa, niin tehokkuushyöty voi olla merkittävä (mahdollisesti). Toki en tiedä osaako compiler automaattisesti tunnistaa tällaiset optimointimahdollisuudet jolloin oma säätö olisi turhaa.

Linkkejä aiheesta: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html https://en.wikipedia.org/wiki/Bitwise_operation#Shifts_in_Java

DISCLAIMER: Kannattaa vielä tarkistaa, että tämä toimii myös rajatapauksissa ennen kuin tekee muutokset ja kiinnittää huomiota että merkki säilyy jne.

Lisäksi

Luvut joiden on tarkoitus säilyä muuttumattomina (kuten vaikka divider) voi laittaa lopulliseksi: final long divider jne.

HomemadeRandom luokassa voisi konstruktorissa olla lyhyt selitys valittujen numeroiden logiikalle vaikka linkki lähteeseen onkin luokan alussa. Kuitenkin osa noista numeroista on hyvinkin tarkalla perusteella valittu ja niitä ei mahdollisen toisen kehittäjän parane muuttaa, jos ei tiedä mitä tekee.

RoomBuilder

RoomBuilder luokassa voinee lisätä @Override kaikkiin interface metodeihin (NetBeans huomauttaa).

RoomBuilderTest luokassa testataan useampia taulukoita pelkällä assertEquals-metodilla, toisaalta myöhemmin on käytetty assertArrayEquals-metodia. En tiedä onko tälle vertailutavalle joku erikoinen syy, testit toki menevät läpi mutta NetBeanskin selkeästi huomauttaa tästä.

DungeonMap

Karttaa tallennettaessa try-with-resources on vaihtoehto jossa resurssi suljetaan automaattisesti (myös virhetilanteiden sattuessa) ja ehkä myös käyttäjälle jonkinlaisen virheviestin antaminen poikkeuksen heittämisen lisäksi. IOExceptionin voisi esimerkiksi ottaa kiinni mainissa ja kertoa käytäjälle mikä meni pieleen.

NetBeans tekee automaattisesti muunnoksen painamalla alt+enter pw muuttujan kohdalla ja valitsemlla try-with-resources:

public void saveMap() throws IOException {
    FileWriter fw = new FileWriter("generated_map.txt");
    try (PrintWriter pw = new PrintWriter(fw)) {
        pw.print(toString());
    }
}

Sivuhuomatus testiluokista

Sivuhuomautuksena: Ainakin viimeistään loppupalautuksessa kannattaa poistaa testiluokista turhat käyttämättömät setUpClass(), tearDownClass() ja niihin liittyvät importit BeforeClass, AfterClass jne. Toki voi olla että näin on aiottukin tehdä ja ne ovat siellä koska autogeneroitu ja ei tarkalleen tiedetä tarvitaanko niitä.

Loppusanat

Tsemppiä erityisesti HashMapin ja ArrayListin korvaajien tekoon!

Granigan commented 6 years ago

Kiitos erinomaisesta palautteesta ja vinkeistä!