Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Globaalit muuttujat

Sivun loppuun

ristokor [29.11.2005 21:50:22]

#

Kaikki sanovat aina, ettei globaaleja muuttujia saa käyttää. Mutta miten pitäisi tehdä jos ohjelmassa esim. funktioiden täytyy vaikuttaa toisen funktion lukuja? Voiko sitä kiertää mitenkään vai ovatko ne globaalit muuttujat niin paha rasite. Miksi globaaleja vältetään?

Metabolix [29.11.2005 22:01:23]

#

Tuo on samanlainen asia kuin se, että gotoa ei pitäisi käyttää. Sinänsä globaaleissa muuttujissa ei ole mitään pahaa (kuten ei gotossakaan), jos niitä käyttää oikein. Jos siis tarvitset niitä, niin käytä niitä. Eihan niitä olisi koko kielessä olemassa, jos niitä ei olisi tarkoitus käyttää. Ongelmana vain on se, että kun aloittelija tekee jotakin, on niin helppo laittaa kaikki muuttujat globaaleiksi, "kun silloinhan kaikki pääsevät niihin helposti käsiksi eikä tarvitse kikkailla parametreillä ja muulla hankalalla". Ideana on, että jos jotakin ei tarvita muualla, siitä ei kannata tehdä globaalia, ja muuttujat, jotka selvästi kuuluu laittaa funktion parametreiksi, on syytä laittaa juuri siihen, jos se ei ole aivan kohtuuttoman hankalaa. Ja silloin voi funktiota käyttää muissakin ohjelmissa, kun ei tarvitse globaaleja. Sitten vielä se, että vahinkoja ei satu, kun e pääse muuttamaan mitään, mitä ei pitäisi muuttaa.

Kai siinä tuli tärkeimmät perustelut. Eli käytä kaikin mokomin, jos siitä on hyötyä.

Deewiant [29.11.2005 22:11:51]

#

Pikkujuttu lisää, joka ei tässä tilanteessa vaikuttane ollenkaan: isommassa projektissa, etenkin sellaisessa, jonka kimpussa on useampi ohjelmoija, saattavat globaalit muuttujat haitata, sillä ne täyttävät nimiavaruutta.

Esimerkiksi globaali muuttuja "summa" voi olla ihan looginenkin jossain tilastomoduulissa, jossa on funktioita numeroidenkäsittelyyn, jotka kaikki tarvitsevat tietoa numerosarjan summasta. Mutta sitten joku tarvitsikin summaa myös jossain muualla, jotain ihan toista asiaa varten - ja päätti kielestään ylpeänä suomalaisena nimetä muuttujan myös "summa":ksi. Sitten jossain paikkaa ohjelmaa tarvitaankin näitä molempia osioita (joka yleensä tapahtuu vasta jonkin aikaa sen jälkeen, kun nuo molemmat moduulit ovat toimineet itsenäisesti ihan hyvin, omine summineen), ja jostain syystä ne eivät toimikaan - paremmassa tapauksessa koodi ei käänny, huonommassa toinen "summa" vain katoaa ja toista käytetään aina, huomaamatta. Siinä sitten saattaakin olla ihmettelyn aihetta.

Metabolix [29.11.2005 22:17:15]

#

Tuota varten sitten C++) käytetään nimiavaruutta tai C) tungetaan globaalit jonkin structin sisään eli simuloidaan sillä nimiavaruutta. Pascalissa ei kai tuota ongelmaa ole lainkaan.

Mutta mitä nyt olen Quake2:n lähdekoodeja selannut, niin monet (parikymmentä) globaalit on esitelty samassa otsikkotiedostossa, ja lopuilla on sen verran pitkä ja kuvaava nimi (siinä 15-30 merkkiä), että ne eivät varmastikaan tuota ongelmia.

CyberianRat [29.11.2005 23:37:49]

#

Yleensä globaalien muuttujien tarve kielii huonosta suunnittelusta. Hyvin suunnitellussa ohjelmassa muuttujat kulkevat luontevasti funktioiden parametreissa tai luokkien jäseninä eikä globaaleja tarvita. Näin siis pääsääntöisesti - käytännössä voi tulla vastaan tilanteita, joissa globaalin käyttö on (ainakin lyhyellä tähtäimellä) helpoin vaihtoehto.

FooBat [29.11.2005 23:40:09]

#

C:ssä voidaan myös simuloida nimiavaruutta merkitsemällä globaalit muuttujat staattisiksi, jolloin ne eivät näy modulin ulkopuolelle.

JoinTuanJanohon [30.11.2005 15:44:08]

#

Gotoista vielä sen verran, että ku niitä käyttää, nii jotku tiimi jäsenet voi sitte ruveta repimään pelihousujaan. Tosiasiassa gotoilla voi esimerkiksi optimoida rekursioita sellaiseen vauhtiin, ettei ite varsinaista rekursiokutsua tartte enää tehdä. Jotenki se rekursiokutsu onnistuu sekoittamaan sen prosessorin sieluelämä niin, ettei se enää osaa ennakoida tulevaa. Mutta ku gotot on sopivasti järjestäny, sitte prosessoria voi huijata, että ajetaanki ihan gronologisesti etenevää koodia. Esim qsortin -kaltaise rekursion voi saada pörrämmään kymmenen ellei melkein satakertaisella nopeudella.

FooBat [30.11.2005 16:30:45]

#

Dijkstran artikkeli "Go To Statement Considered Harmful", josta goto-viha lähti liikkeelle (sivun puolessa välissä).
http://www.thocp.net/biographies/papers/goto_considered_harmful.htm


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta