Archief - good coding practises - feedback gevraagd

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Weetikveel

Legacy Member
Sinds kort ben ik begonnen met java op eigen houtje te leren. Ik heb ooit al wat geprogrammeerd, maar dat is lang geleden. Ik heb nu de beide cursussen gestudeerd op Udacity (java functional programming en oop programmeren in java).

En nu probeer ik wat te oefenen. Ik maakte een spelletje blad steen schaar. Dat lukt wel zonder al te veel problemen (het werkt), maar ik vraag me af of ik wel 'good coding practises' toepas. Ik weet niet zo goed of de opdeling in de verschillende klassen een goeie manier is zoals ik heb hier heb gedaan. Het programmeren zelf is vrij eenvoudig, maar een zinvolle structuur voor het programma vinden (met de opdeling in klassen en het in de juiste klasse plaatsen vd methoden etc.) vind ik veel moeilijker (iedereen wellicht).

Het project staat op Github: https://github.com/whatdoiknowyouknow/rockpaperscissors .

Kunnen jullie hierover feedback geven? Alvast bedankt!

Ik bedacht zelf alvast dat het misschien wat raar is dat humanPlayer een child class vormt van Player. Want de class Player is voor een stuk 'de computer' die speelt, maar er staan methoden in die zowel voor de computer als voor de menselijke speler van toepassing zijn (getScore bijvoorbeeld).

Ik heb zelf ook alvast een paar bijkomende concrete vragen (maar de vraag naar feedback over 'good coding practises' is het belangrijkst):

- Is het mogelijk om op één of andere manier de variabele 'name' vd speler (in klasse player) private te houden? Ik slaag er in dat geval niet in om die dan aan te passen in de functie setPlayerName in de child class. Staat nu dus public.

- Ik snap niet zo goed wat er in de constructor hoort, en wat erboven. Ik merk wel dat het programma niet werkt als ik een aantal regels in de constructor zet (bepaalde variabelen definiëren), dus zet ik ze er dan maar boven, en dan werkt het wel, maar waarom dat nu zo juist moet, dat begrijp ik niet.

- Is het ok om meteen in de constructor gebruik te maken van methodes van de betreffende class (in de class Game)?



Alvast bedankt!

Oldskooler

Legacy Member
Goh, dat is terug naar de absolute basis van java.

Opmerkingen:
getters en setters privaat maken. Alle methoden privaat maken zover mogelijk is.

Ook geen rechtstreekse verwijzingen.
Dus niet:
game.player2.getHand();
Wel:
game.getPlayer2().getHand();

null checks steeds doen. Als game of player null zijn, krijg je een nullpointerexception.
Nu lijkt dat mss niet zo evident, maar als je grotere programma's maakt, waarbij code herbruikt wordt, is dat wel evident.

Uiteindelijk zijn dit conventions waar je vroeg of laat niet meer buiten kan.
Zeker als je met Spring en Hibernate te maken krijgt.

Inkomende parameters steeds final maken
getHandIndex(String hand){
=>
getHandIndex(final String hand){


public static final String[] possibleHands = new String[]{"rock", "paper", "scissors"};
=> Je kan ook een List maken: https://www.javatpoint.com/java-arraylist


Dan kan je deze List ook gemakkelijk loopen ipv met een klassieke iteratie.
for (int i = 0; i<possibleHands.length;i++){
=>
for (String i : possibleHands)

Of je kan methodes van de List gebruiken.
Bv contains().
Dan moet je niet itereren, en vergelijken.
Gewoon: possibleHands.contains(hand) => true/false

=> 1 regel code maar

...

Oldskooler

Legacy Member
- Is het mogelijk om op één of andere manier de variabele 'name' vd speler (in klasse player) private te houden? Ik slaag er in dat geval niet in om die dan aan te passen in de functie setPlayerName in de child class. Staat nu dus public.

=> omdat je in Humanplayer dit doet.
this.name = scanner.nextLine();

Je kan name wel protected maken. Protected zit tussen private en public.
Je gebruikt een variabele die private is in Player, maar is dan niet meer aanroepbaar in Humanplayer.

"A subclass does not inherit the private members of its parent class. However, if the superclass has public or protected methods for accessing its private fields, these can also be used by the subclass."


- Ik snap niet zo goed wat er in de constructor hoort, en wat erboven. Ik merk wel dat het programma niet werkt als ik een aantal regels in de constructor zet (bepaalde variabelen definiëren), dus zet ik ze er dan maar boven, en dan werkt het wel, maar waarom dat nu zo juist moet, dat begrijp ik niet.

Erboven zet je uw klasse variabelen, die herkenbaar moeten zijn binnen de klasse overal.
In de constructor initialiseer je ze gewoon of doe je al enkele bewerkingen.
Doe int i binnen de constructor, en enkel de constructor zal i kennen.

- Is het ok om meteen in de constructor gebruik te maken van methodes van de betreffende class (in de class Game)?

Ja

Weetikveel

Legacy Member
Wow! Hartelijk dank voor de uitgebreide reacties.

Getters en setters privaat maken begrijp ik niet zo goed. Getters en setters hebben toch in de eerste plaats de bedoeling om te communiceren met andere klassen? Ik kan er geen enkele private zetten zonder dat het programma niet meer werkt. Wel twee andere methoden, wat ik intussen gedaan heb.

Je bedoelt toch dat ik dan in de Game class twee aparte methodes aanmaak:

Code:
    public Player getPlayer1(){
        return player1;
    }

?

Gebruik ik dit overal, ook in de class 'Game', waarin de Player aangemaakt wordt? Bv. player1.setPlayerName(); => getPlayer1().setPlayerName(); ?

null checks zal ik wat meer over moeten lezen. Exception handling in die Udacity course is heel erg beperkt. Maar toch. Blijkbaar is ook niet iederéén het ermee eens: https://dzone.com/articles/why-i-never-null-check-parameters.

Inkomende parameters final maken lijkt mij een zeer goeie tip! Wat meer over gelezen intussen en zal allicht veel gedoe vermijden. Bedankt!

Ja, ik kende ArrayLists wel, maar ik dacht dat die misschien het programma zouden vertragen. Ik begrijp in feite niet goed waarom men nog arrays zou gebruiken als er arraylists bestaan. Als ik er wat verder over opzoek, blijkt dat niemand het in feite precies weet :D. Aan de performantie zou er niet veel veranderen blijkbaar ... (Ja, voor een progje blad-steen-schaar maakt dat natuurlijk niet uit, maar ik poog van bij het begin goede gewoonten aan te leren). Die ingebouwde methodes zijn heel handig. Die methode getHandIndex kan daarmee eigenlijk gewoon weg.

Je tweede post is zeer duidelijk. Geen verdere vragen daarbij. Bedankt.

Weetikveel

Legacy Member
Misschien nog een vraag, ik weet niet goed wat ik nu moet doen (behalve nog wat oefenen).
Welke cursussen kan ik nog volgen die aansluiten op java? Ik zoek vooral iets waarmee ik me op eigen houtje kan bezighouden, en dat een troef is op de arbeidsmarkt én dat vaak gebruikt wordt in combinatie met java.

Maar ik weet niet goed waar ik naar moet zoeken, ik ken er te weinig van. Ik lees wel termen hier en daar, maar ik weet niet waar ik naar op zoek moet, eigenlijk: xml, js, angular, ... Ik heb nauwelijks een notie van wat die termen betekenen (js een beetje).

Oldskooler

Legacy Member
Alle "getters en setters privaat maken" was idd fout van mij.

Ik bedoelde alle interne variabelen waar getters en setters (kunnen) voor bestaan, privaat maken.

Variabelen mogen niet zichtbaar zijn voor andere klassen, tenzij bepaalde statics.

Ben ik door de bocht gevlogen.


privaat maken:
Player player1 = new Player();
Player player2 = new HumanPlayer();

En dan idd publieke getters maken.



Gebruik ik dit overal, ook in de class 'Game', waarin de Player aangemaakt wordt? Bv. player1.setPlayerName(); => getPlayer1().setPlayerName(); ?

Nee, intern binnen de eigen klasse mag je player1.setPlayerName(); gebruiken.


Cursussen:
java gevorderden
spring
hibernate
sql

xml/json, google je maar. xsd's...

Front end, een angular 2.
basis html + basis javascript

NoGo

Legacy Member
Weetikveel zei:
Ja, ik kende ArrayLists wel, maar ik dacht dat die misschien het programma zouden vertragen. Ik begrijp in feite niet goed waarom men nog arrays zou gebruiken als er arraylists bestaan. Als ik er wat verder over opzoek, blijkt dat niemand het in feite precies weet :D. Aan de performantie zou er niet veel veranderen blijkbaar ... (Ja, voor een progje blad-steen-schaar maakt dat natuurlijk niet uit, maar ik poog van bij het begin goede gewoonten aan te leren). Die ingebouwde methodes zijn heel handig.

Voor meer performance kritieke stukken zou het verschil kunnen maken om arrays te gebruiken. Maar ook bijvoorbeeld als je een groot aantal primitieve waarden hebt (byte, int) zou een array performance/geheugen voordeel opleveren, omdat in Java het niet mogelijk is om te zeggen List<int>, wel List<Integer>. Echter in dat tweede geval maak je een object per primitive, dus heb je best wat extra geheugen voor elk getal + potentieel trager (omdat je het object moet opzoeken). Vandaar dat misschien int[] in dat geval beter zou zijn.

Maar je stelt terecht die vraag, over het algemeen gebruik je beter een abstractie zoals List, waar zo veel handige methoden bijkomen.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan