Kapselointi

**Kapselointi** tarkoittaa ohjelmoinnissa yhteen kuuluvien tietojen ja toimintojen kokoamista yhdeksi kokonaisuudeksi. Olio-ohjelmoinnissa kapselointi tapahtuu usein kokoamalla muuttujat ja metodit luokaksi. Myös moduulit ja pakkaukset toimivat kapselointivälineinä.

Kapseloinnin tarkoituksena on yhteenkuuluvien asioiden kokoamisen lisäksi myös piilottaa toteutus moduulin tai luokan asiakkailta eli sen käyttäjiltä. Tarkoitus on siis tarjota käyttöön eräänlainen valmis ohjelmoinnin rakennuspalikka, jota voi käyttää ohjelman rakentamiseen tietämättä mitään (ja välittämättä) palikan sisäisestä toteutuksesta. Tämä edellyttää sitä, että moduulin tai luokan rajapinta on hyvin määritelty ja dokumentoitu. 

Jotkin kielet, kuten Smalltalk ja Ruby, sallivat pääsyn vain objektin metodeilla, mutta useimmat muut kielet (kuten C++, C#, Delphi tai Java) tarjoavat ohjelmoijalle keinon hallita sitä, mitä piilotetaan. Yleensä se on toteutettu avainsanoilla, kuten "public" ja "private". ISO C++ -standardin mukaan pääsyoikeuksia voi rajoittaa kolmella tavalla: "protected", "private" ja "public" ja toteaa, että ne eivät "piilota mitään tietoa". Tietojen piilottaminen saavutetaan tarjoamalla käännetty lähdekoodin versio, joka on liitetty otsikkotiedostoon.  

Yleiset rajoittavat avainsanat: 

* Avainsana "public" ei rajoita kyseessä olevan datan käyttöoikeuksia millään tavalla. Näin muut luokat voivat suoraan muuttaa ja nähdä kyseistä dataa vaikka luokat eivät liittyisi toisiinsa millään tavalla.
* Avainsana "private" rajoittaa datan käyttöoikeuksia niin että vain luokka jossa data on määritelty, voi nähdä ja muokata dataa. Tämä tarkoittaa sitä että pääluokan lapsetkaan eivät voi nähdä tai muokata dataa vaikka ne silti periytyvät lapsille.
* "Protected" rajoittaa datan näkyvyyden niin että vain ne luokat, jotka periytyvät määrittelevästä luokasta jossa data määritellään, voivat nähdä ja muokata dataa koska nämä attribuutit ovat nyt perineen luokan attribuutteja. Muut luokat eivät kuitenkaan voi nähdä tai muokata attribuutteja.

Kapselointi on mahdollista myös muissa kuin olio-ohjelmointikielessä. Esimerkiksi C-kielessä rakenne voidaan julistaa julkiseksi API:ksi (sovelluksen ohjelmointirajapinta) header-tiedostossa joukolle funktioita, jotka käsittelevät tietoja sisältävää kohteen dataosaa, jota API:n asiakkaat eivät voi käyttää “extern”-avainsanan avulla. 

Syitä kapseloinnin käyttämiseen ovat mm.
* Ohjelman jakaminen pienempiin, helpommin toteutettaviin ja hallittaviin osiin
* Ohjelman ylläpidon helpottaminen, koska muutokset vaikuttavat vain rajoitettuun alueeseen ohjelmassa rajapinnan säilyessä samana. Tämä on erityisen hyödyllistä suurissa ohjelmissa, joissa koodin ylläpitäminen voi muuten olla hankalaa.
* Uudelleenkäytettävyyden helpottuminen. Kun rakennuspalikka on tehty oikein, sitä voidaan käyttää myös muissa ohjelmissa. Tämä säästää aikaa ja vaivaa, kun kehitetään uusia ohjelmia, sillä aiemmin kirjoitetut koodiosat voidaan hyödyntää uudelleen.
* Kapseloinnin hyödyntäminen voi myös auttaa välttämään virheitä. Ohjelmoija voi vain rajapinnan kautta käyttää toimintoja ja tietoja, mikä ehkäisee virheitä. 
* Vastaavasti kapselointi helpottaa myös ohjelman testaamista, sillä toiminnallisuuksia voidaan testata eristetysti muusta ohjelmasta.
* Lisäksi kapseloinnin avulla voidaan piilottaa luokan tai moduulin toteutus asiakkailta. Tällöin asiakkaan tai käyttäjän ei tarvitse tietää koodin yksityiskohtia, koska he voivat käyttää rajapintaa.

## Esimerkkejä

#### Datan käyttöoikeuksien rajoittaminen
Kielet kuten C++, C# ja Java tarjoavat to tapoja rajoittaa oikeuksia luokan dataan.

Alla oleva esimerkki näyttää miten avainsanaa  "private" voidaan käyttää Javassa:

```java
public class Car {
     private int horsePower = 500;
     
     public int getHorsePower() {
         return this.horsePower;
     }
 
     public static void main() {
         Car car = new Car();
         int hp = car.getHorsePower();
     }
 }
```