ot-harjoitustyo's People
ot-harjoitustyo's Issues
Koodikatselmointi
Koodikatselmointi
Yleistä
Perustuu aamulla 1.5.2021 ladattuun koodiin.
En saanut release 1:n .jarria toimimaan java -jar WeightandBalance-1.0-SNAPSHOT.jar
komennolla. Tulostuu Javan virheilmoitus:
ClassNotFoundException: com sun.prism.es2.X11GLFactory
...
Sain sovelluksen kuitenkin toimimaan hakemalla repon zipin (aamulla 1.5.21) ja ajamalla komennon mvn package
. Tämäkään ei toiminut heti, vaan antoi ilmoituksen virheellisestä luokkatiedoston nimestä wbapp/dao/acDataDao.java
. Kun nimen korjasi isolla alkavaksi, niin maven suostui tekemään jarrin target hakemistoon, joka vihdoin toimi.
Lisää pienempää ongelmaa tuotti Postgressin käyttö projektissa. Projektille mielestäni ehkäpä sopisi paremmin kevyempi ja helpommin käytettävä sqlite. Yritin myös luoda taulut käyttämällä annettua schemaa, mutta se kaatui virheisiin. Annettu referenceValues.txt
sisälsi kuitenkin toimivat komennot.
Yleiskatsaus koodista
Ohjelmaa on mielestäni yritetty jakaa ihan järkevästi eri luokkiin niin, että esim. käyttöliittymä ei tuntisi tietokantaan liittyvää implementaatiota. Tässä ei kuitenkaan mielestäni onnistuttu täysin, sillä tietokanta-implementaation enkapsuloivat Daot (UserDataDao ja AcDataDao) tällä hetkellä palauttavat public kysely-metodeilla suoraan kannasta saatuja ResultSettejä ja SQL-exceptioneitä. ResultSettien palauttaminen sellaisenaan vuotaa "julki" kannan toteutuksesta taulujen sarakkeet, joka siis lisää riippuvuuden tietokannan sisäisen muodon ja Daon käyttäjien kesken rikkoen enkapsulaation hyödyn. Tekemällä ResultSeteistä sopimuksen mukaiset listat (tai muun olion) ja palauttamalla ne, Dao-luokat piilottaisivat mielekkäämmin tietokannan sisäisen muodon Daon käyttäjiltä. Tämä mahdollistaisi esim. kannan muuttamista ilman, että muita luokkia tarvitsisi muuttaa. Sama myös pätee SQL-exceptioneihin, mutta ehkä vähän enemmän teoreettisella tasolla. Mitä jos tietokanta vaihdetaan vaikkapa pilvipohjaiseen tallennukseen, eikä se enää heitäkkään virhetilanteessa SQL-virheitä?
Tästä päädytään myös ongelmaan ohjelman rakenteessa: projektissa ei ole "ohjelmoitu interfaceen" eli käytettäisiin luokkia interfacen kautta, vaan toteutuksen kautta. Tälläisenään on Daon toteutuksen vaihtaminen toiseen hankalaa.
Toteutuksessa käytetään kiitettävästi riippuvuuksien injektointia ja yritetään välttää turhia riippuvuuksia luokkien kesken. En myöskään löytänyt liian pitkiä metodeja, josta kiitosta kirjoittajalle.
Luokkien toteutuksesta
wbapp/dao/UserDataDao.java:
- Arkkitehtuurikommentit liittyen Daojen toteutukseen.
- Metodien nimistä: checkName hieman hämäävä, toimisiko esim. findName tai jokin sellainen paremmin? sama checkPasswordille.
wbapp/dao/acDataDao.java:
- Arkkitehtuurikommentit liittyen Daojen toteutukseen.
- Tiedoston nimi tulisi alkaa isolla kirjaimella.
- On hieman hankalempaa sanoa nimistä mitään, kun en niin ohjelman tarkoituksesta ymmärrä. Ehkäpä getCount:n voisi nimetä kuvaamaan tarkoitusta paremmin. Olisiko depend-loppuisille metodeille myös jokin parempi nimi? Liittyykö näiden nimien ongelmaan yleisemmin AircraftDatan tiedon jäsentelyn ongelmat?
wbapp/domain/Aircraft.java:
- Metodien ja muuttujien nimistä voisi tiputtaa sanan "ac" pois. Minkä muun kuin lentokoneen id:tä haetaan, kun lentokone olion getId()-metodia kutsutaan?
wbapp/domain/AircraftData.java:
- Johonkin tiettyyn lentokoneeseen liittyvä luokka AircraftData on täysin irrallaan Aircrafistä? Eikö jokaisella lentokoneella voisi olettaa olevan referenssi omaan Dataansa?
- Luokassa on turhia metodeja, joita ei kutsuta ollenkaan. Esim. getmaxWeight(), joka myös rikkoo camelCase nimeämistä.
- Metodi getCount2() ei ole kovinkaan kuvaava tehtävästä työstä? Mitä tarkoittaa count2?
- Luokalla on 3 2-ulotteista taulukkoa oliomuuttujina, joiden nimet ovat dataList, dataList2 ja dataList3. Nämä nimet ovat todella sekavia ulkoiselle lukijalle. Mitä ne tarkoittavat ja mitä niillä tehdään? Samoin kyseisiä listoja käytetään vain kylmästi numeerisilla indekseillä. Esim. mitä tarkoittaa dataList[1][3]? On helppo ymmärtää, kun ohjelmaa kirjoittaa ja kaikki on tuoreellaan mielessä, mutta entä pari kuukautta myöhemmin?
- Muuttujien nimeämisessä metodien sisällä on ongelmia: esim createFullItemList():n muuttujat p, k, i ja l eivät ole yhtään kuvaavia siitä mihin niitä käytetään.
wbapp/domain/AircraftList.java:
- Kuinka mielekästä on tehdä riippuvuus sovelluslogiikan koodiin yksittäisen graafisen käyttöliittymän tietorakenteisiin (JavaFX:n collectionit)? Entä jos käyttöliittymäkirjastoa muutetaan?
wbapp/domain/User.java:
- Kannattaisiko käsitteet käyttäjästä (User) ja käyttäjän hallinnasta (login yms) eriyttää?
wbapp/domain/WBCalculator.java:
- Samoja nimeämisongelmia kuin aiemmin. Index ja count?
- Ilmeisemmin indexin ja countin ei tarvitse olla olion muuttujia. Myöskään dataa ei erikseen missään uudelleenkäytetä.
wbapp/ui/Ui.java:
- Eri näkymistä voisi tehdä luokkia, jonka ansioista UI-luokan kokoa saisi pienemmäksi. Mitä tapahtuu luettavuudelle, jos ohjelman käyttöliittymä tästä vielä monimutkaistuu?
Testit
Esim. UserTestissä voisi myös testata uuden käyttäjän luontia, joka vaatisi, että testitaulut tyhjennetään alussa. Huomasin myös, että testit eivät voi epäonnistua, sillä assertEquals(false, false);
tyyliset lauseet ovat käsittääkseni aina totta. Ohjelman testikattavuus ei siis kerro mitään.
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.