Set ja Get aksessorimetodit

kyselijä22

Hei,

en oikein ymmärrä milloin kannattaa käyttää sekä Set että Get metodeja ja milloin vain Get metodia. Jos teen vaikkapa viinirekisterin johon tallennan viinin nimen, vuosikerran ja maun niin kannattaako minun käyttää sekä Set että Get metodeja. En oikein tajua miksei aina voisi käyttää sekä Settiä ja Gettiä, mutta meille on sanottu että siinä ei ole mitään järkeä.

Tätä asiaa en ole vielä tajunnut, toivottavasti joltakin löytyy tietoa asiaan. :)

5

846

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • teuro

      void set_arvo(tyyppi arvo);
      tyyppi get_arvo();

      ensimmäinen asettaa arvoksi arvo ja jälkimmäinen palauttaa annetun tyypin mukaisen arvon. Muutoin en tajua kysymystäsi. Mitä tarkoitat ettei kannata käyttää molempia. Kumpaakin aksessoria tarvitaan yleensä olio-ohjelmoinnissa. Toisaalta ohjelman kannalta on aivan sama mitä nimeä käytät asettamiseen ja palauttamiseen.

      • keksa

        Niin kuin edellinen jo kertoi setillä asetetaan muuttujan arvo ja getillä pyydetään muuttujan arvo.

        Miksi näitä yleensä sitten käytetään edes? Miksi ei vain käytetä suoraan muuttujaa?

        No niitä käytetään siksi, että niiden käyttämisellä voidaan estää ohjelmoijaa tekemästä tyhmiä virheitä. Kun tälle tielle on lähdetty, niin niitä on hyvä käyttää koko ajan vaikka jonkun muuttujan kanssa ei olisis tarvettakaan.

        Ei tarvi siis arpoa että pitääkö nyt käyttää suoraan muuttujaa vai ei, kun aina pitää käyttää niitä aksessoreja.

        Otetaan esimerkiksi vaikka lompakon saldo.

        private float saldo;

        public void setSaldo(float uusiSaldo);
        {
        if(uusiSalso > 0.0) this.saldo = uusiSaldo;
        else this.saldo = 0.0;
        }

        Nyt kun joku yrittää laittaa lompakon saldoksi miinusmerkkisen arvon, niin se ei onnistu, koska itse muuttuja on private ja setteri ei anna tehdä sitä. Jos muuttuja olisi public, niin siihen voisi syöttää suoraan roskaa ja "vääriä" arvoja. Setteristä voidaan heittää myös virhe, että yritit asettaa vääränlaisen arvon.

        Sitten varsinainen vastaus kysymykseen eli miksi joskus vain toinen. Siihen pätee oikeastaan sama logiikka. Estetään virheellisen tiedon syntyminen ja tyhmät virheet.

        public class Hemmo
        {

        private Date syntymapaiva;

        public Hemmo(Date pvm)
        {
        this.syntymapaiva = pvm;
        }

        public Date getSyntymapaiva()
        {
        return this.syntymapaiva;

        }
        }

        Nyt kun uusi Hemmo-olio luodaan, niin konstruktorissa annetaan Hemmon syntymapaiva. Hemmon syntymapaiva ei voi muuttua, joten miksi antaa mahdollisuus muokata sitä sen jälkeen kun Hemmo on luotu? Siksi annetaan vain metodi syntymapaivan pyytämiseen.

        Jos jotain ei saa muuttaa tai luokan käyttäjälle sitä ei tarvitse näyttää, niin piilota ne private-määreellä. Ei siis anneta mahdollisuutta käyttää luokkaa väärin.


      • knowledge$
        keksa kirjoitti:

        Niin kuin edellinen jo kertoi setillä asetetaan muuttujan arvo ja getillä pyydetään muuttujan arvo.

        Miksi näitä yleensä sitten käytetään edes? Miksi ei vain käytetä suoraan muuttujaa?

        No niitä käytetään siksi, että niiden käyttämisellä voidaan estää ohjelmoijaa tekemästä tyhmiä virheitä. Kun tälle tielle on lähdetty, niin niitä on hyvä käyttää koko ajan vaikka jonkun muuttujan kanssa ei olisis tarvettakaan.

        Ei tarvi siis arpoa että pitääkö nyt käyttää suoraan muuttujaa vai ei, kun aina pitää käyttää niitä aksessoreja.

        Otetaan esimerkiksi vaikka lompakon saldo.

        private float saldo;

        public void setSaldo(float uusiSaldo);
        {
        if(uusiSalso > 0.0) this.saldo = uusiSaldo;
        else this.saldo = 0.0;
        }

        Nyt kun joku yrittää laittaa lompakon saldoksi miinusmerkkisen arvon, niin se ei onnistu, koska itse muuttuja on private ja setteri ei anna tehdä sitä. Jos muuttuja olisi public, niin siihen voisi syöttää suoraan roskaa ja "vääriä" arvoja. Setteristä voidaan heittää myös virhe, että yritit asettaa vääränlaisen arvon.

        Sitten varsinainen vastaus kysymykseen eli miksi joskus vain toinen. Siihen pätee oikeastaan sama logiikka. Estetään virheellisen tiedon syntyminen ja tyhmät virheet.

        public class Hemmo
        {

        private Date syntymapaiva;

        public Hemmo(Date pvm)
        {
        this.syntymapaiva = pvm;
        }

        public Date getSyntymapaiva()
        {
        return this.syntymapaiva;

        }
        }

        Nyt kun uusi Hemmo-olio luodaan, niin konstruktorissa annetaan Hemmon syntymapaiva. Hemmon syntymapaiva ei voi muuttua, joten miksi antaa mahdollisuus muokata sitä sen jälkeen kun Hemmo on luotu? Siksi annetaan vain metodi syntymapaivan pyytämiseen.

        Jos jotain ei saa muuttaa tai luokan käyttäjälle sitä ei tarvitse näyttää, niin piilota ne private-määreellä. Ei siis anneta mahdollisuutta käyttää luokkaa väärin.

        else this.saldo = 0.0;

        Eikö tuossa pitäisi ennemmin heittää virhe...


      • keksa
        knowledge$ kirjoitti:

        else this.saldo = 0.0;

        Eikö tuossa pitäisi ennemmin heittää virhe...

        ei kannata varmaan "tuotantoon" tätä koodia heittää muutenkaan


      • nörttijussi
        keksa kirjoitti:

        ei kannata varmaan "tuotantoon" tätä koodia heittää muutenkaan

        Oli kyse mistä tahansa olio-ohjelmoinnin kielestä, niissä jokaisessa täytyy erikseen kysyä ja asettaa tietyilla metodeilla muuttujiin arvot. Tämä on kapseloinnin idea, eli olio peittää sisäisen toteutuksensa ja ainoastaan tarjotaan tietyt metodit joilla pääsee olion tietoihin käsiksi.

        Javassa käytetään gettereitä ja settereitä (metodeja), C#:ssa on taas näitä varten propertyt (ominaisuudet), jotka toimivat täysin javan ko. metodien kaltaisesti, siis eivät ole muuttujia. Tässä kohtaa toivoisi Sunin tekevän vastaavat javaan.

        gettereihin ja settereihin ei kannata tunkea logiikkaa, ne on vain tietojen asettamista ja hakemista varten. Logiikka kannattaa asettaa omaan metodiinsa. Getterien ja setterien osalta voidaan sanoa, että olio osaa kertoa tietonsa ja asettaa tiedot. Tämä on niiden ainoa tehtävä.

        Myös testauksen kannalta on järkevämpää, että logiikkaa on omissa metodeissaan joita testataan eikä getterissä ja settereissä.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Lääppijä Lindtman jäi kiinni itse teosta

      Lindtman kyselemättä ja epäasiallisesti koskettelee viestintäpäällikköä. https://www.is.fi/politiikka/art-2000011780852
      Maailman menoa
      171
      3921
    2. Huomaatteko Demari Tytti ei esitä pahoitteluitaan

      Samanlainen ilmeisesti kuin Marin eli Uhriutuu no he ovat Demareita ja muiden yläpuolella siis omasta mielestään
      Maailman menoa
      81
      3119
    3. Turvaan tulleet lähettävät omia lapsiaan vaaraan - hullua

      MOT-ohjelman jakso ”Loma vaihtui kahleisiin” kertoi, kuinka Suomessa ja muualla Euroopassa asuvat somaliperheet lähettäv
      Maailman menoa
      46
      2153
    4. Vedonlyöntiä .

      Olen valmis lyömään ison vedon , että homma kaatuu . Jos kerta Sivonen ei lähde mukaan , niin ei tuoho usko kukaan muuka
      Ähtäri
      23
      2123
    5. Mikä on pahinta, mitä kaivatullesi

      pelkäät tapahtuvan? Jos kuolemaa, vakavia sairauksia yms. ei lasketa?
      Ikävä
      55
      1925
    6. TUNNISTELAATIKKO

      Tähän ketjuun voi laittaa yhdellä tai kahdella lauseella (tai vaikka yhdellä sanalla) täydellisen tunnisteen, jonka vain
      Ikävä
      85
      1341
    7. Tykkäätkö enemmän tavis- vai julkkiskisaajista tv:ssä?

      Tykkäätkö enemmän tavis- vai julkkiskisaajista tv:ssä? Moni reality ja visailuohjelma luottaa julkkiksiin, mutta sentään
      Tv-sarjat
      25
      1278
    8. Minkä tunteen tunnet

      juuri nyt? ap kiitollisuuden.
      Tunteet
      40
      1270
    9. Zoo jatkaa - jatkuuko mustamaalaus?

      Tänään on päätetty Zoon avaamisesta uudelleen. Mielenkiintoista nähdä kautokurujen reaktio, nyt kun kyse ei ole kunnalli
      Ähtäri
      58
      1058
    10. Valehdella saa, totuus salataan

      Vaikuttaa vähän siltä, että sensuuria toteutetaan juorupalstallakin. Asioita saa kaunistella ja vääristellä, mutta totuu
      Savonlinna
      10
      768
    Aihe