Göm menyn

TDP004 Objektorienterad programmering

Laborationer

Den här sidan innehåller kortfattade rekommendationer för hur din C++-kod skall se ut. Om du inte följer någon utförligare stilguide måste du följa dessa riktlinjer. Att använda god programmeringsstil är viktigt för att underlätta läsning av koden. Fundera på vad du tycker är tydligast när du skriver kod, och jämför med vad som sägs i t.ex. Code complete. Fundera även på vem som spenderar mest tid på att läsa din kod, och vem som alltså vinner mest på att den hela tiden hålls organiserad och lättläst. (Tips: Det är inte din assistent.)

Inkluderingsfiler

Preprocessorkommandot för inkludering skall följas av exakt ett blanksteg. Alla inkluderingar skall finnas först i filen. Standardbibliotek inkluderas med <> tecken, medan egna filer inkluderas med dubbelcitattecken. Använd tomma rader för att gruppera olika typer av inkluderingar.

Bra exampelDåligt exampel
#include <iostream>
#include <iomanip>

#include "my_class.h"

using namespace std;
#include"iostream"
#include<my_class.h>
#include<iomanip>
using namespace std;

Uttryck

Uttryck skrivs med enkla blanksteg runt operatorer. I vissa lägen är det tydligare att skriva ihop en beräkning, eller gruppera med parenteser.

Bra exempelDåligt exempel
velocity = distance / time;
f = a*x*x + b*x + c;
velocity=distance/time;
f=a *  x*x+b *x+c;

Använd parenteser så fort prioriteten eller associativiteten är oklar.

Bra exempelDåligt exempel
return ((a || b) && (c || d));
return a||b&&c||d;

Bryt upp långa rader på lämpliga ställen eller dela upp i två uttryck. En extra omgivande parentes hjälper till med indenteringen om uttrycket radbryts.

Bra exempel

cout << "value of a = " << a
     << "value of b = " << b
     << "value of c = " << c
     << endl;

return ((adrian_is_home || bertram_is_at_work) &&
        (ceasar_is_empereor || david_beat_goliat));

bool home_or_work_test = (adrian_is_home || bertram_is_at_work);
bool power_test = (ceasar_is_empereor || david_beat_goliat);
return home_or_work_test && power_test;

Dåligt exempel

cout<<"value of a = "<<a<<"value of b = "<<b<<"value of c = "<<c<<endl;

return ((adrian_is_home||bertram_is_at_work)&&(
ceasar_is_empereor||david_beat_goliat));

return adrian_is_home||bertram_is_at_work&&ceasar_is_empereor||david_beat_goliat;

Satser och block

Krullparentes ("måsvinge") skrivs alltid på egen rad. Krullparentserna indenteras inte, medan koden inuti ett krullparentesblock alltid indenteras. Använd ett blanksteg mellan satsers nyckelord ("if", "for", "while") och startparentes.

Bra exempelDåligt exempel

int sum = 0;
for (int i = 0; i < stop; ++i)
{
   sum = secret_value[i];
}

while (!last())
{
   next();
}

int positive = -1;
do
{
   cout << "enter a positive value ";
   cin >> positive;   
}
while (positive < 0);

int main()
{
   string selection;

   while ( cin >> selection )
   {
      if (selection == "one")
      {
         do_one();
      }  
      else if (selection == "two")
      {
         do_two();
      }
      else if (selection == "quit")
      {
         char confirm;
         cin >> confirm;

         if (confirm == 'Y' || confirm == 'Y')
         {
            return 0;
         }
      }
      else
      {
         do_others();
      }
   }
   return 0;
}

int sum=0;for
(int i=0;i<stop;++i)sum=secret_value[i];
while(!last())
{
next();
}
int positive=-1;
do{cout<<"enter a positive value ";
cin >> positive;   
}
while (positive < 0);
int main(){
string selection;
while(cin>>selection)
      {
if(selection=="one")do_one();  
else if(selection=="two"){do_two();}
else if(selection=="quit"){
         char confirm;
 cin >> confirm;
    if (confirm == 'Y' || confirm == 'Y')
{
            return 0;}}else
      {do_others();}}
return 0;
}

Identifierare

Använd beskrivande namn på funktioner och variabler. Bra kod går nästan läsa som poesi. Tumregeln är att längre är bättre än kortare, och begripligt namn bättre än obegripligt. Emacs har funktionalitet för att autoexpandera variabelnamn (M-/), och funktionalitet för att byta ett ord mot ett annat (M-%). Det finns alltså inga ursäkter.

Konstanter

Konstanta variabler döps med enbart VERSALER. Olika ord i namnet separeras med understreck.

Bra exempelDåligt exempel
const int SIZE_OF_APPLE_ARRAY = 4711;
const int aplesiz=4711;

Lokala variabler

Lokala variabler döps med enbart gemener. Olika ord i namnet separeras med understreck.

Bra exempelDåligt exempel
int speed_of_car = 90; // km/h
int spEEdYCar=90;

Globala variabler

Globala variabler leder till svårhanterlig kod och är strikt förbjudna. Det blir i längden omöjligt att hålla reda på vilka delar av koden som använder en global variabel. De programfel som tids nog oundvikligen uppstår kräver oftast att all kod modifieras för att ta in parametrar istället. Gör rätt direkt, och använd parametrar. Globala konstanter är dock tillåtna (varför?).

Parametrar

Parametrar döps med enbart gemener. Olika ord i namnet separeras med understreck. Använd aldrig variabler med samma namn som en parameter.

Bra exempelDåligt exempel
int example(int parameter_one, int parameter_two);
int example(int P, int Q);

Functions

Funktionsnamn skrivs med enbart gemener. Olika ord i namnet separeras med understreck.

Bra exempelDåligt exempel
double radians_to_degrees(double radians)
{
   return radians * 360.0 / (2 * PI);
}
double r2d2(double R)
{
   return R*180/PI;
}

Klasser

Klasser skrivs med versal inledningsbokstav i varje ord i namnet (camelcase). Varje ord i namnet separeras med understreck.

Bra exempelDåligt exempel
class Infix_To_Postfix;
class infixpostfix;

Medlemsfunktioner (metoder)

Medlemsfunktioner skrivs med inledande versal på varje ord i namnet utom första, och utan separerande understreck.

Bra exempelDåligt exempel
class Array_Of_Five
{
public:
   Array_Of_Five();
   ~Array_Of_Five();

   int addElementAt(int i);
   int getElementAt(int i);
   
private:
   int data[5];
}
class Array_Of_Five
{
public:
   Array_Of_Five();
   ~Array_Of_Five();

   int Add_element_at(int i);
   int Get_element_at(int i);
   
private:
   int data[5];
}

Sidansvarig: Klas Arvidsson
Senast uppdaterad: 2013-10-29