Globaalit muuttujat

Mitä globaaleja muuttujia ja globaaleja olioita tavallisesti tai silloin tällöin on käytössä tai olisi hyvä olla käytössä? Tämä on tärkeää myös siksi, että tietäisi välttää tiettyjä nimiä jos aikoo yhdistää muiden c:tä omiinsa.

Esimerkiksi satunnaisolion olisi hyvä olla globaali olio, viitteenä ( &, ja-merkki ) välittämisen sijaan.
6434
Äänestä

Muut lukivat myös

Vastaukset 6

Vanhimmat

Jos käyttää globaaleja muuttujia, silloin todennäköisesti tekee jotain väärin. Niitä käytetään vain harvinaisissa poikkeustapauksissa.

Äänestä

Jos jotain vakiota tai muuttujaa tarvitaan yhtenään ja joka puolella ohjelmaa, on sen laittaminen yleiseksi muuttujaksi tai vakioksi perusteltua. Yleensä käyttö rajoittuu vakioihin, mutta joskus on kätevää ohjata rinnakkaisia prosesseja kuten (säikeitä) erilaisilla lipuilla. Se tulee tehdä harkiten ja dokumentoida huolella, koska kyseisten muuttujien käyttö tulee olla täysin sidoksissa vain yhteen ja tiettyyn tarkoitukseen. Järkevintä on tuolloin tehdä noille vakioille oma modulinsa ja antaa kaikkien muiden ohjelmaosien nähdä kyseinen moduuli kutsuttavana "alirutiinina".

Kuitenkaan ei ole olemassa mitään varsinaista säännöstöä muuttujien nimeämiseen tai edes kirjoitustyyliin. Tulet itse sen huomaamaan, kun toisten kirjoittamia ohjelmia joudut enemmän tonkimaan. Eri ohjelmoijat kirjoittavat asiat aina eri tavalla, vaikka olisivat alunperin opiskelleet alaansa samassa opinahjossa.

Äänestä
  • Itse kirjoitaan globaalit muuttujat muotoon gMuuttuja. Erottaa hyvin sitten.

    Äänestä

  • Voisiko yksi mahdollisuus olla tällainen:

    int gVerbosity=0;
    int gDebug=0;

    Eli oletuksena on ettei main eikä oliot anna ilmoituksia, ja osat toimii nopeammassa moodissa eikä varmemmassa moodissa.

    Jos gDebug on 0, niin esim. vectorista haetaan alkio tavalla jokuvector[a]; eikä jokuvector.at(a); ja kaikenlaisia aikaavieviä tarkistuksia sivuutetaan kaikissa olioissa ja funktioissa.

    Arvo voisi olla 0, 1 tai 2.

    Onko tämä oikein ja tehokasta?

    Sitten voisi kanssa olla laskurimuuttuja joka laskee tiettyyn kategoriaan kuuluvien luokkien olioiden käyttökertoja.

    Äänestä

  • Deopuk kirjoitti:

    Voisiko yksi mahdollisuus olla tällainen:

    int gVerbosity=0;
    int gDebug=0;

    Eli oletuksena on ettei main eikä oliot anna ilmoituksia, ja osat toimii nopeammassa moodissa eikä varmemmassa moodissa.

    Jos gDebug on 0, niin esim. vectorista haetaan alkio tavalla jokuvector[a]; eikä jokuvector.at(a); ja kaikenlaisia aikaavieviä tarkistuksia sivuutetaan kaikissa olioissa ja funktioissa.

    Arvo voisi olla 0, 1 tai 2.

    Onko tämä oikein ja tehokasta?

    Sitten voisi kanssa olla laskurimuuttuja joka laskee tiettyyn kategoriaan kuuluvien luokkien olioiden käyttökertoja.

    Käsittämätöntä, että pitää käyttää tuollaisia itse keksimiä, epästandardeja ja epäkieliopillisia lyhenteitä, kun voi ihan yhtä hyvin tituleerata muuttujaa tai oliota tasan sillä, mikä se onkin: TCar* RedConvertibleCar; TSparePart BrakeDisk;

    Jossain muussa lähdekooditiedostossa määriteltyä muuttujaa käytetään external: ina ja jos ei käytetä se on kääntäjän mielestä eri muuttuja kuin siellä toisessa tiedostossa eikä mitään vaaraa sekaannuksista ole, vaikka käyttäisi samaa nimeä.

    Äänestä

  • Deopuk kirjoitti:

    Voisiko yksi mahdollisuus olla tällainen:

    int gVerbosity=0;
    int gDebug=0;

    Eli oletuksena on ettei main eikä oliot anna ilmoituksia, ja osat toimii nopeammassa moodissa eikä varmemmassa moodissa.

    Jos gDebug on 0, niin esim. vectorista haetaan alkio tavalla jokuvector[a]; eikä jokuvector.at(a); ja kaikenlaisia aikaavieviä tarkistuksia sivuutetaan kaikissa olioissa ja funktioissa.

    Arvo voisi olla 0, 1 tai 2.

    Onko tämä oikein ja tehokasta?

    Sitten voisi kanssa olla laskurimuuttuja joka laskee tiettyyn kategoriaan kuuluvien luokkien olioiden käyttökertoja.

    Globaalien muuttujien käyttö on yleensä hankaluuksien kerjäämistä, vaikka joskus niitä tarvitaankin.
    Yleisesti ottaen globaalit muuttujat tulisi paketoida luokaksi (Singleton-suunnittelumalli; Eric Gamman et.al. kirjasta), jolloin globaalit pääsisivät tavallaan omaan nimiavaruuteensa ja niiden elinaika olisi mukavasti hallussa.

    Tässä kyseisessä esimerkkitapauksessa käyttäisin jotain loggausluokkaa (valmiina esim. Log4Cxx tai vastaava), jolla pystyy asian hoitamaan kauniisti ilman kikkailuja. Toinen tapa on käyttää C:n makroja hyväksi, jotka toisella vipusella tuottavat loggauskoodin ja toisella lörpöttelytason tms.

    Kuten M-Kar asian ilmaisi on globaalien muuttujien käyttö yleisesti merkki potentiaalisesti riskialttiista suunnittelusta ja tarve lisäsuunnittelulle on ilmeinen.

    Ja mitä tulee vektoriesimerkkiin, niin aikaavievillä tarkastuksilla on syynsä ja paikkansa ja jos käytät standardeja C kirjastoja, niin ne on melko nopeita yleisesti ottaen. Mutta jos ole varma, ettei sinulla tule off-by-one tyyppisiä virheitä, niin silloin ehkä. Harvemmin olen kuullut ohjelman suoritusnopeuden olevan kiinni std C kirjastoista vaan se hitaus on jossain muualla.

    Äänestä

Kommentoi aloitusta


Deopuk kirjoitti:

Mitä globaaleja muuttujia ja globaaleja olioita tavallisesti tai silloin tällöin on käytössä tai olisi hyvä olla käytössä? Tämä on tärkeää myös siksi, että tietäisi välttää tiettyjä nimiä jos aikoo yhdistää muiden c:tä omiinsa.

Esimerkiksi satunnaisolion olisi hyvä olla globaali olio, viitteenä ( &, ja-merkki ) välittämisen sijaan.

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu