Vaata ükskõik objektorienteeritud kood ja see kõik järgib enam-vähem sama mustrit. Looge objekt, helistage sellele objektile mõned meetodid ja pääsete juurde selle objekti atribuute. Objektiga pole palju muud teha, kui anda see parameetrina edasi mõne teise objekti meetodile. Kuid see, mis meil siin muret teeb, on atribuudid.
Atribuudid on nagu esinemismuutujad pääsete juurde objektpunktide märkimise kaudu. Näiteks, inimene.nimi pääseks inimese nime juurde. Samamoodi saate sageli omistada atribuute nagu person.name = "Alice". See on sarnane omadus liikmemuutujatele (näiteks C ++), kuid mitte päris sama. Siin ei toimu midagi erilist, atribuudid rakendatakse enamikus keeltes, kasutades "gettereid" ja "setterit" või meetodeid, mis atribuute leidvad ja määravad esinemismuutujatest.
Ruby ei tee vahet atribuudi hankijate ja määrajate ning tavaliste meetodite vahel. Kuna Ruby on süntaksiks kutsunud paindliku meetodi tõttu, pole vaja vahet teha. Näiteks, inimene.nimi ja inimene.nimi () on sama asi, helistate
nimi nullparameetritega meetod. Üks näeb välja nagu metoodikõne ja teine atribuut, kuid nad on mõlemad sama asi. Nad mõlemad lihtsalt helistavad nimi meetod. Samamoodi võib ülesandes kasutada mis tahes meetodi nime, mis lõpeb võrdusmärgiga (=). Avaldus person.name = "Alice" on tegelikult sama asi nagu inimene.nimi = (alice), kuigi atribuudi nime ja võrdusmärgi vahel on tühik, kutsub see ikkagi lihtsalt numbrit nimi = meetod.Atribuute saate hõlpsalt ise rakendada. Määratledes setteri ja getteri meetodid, saate rakendada mis tahes atribuuti, mida soovite. Siin on mõned näited koodist nimi atribuut inimese klassile. See salvestab nime a @nimi esinemismuutuja, kuid nimi ei pea olema sama. Pidage meeles, et nendes meetodites pole midagi erilist.
Üks asi, mida kohe märkate, on see, et see on palju tööd. See on palju trükkimist, kui lihtsalt öelda, et soovite atribuuti nimega nimi mis pääseb juurde @nimi esinemismuutuja. Õnneks pakub Ruby mõnda mugavusmeetodit, mis need meetodid teile määratleb.
Selles on kolm meetodit Moodul klass, mida saate kasutada oma klassi deklaratsioonide sees. Pidage meeles, et Ruby ei tee vahet jooksuaja ja aja koostamise vahel ning klassideklaratsioonides sisalduv kood ei saa mitte ainult määratleda meetodeid, vaid ka kutsuda meetodeid. Helistamine attr_reader, attr_writer ja attr_accessor meetodid määratlevad omakorda settersid ja gettersid, keda me eelmises osas määratlesime.
attr_reader meetod meeldib täpselt nii, nagu see kõlab. See võtab suvalise arvu sümboliparameetreid ja määratleb iga parameetri jaoks "getteri" meetodi, mis tagastab sama nime esinemismuutuja. Niisiis, me saame oma asendada nimi eelmises näites meetodiga attr_reader: nimi.
Samamoodi attr_writer meetod määratleb iga sellele edastatud sümboli jaoks "setteri" meetodi. Pange tähele, et võrdusmärk ei pea olema sümboli osa, vaid ainult atribuudi nimi. Me saame asendada nimi = eelmises näites toodud meetod kõnega attr_writier: nimi.
Ja nagu oodata, attr_accessor teeb mõlema tööd attr_writer ja attr_reader. Kui vajate atribuudi jaoks nii setterit kui ka getterit, on tavaks mitte kutsuda kahte meetodit eraldi, vaid helistada selle asemel attr_accessor. Me võiksime asendada mõlemad nimi ja nimi = eelmises näites toodud meetodeid ühe kõnega attr_accessor: nimi.
Miks peaksite määrajaid käsitsi määratlema? Miks mitte kasutada? attr_ * meetodid iga kord? Sest need rikuvad kapseldamist. Kapseldamine on peamine, mille kohaselt ühelgi välisel üksusel ei tohiks olla piiramatut juurdepääsu teie sisemisele olekule objektid. Kõigile tuleks juurde pääseda liidese abil, mis takistab kasutajal objekti sisemist olekut rikkuda. Ülaltoodud meetodeid kasutades oleme oma kapseldusseinasse teinud suure augu ja lubanud nimele seada absoluutselt ükskõik mida, isegi ilmselgelt kehtetuid nimesid.
Üks asi, mida sageli näete, on see attr_reader kasutatakse getteri kiireks määratlemiseks, kuid määratletakse ka kohandatud setter, kuna objekti sisemine olek soovib sageli olla loe otse sisemisest olekust. Seejärel määratletakse setter käsitsi ja ta kontrollib, kas määratud väärtus on mõttekas. Või võib-olla sagedamini pole setterit üldse määratletud. Klassifunktsiooni muud meetodid määravad getteri taga oleva astme muutuja muul viisil.
Nüüd saame lisada vanus ja rakendage a nimi atribuut. vanus Atribuudi saab seadistada konstruktorimeetodil, loe kasutades vanus getter, kuid ainult manipuleerida kasutades sünnipäev meetod, mis suurendab vanust. nimi Atribuudil on tavaline getter, kuid setter hoolitseb selle eest, et nimi oleks kirjutatud suurtähtedega ja kujul Eesnimi Perekonnanimi.