1. #1
    Weetikveel's schermafbeelding
    Lid sinds
    11/04/10
    Locatie
    verdwaald
    Berichten
    521
    iTrader
    4 (100%)

    good coding practises - feedback gevraagd

    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!
    The pen is mightier than the sword, and considerably easier to write with.

  2. #2
    Oldskooler's schermafbeelding
    Lid sinds
    22/01/07
    Locatie
    0000
    Berichten
    13.080
    iTrader
    0
    Reputation
    0/407
    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

    ...
    Laatst gewijzigd door Oldskooler; 11 juli 2019 om 09:05

  3. #3
    Oldskooler's schermafbeelding
    Lid sinds
    22/01/07
    Locatie
    0000
    Berichten
    13.080
    iTrader
    0
    Reputation
    0/407
    - 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
    Laatst gewijzigd door Oldskooler; 11 juli 2019 om 09:07

  4. #4
    Weetikveel's schermafbeelding
    Lid sinds
    11/04/10
    Locatie
    verdwaald
    Berichten
    521
    iTrader
    4 (100%)
    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-nev...eck-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 . 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.
    The pen is mightier than the sword, and considerably easier to write with.

  5. #5
    Weetikveel's schermafbeelding
    Lid sinds
    11/04/10
    Locatie
    verdwaald
    Berichten
    521
    iTrader
    4 (100%)
    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).
    The pen is mightier than the sword, and considerably easier to write with.

  6. #6
    Oldskooler's schermafbeelding
    Lid sinds
    22/01/07
    Locatie
    0000
    Berichten
    13.080
    iTrader
    0
    Reputation
    0/407
    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
    Laatst gewijzigd door Oldskooler; 12 juli 2019 om 08:09

  7. #7
    NoGo's schermafbeelding
    Lid sinds
    22/08/11
    Locatie
    Borgloon
    Berichten
    1.440
    iTrader
    122 (100%)
    Reputation
    0/3
    Citaat Oorspronkelijk geplaatst door Weetikveel Bekijk bericht
    Deze quote is verborgen omdat je deze gebruiker negeert. Weergeven
    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 . 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.
    (='.'=)

  8. #8
    Destel's schermafbeelding
    Lid sinds
    12/11/13
    Locatie
    Gent
    Berichten
    2.699
    iTrader
    8 (100%)
    Reputation
    0/170
    Je kan ook altijd terecht op https://codereview.stackexchange.com/, zelf heel goede ervaringen mee
    PS4 / PS2 / PSX / Xbox 360 / Wii / NES // Raspberry Pi Zero W / 3B / 3B+
    iMac 27" (2017) / HP ProBook 650 G1 / iMac 24" (Early 2008) // iPad Air 2 / iPhone 6S
    Projecten: mijnscore & frequency trainer

  9. #9
    Weetikveel's schermafbeelding
    Lid sinds
    11/04/10
    Locatie
    verdwaald
    Berichten
    521
    iTrader
    4 (100%)
    Bedankt allemaal.
    The pen is mightier than the sword, and considerably easier to write with.

Regels voor berichten

  • Je mag geen nieuwe discussies starten
  • Je mag niet reageren op berichten
  • Je mag geen bijlagen versturen
  • Je mag niet je berichten bewerken
  •  

Inloggen

Inloggen