Mitä paljastetaan kaikille, mikä pidetään omana tietona? Siis näkyvyysmääreistä

Mitä hyötyä on erilaisista näkyvyysmääreistä: public, private, protected? Miten ohjelmointiin vaikuttaisi, jos kaikki muuttujat olisivat tyyppiä public? Entäpä, jos kaikki olisivat tyyppiä private?

Pitkälle syksyyn pärjäsin sillä tiedolla, että attribuutit määritellään privateiksi ja metodit publiciksi. Välillä ohjelmointitehtävissä kyllä neuvottiin metodille jokin muu näkyvyysmääre, private tai protected, ja niin sitten tein enempää miettimättä, että miksi näin. Jo kurssin alussahan tuli esille, mitä tarkoittaa, jos näkyvyysmääre on public tai private. Private-määriteltyä voi käyttää vain luokan sisällä (tai luokan sisäluokassa), ja public-määriteltyä kaikkialla, siis myös muissa luokissa. Harvinaisempi ja minulle vähiten tuttu on protected, jonka opin tuntemaan vasta myöhemmin. Sehän laajentaa näkyvyyden luokan sisältä myös sen jälkeläisiin.

Aloin miettiä näkyvyysmääreiden merkitystä vasta viimeisissä tehtävissä, vaikka ne ovatkin melko merkityksellinen ja  näkyvä osa ohjelmointia. Asia tuli esiin apumetodeita tehdessä, niitähän pitää voida kutsua vain kyseisessä luokassa metodissa, jonka avuksi ne on tehty. Muistin myös ohjeen, että näkyvyydeksi pitäisi laittaa mahdollisiman suojaava määre. Ja niin eivät metodini enää olleetkaan aina public.

Attribuuttien kohdalla taas en muista käyttäneeni muuta näkyvyysmäärettä kuin privatea. Toisaalta muulle ei usein taida olla tarvettakaan tai ei se ainakaan hyvä vaihoehto yleensä ole. Attribuutteihin kun ei ole yleisesti tarkoitus päästä käsiksi muissa luokissa. Mutta jos siihen on tarvetta, on parempi tehdä publiciksi määritelty metodi, joka tarjoaa attribuutin muiden luokkien käyttöön, kuten mahdollisuuden muuttaa tai tiedustella attribuutin arvoa. Jossain tapauksissa attribuutin näyttäminen myös luokan jälkeläisille voisi olla perusteltua eli määritellä se protectediksi, mutta attribuutin jakaminen kaikelle maailmalle publicilla on kyllä yleensä liian avointa. Kuitenkin jos attribuutti on jokin pysyvä vakioarvo ja sitä tarvitaan muissa luokissa, voi public-määrettä hyvin käyttää.

Jos ainut näkyvyysmääre vaihtoehto olisi private, tarkoittaisi se, ettei mitään luokkien metodeita voisi kutsua muissa luokissa. Luokat eivät voisi kutsua edes toistensa konstruktoreja, eli luoda luokkien uusia ilmentymiä. Ohjelman kannalta tämä ei toimisi, koska pääohjelmaluokka ei saisi yhteyttä muihin luokkiin, eli ne jäisivät käyttämättä. Jos taas kaikki olisi määritelty määreellä protected, seuraus olisi sama, paitsi jos ohjelman luokat periytyisivät toisistaan, jolloin kaikki voisivat käyttää aina ylempien luokkiensa metodeita. Monimutkaisemmissa ohjelmissa näin yksinkertaisia luokkakaavioita harvoin voisi toteuttaa.

Kaiken olessa taas määritelty publiciksi, kaikki metodit olisivat kaikkien luokkien käytössä, mikä ei ehkä olisi kovin suuri ongelma. Niin olisivat myös attribuutit eli kaikki voisivat muuttaa attribuuttien tietoa. Itse asiassa en tiedä, mikä siinä sitten kauheasti haittaisi, jos vain koodaisi siten, ettei luokissa koskisi toisten luokkien attribuutteihin. Eiväthän ne silloin muuttuisikaan perättömästi. Toisaalta, kun ajattelee asiaa olioiden kautta ja muistaa, että attribuutti on olion ominaisuus, on privateksi määritelty attribuutti paras. Tällöin olio voi itse kontrolloida attribuuttien käyttöä, esimerkiksi määrittelemällä attribuuttia muuttavan metodin, jossa myös määritellään, millaiset arvot attribuutille voi antaa. Muut luokat voivat muuttaa attribuuttia vain tämän metodin kautta, eli olion tahdon mukaisesti. Näkyvyysmääreitä kannattaa siis miettiä, vaikka ne melkein luonnostaan alkavatkin tulla metodeille publiciksi ja attribuuteille privateiksi. Ja itseäni ainakin auttaa sääntö, että näkyvyysmääreeksi kannattaa valita mahdollisiman suojaava määre.

-Anu

0 Responses to “Mitä paljastetaan kaikille, mikä pidetään omana tietona? Siis näkyvyysmääreistä”



  1. Jätä kommentti

Vastaa

Please log in using one of these methods to post your comment:

WordPress.com-logo

Olet kommentoimassa WordPress.com -tilin nimissä. Log Out / Muuta )

Twitter-kuva

Olet kommentoimassa Twitter -tilin nimissä. Log Out / Muuta )

Facebook-kuva

Olet kommentoimassa Facebook -tilin nimissä. Log Out / Muuta )

Google+ photo

Olet kommentoimassa Google+ -tilin nimissä. Log Out / Muuta )

Muodostetaan yhteyttä palveluun %s





%d bloggers like this: