Brug af attributter med rubin-kode

Se på ethvert objektorienteret kode og det hele følger mere eller mindre det samme mønster. Opret et objekt, kalde nogle metoder på det objekt og få adgang til attributterne for det pågældende objekt. Der er ikke meget andet, du kan gøre med et objekt, bortset fra at videregive det som en parameter til et andet objekts metode. Men hvad vi er optaget af her er attributter.

Attributter er som forekomstvariabler du kan få adgang via notepunktet med objektprikker. For eksempel, person.name ville få adgang til en persons navn. Tilsvarende kan du ofte tildele til attributter som person.name = "Alice". Dette er en lignende funktion som medlemsvariabler (f.eks. I C ++), men ikke helt det samme. Der sker ikke noget specielt her, attributter implementeres på de fleste sprog ved hjælp af "getters" og "setters", eller metoder, der henter og indstiller attributterne fra forekomstvariabler.

Ruby skelner ikke mellem attributter og sættere og normale metoder. På grund af Rubys fleksible metode, der kalder syntaks, behøver der ikke skelnes. For eksempel,

instagram viewer
person.name og person.name () er den samme ting, du ringer til navn metode med nul parametre. Den ene ligner et metodekald, og den anden ligner en attribut, men de er begge begge de samme ting. De ringer begge bare til navn metode. Tilsvarende kan ethvert metodenavn, der ender med et ligesteg (=), bruges i en opgave. Udsagnet person.name = "Alice" er virkelig den samme ting som person.name = (alice), selvom der er et mellemrum mellem attributnavnet og det lige tegn, kaldes det stadig bare name = metode.

Du kan nemt implementere attributter selv. Ved at definere setter- og getter-metoder kan du implementere alle de attributter, du ønsker. Her er et eksempel på kode til implementering af navn attribut for en personklasse. Det gemmer navnet i en @navn forekomstvariabel, men navnet behøver ikke at være det samme. Husk, at der ikke er noget særligt ved disse metoder.

Én ting, du med det samme bemærker, er, at dette er en masse arbejde. Det er meget at skrive bare for at sige, at du vil have en attribut, der hedder navn der får adgang til @navn forekomstvariabel. Heldigvis leverer Ruby nogle bekvemmelighedsmetoder, der definerer disse metoder for dig.

Der er tre metoder i Modul klasse, som du kan bruge inde i dine klassedeklarationer. Husk, at Ruby ikke skelner mellem runtime og "compile time", og enhver kode inde i klassedeklarationer kan ikke kun definere metoder, men også opkaldsmetoder. Ringer til attr_reader, attr_writer og attr_accessor metoder vil på sin side definere de sættere og getters, vi definerede os i det foregående afsnit.

Det attr_reader metoden kan ligesom det, det lyder som om den vil gøre. Det tager et vilkårligt antal symbolparametre, og for hver parameter definerer en "getter" -metode, der returnerer forekomstvariablen med samme navn. Så vi kan erstatte vores navn metode i det foregående eksempel med attr_reader: navn.

Tilsvarende attr_writer metoden definerer en "setter" -metode for hvert symbol, der sendes til det. Bemærk, at ligestegnet ikke behøver at være en del af symbolet, kun attributnavnet. Vi kan erstatte name = metode fra det foregående eksempel med et opkald til attr_writier: navn.

Og som forventet attr_accessor gør jobbet for begge attr_writer og attr_reader. Hvis du har brug for både en setter og getter til en attribut, er det almindelig praksis at ikke kalde de to metoder separat, og i stedet ringe attr_accessor. Vi kunne erstatte begge det navn og name = metoder fra det foregående eksempel med et enkelt opkald til attr_accessor: navn.

Hvorfor skal du definere sættere manuelt? Hvorfor ikke bruge attr_ * metoder hver gang? Fordi de bryder indkapsling. Indkapsling er det vigtigste, der siger, at ingen eksterne enheder skal have ubegrænset adgang til din interne tilstand objekter. Alt skal få adgang til ved hjælp af en grænseflade, der forhindrer brugeren i at ødelægge den interne tilstand af objektet. Ved hjælp af ovennævnte metoder har vi slået et stort hul i vores indkapslingsvæg og lader absolut indstille noget til et navn, selv åbenlyst ugyldige navne.

En ting, du ofte ser, er det attr_reader bruges til hurtigt at definere en getter, men en brugerdefineret setter vil blive defineret, da den interne tilstand af objektet ofte ønsker at være Læs direkte fra den interne tilstand. Setteren defineres derefter manuelt og kontrollerer for at sikre, at den indstillede værdi giver mening. Eller måske mere almindeligt defineres ingen sættere overhovedet. De andre metoder i klassefunktionen indstiller forekomstvariablen bag getteren på en anden måde.

Vi kan nu tilføje en alder og korrekt implementere a navn attribut. Det alder attribut kan indstilles i konstruktormetoden, læses ved hjælp af alder getter men kun manipuleret ved hjælp af have_birthday metode, som vil øge alderen. Det navn attribut har en normal getter, men setteren sørger for, at navnet aktiveres og er i form af Fornavn efternavn.

instagram story viewer