På unix kan man få lite snyggare utskrifter med programmet a2ps (kan kräva module add a2ps).
res show prgo04
Granskningen kan underkännas om man inte ens försökt hitta fel i ett program med uppenbara fel.
Ge tal1 : 26
och tal2 : 54
29 31 37 41 43 47 53
Man ska inte behöva titta i en manual eller ännu värre själva programkoden för at förstå vad som händer. Att köra programmet måste vara självinstruerande.
Hej och välkommen till primtalsprogrammet. Programmet
skriver ut alla primtal i ett intervall du definierar.
Ange lägre gränsen i intervallet: 26
Ange högre gränsen i intervallet: 54
De primtal som finns mellan 26 och 54 är:
29 31 37 41 43 47 53
Det senare exemplet är mycket lättare att förstå när man kör programmet.
...
Förutom att vara väldigt sen med att kläcka ur sig
att det inte finns något flyg den önskade resdagen
så verkar det inte finnas något sätt att boka en mängd
biljetter. Att boka en klassresa med det systemet skulle
vara väldigt enerverande.
Vill du boka en biljett?ja
Varifrån åker du? Arlanda
Vart ska du åka? Kastrup
Vilken månad ska du åka? Mars
Vilken dag ska du åka? 25
Vill du boka returbiljett?ja
Vilken månad ska du tillbaka? April
Vilken dag ska du tillbaka? 5
Det går tyvärr inget flyg den 25 mars.
Försök igen
Vill du boka en biljett?ja
Varifrån åker du? Arlanda
Vart ska du åka? Kastrup
Vilken månad ska du åka? Mars
...
Nedanstående programkod är ganska svår att tyda
int namn = 0; for (int kalle = 0; kalle < pelle.length; kalle++) { if (pelle[kalle] > namn) namn = pelle[kalle]; }Här följer samma kod med andra variabelnamn.
int max = 0; for (int i = 0; i < vektor.length; i++) { if (vektor[i] > max) max = vektor[i]; }
Man ser nu lättare vad koden gör, koden sparar undan det högsta värdet i vektorn till variablen max. Fortfarande är det inte optimalt bra namn på vektorn. Vad för slags värden innehåller den? Är det löner, skottstatistik eller vad?
Generellt brukar bra namn på metoder oftast vara verb som beskriver vad metoder gör. Klaser och variabler är ofta substantiv som beskriver vad klassen/variabeln är.
Det ska sägas att det är väldigt svårt att komma på bra namn.
In och utdata till metoder måste kommenteras. Det gäller både returvärden, parametrar och eventuella instansvariabler metoden använder sig av. Alltså om metoden använder sig av instansvariabler ska detta kommenteras.
Kommentarer ska inte förklara hur Java fungerar. Förutsättningen är att den som läser källkoden redan vet hur man programmerar. Kommentarer som förklarar t ex att en if-sats gör ett val och att en slinga upprepar något ska inte vara med vid redovisningen. Den som redovisar måste själv veta sådant utan anteckningar.
class EnBraKlass class EnTillBraKlass void enMetodSomTarTreParametrar(int x, int y, int z) int ettHeltal
Ange täljare: 1000
Ange nämnare: 0
Oj oj, nämnare får inte vara noll försök igen.
Ange nämnare: 10
1000 delat med 10 blir 100
int [] lasFranFil() throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Vad heter filen?"); String filnamn = in.readLine(); in = new BufferedReader(new FileReader(filnamn)); List list = new ArrayList(); String row = in.readLine(); while (row != null) { list.add(row); row = in.readLine(); } int [] vek = new int [list.size()]; for (int i = 0; i < list.size(); i++) { vek [i] = Integer.parseInt((String) list.get(i)); } return vek; }
Koden ovan gör flera saker; frågar efter en fil, läser in allt data från filen, gör om datat till heltal, stoppar in heltalen i en heltalsvektor och returnerar denna. Det är bättre att dela upp dessa uppgifter på flera metoder så att metodanropen blir:
String filNamn = fragaFil(); String [] fildata = laesFranFil(filnamn); int [] intresseantaTal = konvertera(fildata);Programmet blir mer flexibelt. Metoden frågaFil kan skrivas om till ett grafiskt GUI där man klickar på rätt fil. Metoden laesFranFil kan användas i andra sammanhang då man vill läsa från fil. Man kan skicka fildatat till en ny metod som kontrollerar data innan man anropar konvertera.
List lasFranFil() throws IOException { in = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Vad heter filen?"); String filnamn = in.readLine(); in = new BufferedReader(new FileReader(filnamn)); row = in.readLine(); while (row != null) { list.add(row); row = in.readLine(); } return list; }
Notera att metoden sätter om instansvariabel in att peka på en ny BufferedReader som läser från fil. Övriga metoder som använder in kommer att påverkas. Även om programmet fungerar ändå (ingen annan metod använder in) kan man få allvarliga problem om man försöker utöka programmet. Även row och list verkar vara deklarerade som instansvariabler helt i onödan.
Specialicerade metoder kan man använda i andra sammanhang jämför avsnittet om metoder ovan
final int antalSpelare = 4; final double pi =3.14;