Att kommentera och indentera koden

Indentering

Med indentering menas att texten (exvis C++-satserna) på raderna raderna dras in så att de avspeglar programmets struktur. Ett välstrukturerat program är alltid indenterat.

Det är A och O med en god indentering: det ger en lättläst och bra struktur på C++-koden. Använd exvis principen att matchande måsvingar ({ och }) finns i samma kolumn. Det är också viktigt att indenteringen är konsekvent, att man använder samma metod genomgående i koden. När programmet skrivs har man nytta av det understöd för automatisk indentering som finns i själva editorn.

Ex 1: Indentering/kommentering = Läsbar programkod

{
   x=2;
      y=1;
    }
Skrivs bättre så här:
    
{
  x=2;
  y=1;
}
Använd samma indragning i alla satsblock. Ej så här:
{
  x=2;
  if (...)
     {
     y=2
     }
z=8;
}

Utan så här:
{
  x=2;
  if (...)
  {
    y=2
  }
  z=8;
}

Ex 2a: undermålig indentering och alltför kompakt kod:

int main()
{ double  belopp;
            double sum=0.0;
int    antal,i;
  cout<<"Ge antal kvitton:";
   cin>>antal;
for (i=1; i<=antal; i++)//läs in alla belopp
        { cout<<"Ge belopp "<<" :";
        cin>>belopp;
sum=sum+belopp;                          //summera beloppen
}
                  //Skriv ut summan med 2 decimaler
  cout<<"Summan="<<setiosflags(ios::fixed)<<setprecision(2)
 <<sum<<endl;
return 0;
      }

Ex 2b: samma kod som Ex 2a, men med god indentering och luftig kod:

int main()
{
   double belopp;
   double sum=0.0;
   int    antal,i;

   cout<<"Ge antal kvitton:";
   cin>>antal;

   for (i=1; i<=antal; i++)            //läs in alla belopp
   {
      cout <<"Ge belopp "<<" :";
      cin>>belopp;
      sum=sum+belopp;                  //summera beloppen
   }

   //Skriv ut summan med 2 decimaler
   cout<<"Summan="<<setiosflags(ios::fixed)<<setprecision(2)
       <<sum<<endl;

   return 0;
}

Kommentering

Förutom att funktionens kod, dvs mellan { och }, skall kommenteras är det också lämpligt att funktionens "huvud" kommenteras. Exempelvis funktionen kostnad nedan.
Ex. 3:
//***************************************************************************
//Funktion kostnad
//Syfte: Beräknar och returnerar kostnaden för ett telefonsamtal.
//Inparametrar: typ - anger samtalstypen
//              start - samtalets starttid
//              slut  - samtalets sluttid
float kostnad(char typ, int start, int slut)
{
   ...
}
//***************************************************************************
Ifall funktionen har utparametrar och/eller in/utparametrar så listas även dessa enligt samma princip som ovan. Ett alternativt sätt att kommentera funktionens parametrar är enligt följande:
Ex. 4:
//***************************************************************************
//Funktion kostnad
//Syfte: Beräknar och returnerar kostnaden för ett telefonsamtal.
float kostnad( char typ,        //inparam: anger samtalstypen
               int  start,      //inparam: samtalets starttid
               int slut)        //inparam: samtalets sluttid
{
   ...
}
//***************************************************************************
Det är svårt att exakt tala om hur mycket man skall kommentera. Ju bättre variabelnamn desto mindre behöver kommenteras. Det är de olika delmomenten (kodblocken), de viktiga och mer komplexa delarna i koden som behöver kommenteras. En väldigt komplicerad del kanske förklaras bättre separat med text och figur i separat program- eller algoritmbeskrivning, det kan annars krävas massor med text i koden. Exempel på kodblock som bör kommenteras är loopar. Ett exempel på något som EJ behöver kommenteras är triviala satser som:
Ex. 5:
{
   int a=0;        //Här deklarerar jag variabeln a och nollställer den
   cout << "Ge a"; //Skriv ut ledtext
   cin >> a;       //Här läser jag in a
   a++;            //Öka a med ett
   cout << a;      //Här skriver jag ut a
}

För att öka läsbarheten av kod som innehåller styrande satser (if, while) som innehåller många satser så kan det vara bra att tydliggöra när den styrande satsen slutar. Om en while-sats börjar på en sida och slutar på nästa kan det vara svårt att granska programmet. Det kan lösas på följande sätt:
Ex. 6:

  while (godis==gott)
  {
     ...
     //många satser
     ...
  } //slut på while (godis==gott)

Sammanfattning

Koden måste indenteras, vilket är en nödvändighet för att få till en läsbar kod. Andra saker som bidrar till att skapa en lättläst kod:
+ Luftig kod, dvs tomma rader mellan olika delar av koden.
+ Inramningar av funktioner (se Ex 3 och Ex 4)
+ Bra variabel- och funktionsnamn
+ Bryta ned stora/komplicerade kodblock i funktioner.

Ex. 7: nedbrytning av kod i funktioner
Antag att funktionen inmatning består av 10 C++-satser, funktionen algoritmX av 25 satser och funktionen skrivut av 7 satser. En main-funktion som anropar dessa blir kort och lättläst:
int main()
{
    int a,b,c,x;
    inmatning(a,b,c);   //Inläsning av a,b,c
    x=algoritm(a,b,c);  //Beräkna x enligt algoritmen
    skrivut(a,b,c,x);   //Skriv ut resultatet
    return 0;
}
Funktionerna kan återanvändas. De fyra funktionerna i Ex. 7 ersätter därmed tre kodblock i main-funktionen. Om dessa kodblock istället skrivits direkt i main-funktionen skulle den bestå av 10+25+7=42 satser och skulle ej bli lika lättläst.
Ex. 8:
int main()
{
  //Kodblock 1 - Inläsning av a,b,c (10 satser)
  ...
  //Kodblock 2 - Beräkna x enligt algoritmen (25 satser)
  ...
  //Kodblock 3 - Skriv ut resultatet (7 st satser)
  ...
}

Torsten Jarkrans