Toinen projekti
Olio-ohjelmoinnin tyyliseikkoja
Aiemmin esitetyt yleiset tyyliseikat pätevät myös olio-ohjelmointiin. Tässä käsitellään niiden lisäksi luokkien suunnitteluun ja toteutukseen liittyviä käytäntöjä.
Yleisiä ohjeita
Kun suunnittelet luokkaa, mieti ensin, onko siitä hyötyä. Luokan keskeinen tarkoitus on koota yhteen siihen kuuluva data eli attribuutit ja niitä käsittelevät metodit.
- Jos luokassa ei ole rakentajan ja purkajan lisäksi metodeita, käytä yleensä yksinkertaisempaa
struct-tietuetta. - Jos luokassa on rakentajan ja purkajan lisäksi vain
set- jaget-metodeita, tietue voi riittää: erillisiä metodeita ei silloin tarvita. - Jos luokalla ei ole attribuutteja, sen metodit eivät ehkä käsittele yhteistä dataa eivätkä siksi kuulu samaan luokkaan.
Nimeä luokka yleensä yksikkömuodossa, koska se kuvaa yhtä oliota. Luokasta voidaan luoda useita ilmentymiä. Jäsenmuuttujien nimeen on hyvä lisätä loppuun alaviiva, esimerkiksi name_, jotta ne erottuvat paikallisista muuttujista ja parametreista.
Otsikko- ja toteutustiedoston rakenne
- Sijoita kuhunkin
.hh-otsikkotiedostoon yksi julkinen rajapinta eli yksi luokka. Otsikkotiedostoon kirjoitetaan esittelyt, ei toteutuksia. - Suojaa otsikkotiedosto moninkertaiselta sisällyttämiseltä include guard -direktiiveillä:
#ifndef CLASS_A_HH
#define CLASS_A_HH
// Esittelyt
#endif // CLASS_A_HH
- Käytä
#include-direktiiviä vain otsikkotiedostoihin. Jos sisällytät omia ja kirjaston otsikoita, kirjoita ensin omat otsikkotiedostot ja sitten kirjaston otsikot. - Kirjoita rajapinnan metodien toteutukset
.cpp-tiedostoon samassa järjestyksessä kuin esittelyt ovat vastaavassa.hh-tiedostossa. - Kirjoita jäsenfunktion kommentti otsikkotiedostoon funktion esittelyn yläpuolelle, ei toteutustiedostoon.
Suunnittele pieni ja selkeä julkinen rajapinta
Luokan julkisen rajapinnan tulisi olla mahdollisimman pieni, ja olion käytön tulisi tapahtua tämän rajapinnan kautta. Älä anna olion muuttaa toisen olion attribuutteja suoraan, vaikka oliot olisivat saman luokan ilmentymiä. Luokan public-osa kirjoitetaan ennen private-osaa. Julkisessa osassa ei ole jäsenmuuttujia, eikä yksityiseen osaan lisätä tarpeettomia muuttujia.
Pidä luokan toimintaan kuuluvat operaatiot jäsenfunktioissa. Jäsenfunktiosta kannattaa tehdä const-funktio aina, kun se ei muuta olion tilaa. Kun olio välitetään parametrina, käytä viitettä aina kun se on tarkoituksenmukaista.
Alusta jäsenmuuttujat johdonmukaisesti
Alusta jäsenmuuttujat rakentajan alustuslistassa. Luettele ne samassa järjestyksessä kuin ne on esitelty luokassa:
class Person {
public:
Person(string name, int age);
private:
string name_;
int age_;
};
Person::Person(string name, int age):
name_(name), age_(age) {
}
Ilmoita tyylivirheistä
Kurssin koodipohjissa ja esimerkeissä pyritään noudattamaan näitä sääntöjä. Aina se ei onnistu, sillä esimerkkejä ovat kirjoittaneet monet ihmiset usein kiireessä. Ilmoita havaitsemistasi tyylisääntöjen rikkomuksista.
Muista: hyvä luokka kokoaa yhteen samaan käsitteeseen kuuluvan datan ja toiminnan, piilottaa sisäisen toteutuksensa ja tarjoaa käyttäjälle selkeän rajapinnan.