Käsittääkeni private ja public muuttujat tallentuvat samalla tavalla muistiin. Miksi niitä käytetään?
Privatea ei pysty luokan ulkopuoliset käpistelemään. Yleensä hyvin tehty luokka takaa, että sitä ei saa rikki publiceja säätämällä. (Sen takia yleensä public muuttujien asemesta käytetään public propertyjä, joille voi kirjoittaa validoinnin setteriin). Jos luokassa on privaattimuuttuja, niin luokka pystyy helposti takaamaan, että sen sisältö on järjellinen, koska luokan ulkpuolinen koodi ei pääse käpistelemään sitä.
Luitko opasta?
C++-oppaan 9. osa kirjoitti:
Yksi olio-ohjelmoinnin periaatteista on, että jokaisen olion täytyy säilyttää tilansa järkevänä, ja tämä ei onnistu, jos ohjelmoija voi milloin tahansa olion ulkopuolelta muuttaa sen tietoja hallitsemattomasti.
Voisi olla esimerkiksi luokka, joka sisältää kulman ja sitä vastaavan pisteen (x, y) yksikköympyrän kehällä. Jos nämä kaikki olisivat julkisia, luokan käyttäjä voisi asettaa niihin arvoja, jotka eivät päde. Siksi näistä tehdään yksityisiä ja asettamiseen käytetään erillisiä funktioita, joista toinen asettaa kulman ja laskee samalla pisteen ja toinen vastaavasti asettaa pisteen, normalisoi sen ja laskee samalla kulman.
#include <cmath> class yksikkoympyran_piste { double x_, y_, kulma_; public: double x() const { return x_; } double y() const { return y_; } double kulma() const { return kulma_; } void aseta(double kulma) { x_ = std::cos(kulma); y_ = std::sin(kulma); kulma_ = std::atan2(y_, x_); } void aseta(double x, double y) { kulma_ = std::atan2(y, x); x_ = std::cos(kulma_); y_ = std::sin(kulma_); } };
Jaa, jaa. Nyt valkeni. Aika turhaa tosin.
Jokotai kirjoitti:
Jaa, jaa. Nyt valkeni. Aika turhaa tosin.
Missä mielessä turhaa?
Millä tavalla muuttujat voisivat olla ratkaisevasti "eri tavalla" muistissa?
eq kirjoitti:
Missä mielessä turhaa?
Hyvin suunnitellussa ohjelmassa nuo ovat turhia, tietenkin jos sitä ei ole suunniteltu hyvin, niin asia on toinen, mutta lähtökohtaisesti ohjelma pitäisi suunnitella niin hyvin, että nuo olisivat turhia.
eq kirjoitti:
Millä tavalla muuttujat voisivat olla ratkaisevasti "eri tavalla" muistissa?
Ei voikaan ja siksi kummastelinkin.
Jokotai, hyvin suunnitellussa ohjelmassa niitä juuri käytetään. Ohjelmoijat eivät voi lukea toistensa ajatuksia, joten ne ajatukset pitää kirjata jollain tavalla koodiin. Tämä on C++:n (ja lukuisten muiden kielten) tapa kirjoittaa koodiin "älä muuta tätä arvoa" tai "älä käytä tätä funktiota". Erityisesti kirjastojen kohdalla tällaiset tiedot ovat välttämättömiä. Niistä on sitä paitsi hyötyä käyttäjällekin: jos etsii kirjastosta funktiota tiettyyn tarkoitukseen, ei tarvitse tutkia kaikkia kirjaston sisäisiä apufunktioita vaan vain julkiset funktiot.
Kannattaa olla arvostelematta tällaisia asioita, kun ei ole itse koodannut koskaan mitään isoa.
Jokotai kirjoitti:
Hyvin suunnitellussa ohjelmassa nuo ovat turhia
Privaatit kuuluvat nykyisin hyvään suunnitteluun, joten tämä väite on suunnilleen yhtä järkevä kuin: "Hyvin suunnitellussa ohjelmassa funktiot ovat turhia."
Joo, suunnittelulla ja kovalla koordinaatiolla voi toki kirjoittaa ohjelman, jossa ei ole funktioita (sen mainin lisäksi), mutta mm. sellaisen ylläpidettävyys olisi totaalisen surkea. Sama olisi jos välttäisi privaattimuuttujia.
Aihe on jo aika vanha, joten et voi enää vastata siihen.