Handledarvänlighet (Om något saknas: ingen redovisning)

Färsk utskrift

Se till att ha en färsk uppdaterad utskrift av programmet.

På unix kan man få lite snyggare utskrifter med programmet a2ps (kan kräva module add a2ps).

Godkänd spec (eller G/S i labblistan)

Ta med din godkända specifikation. På unix kan man se om man är godkänd på specifikationen med kommandot res show kursomgång t.ex:
res show prgo04

Färdig prototyp (endast betyg 3)

De som valt uppgift med färdig prototyp (ger endast betyg 3) behöver inte ha en godkänd specifikation.

Granskningsprotokoll och granskaren

Granskaren ska närvara under redovisningen. Handledaren ska fråga granskaren om dennes åsikter om programmet. Prorammet kan fortfarande bli godkänt även om granskaren varit väldigt hård i sin bedömning. Ofta har den som redovisar hunnit ändra programmet. Ha kvar den ursprungliga kritiken (granskningsprotokollet) av programmet.

Granskningen kan underkännas om man inte ens försökt hitta fel i ett program med uppenbara fel.

Användarvänlighet

Informativa utskrifter

Programmet ska tala om för användaren vad programmet gör i varje steg och vad för inmatningen som förväntas. Ett dåligt exempel kan se ut så här.

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.

Enkel inmatning

Anmärk på programmet om inmatningen onödigt krånglig.

...
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
...


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.

Programmerarvänlighet

Vettiga namn

Programmet ska ha intuitiva namn på variablerna. För den som skrivit programmet är allt ofta självklart inte för den som granskar.

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.

Kommentarer

Alla klasser och metoder måste kommenteras. Berätta syftet med klassen/metoden. Det ska räcka att läsa kommentar och metodhuvud för att förstå hur en metod ska användas man ska alltså inte behöva titta i koden.

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.

Konsekvent språk

Var konsekvent i ditt språkval. Alla variabel/metodnamn på ett språk. Alla kommentarer på ett språk. Det är OK att ha engelska variabel/metodnamn och kommentera på svenska. Undvik svengelska (sejva svenska språket)

Konsekvent typografi

Skriv ihop ord genom att inleda med stor bokstav därefter små. Variabel- och metodnamn inleds med med liten bokstav och klasser inleds med stor bokstav.
    class EnBraKlass
    class EnTillBraKlass

    void enMetodSomTarTreParametrar(int x, int y, int z)
    int ettHeltal

Felhantering

För betyg fyra krävs att programmet kan hantera fel som uppstår. Ofta behövs en slinga, t.ex. vid inmatning för att programmet ska kunna gå vidare.

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

Har man många inläsningar från tangentbordet där fel kan uppstå är den bästa lösningen att man skriver en metod som tar hand om inläsningen. Det finns exempel på en sådan i Javahäftet.

Strukturering

Lämplig uppdelning i klasser

Undvik att ha all kod i en enda klass. Försök ha fler klasser för olika uppgifter.

Lämplig uppdelning av metoder

Sträva efter att ha specialiserade metoder som bara gör en sak.

    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.

Temporära variabler så lokalt som möjligt

Deklarera tillfälliga variabler så lokalt som möjligt. Det är ett grovt fel att ha loop-variabler som instansvariabler. I koden nedan antas in vara en instansvariabel av typen BufferedReader initierad att läsa från tangentbordet.

    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.

Återanvändbara metoder/klasser

En del uppgifter kan separera i klasser som kan återanvändas i andra program.

Specialicerade metoder kan man använda i andra sammanhang jämför avsnittet om metoder ovan

In- och utdata till metoder

Var noga med in och utdata till metoderna. En del metoder som t.ex. bara skriver ut på skärmen kan vara parameterlösa void-metoder. Övriga metoder har in och utadata. Om metoden använder instansvariabler ska detta kommenteras.

Flexibelt/utbyggbart program

Skriv ditt program så att det lätt att utöka och bygga ut.

Ingen kodupprepning

Ett vanligt nybörjarfel när man programmerar är att använda taktiken klippa och klistra. Det leder dock till kod som är väldigt svår att underhålla. Om man ändrar på ett ställe måste man göra samma ändring på flera parallellställen.

Ingen hårdkodning

Undvik att hårdkoda värden så gott det går. Om du behöver använda siffervärden kan man deklarera dessa som konstanter.
    final int antalSpelare = 4;
    final double pi =3.14;

Följande punkter är nödvändiga (måste alltid åtgärdas)

Uppfyller kraven i lydelsen

Programmet måste uppfylla kraven i j-uppgiftslydelsen. Det är inte tillåtet att förenkla uppgiften. Om du vill göra några förändringar bör du förankra det med kursledaren först. Du måste kunna visa en bekräftelse (ett ebrev t.ex.) på att kursledaren godkänt kravförändringar.

Detaljförståelse

Vid redovisningen ska man kunna redogöra för alla detaljer i koden. Handledaren ska kunna ta bort en rad och man ska kunna förklara vad som händer.

Kan fylla i kursenkäten på webbsidan

Vid kursens slut kommer en datoriserad enkätundersökning genomföras. Denna enkät är anonym och väldigt viktig för kursen såväl som för lärarna. Vid kursens slut ska man veta var man hittar kursenkäten. Kursen utvecklas och synpunkter på kursen tas upp till nästa år.