Bruke attributter med Rubin Code

click fraud protection

Se på hvilken som helst objektorientert kode og det hele mer eller mindre følger det samme mønsteret. Lag et objekt, ring noen metoder på det objektet og få tilgang til attributtene til det objektet. Det er ikke mye annet du kan gjøre med et objekt, bortsett fra å gi det som en parameter til et annet objekts metode. Men det vi er opptatt av her er attributter.

Attributter er som forekomstvariabler kan du få tilgang via notifikasjonen av objektprikken. For eksempel, person.name ville få tilgang til en persons navn. Tilsvarende kan du ofte tilordne til attributter som person.name = "Alice". Dette er en lignende funksjon som medlemsvariabler (for eksempel i C ++), men ikke helt den samme. Det er ikke noe spesielt som skjer her, attributter implementeres på de fleste språk ved å bruke "getters" og "setters", eller metoder som henter og setter attributtene fra forekomstvariabler.

Ruby skiller ikke mellom attributtketter og settere og normale metoder. På grunn av Rubys fleksible metode som kaller syntaks, trenger det ikke skilles. For eksempel,

instagram viewer
person.name og person.name () er den samme tingen, du ringer Navn metode med null parametere. Den ene ser ut som en metodeanrop, og den andre ser ut som en attributt, men de er egentlig begge de samme tingene. De kaller begge bare Navn metode. Tilsvarende kan alle metodenavn som ender i et likhetstegn (=) brukes i en oppgave. Uttalelsen person.name = "Alice" er egentlig den samme tingen som person.name = (Alice), selv om det er et mellomrom mellom attributtnavnet og likhetstegnet, er det fremdeles bare å ringe name = metode.

Du kan enkelt implementere attributter selv. Ved å definere setter- og getter-metoder, kan du implementere ethvert attributt du ønsker. Her er noen eksempelkode som implementerer Navn attributt for en personklasse. Den lagrer navnet i en @Navn forekomstvariabel, men navnet trenger ikke å være det samme. Husk at det ikke er noe spesielt med disse metodene.

En ting du vil legge merke til med en gang, er at dette er mye arbeid. Det er mye å skrive bare for å si at du vil ha et attributt som heter Navn som får tilgang til @Navn forekomstvariabel. Heldigvis gir Ruby noen bekvemmelighetsmetoder som vil definere disse metodene for deg.

Det er tre metoder i modul klasse som du kan bruke inne i klassedeklarasjonene. Husk at Ruby ikke skiller mellom runtime og "compile time", og at eventuelle koder i klassedeklarasjoner ikke bare kan definere metoder, men også kalle metoder. Ringer til attr_reader, attr_writer og attr_accessor metoder vil på sin side definere setters og getters vi definerte oss i forrige seksjon.

De attr_reader metoden liker akkurat det det høres ut som den vil gjøre. Den tar et hvilket som helst antall symbolparametere, og for hver parameter definerer en "getter" -metode som returnerer forekomstvariabelen med samme navn. Så vi kan erstatte våre Navn metoden i forrige eksempel med attr_reader: navn.

Tilsvarende attr_writer metoden definerer en "setter" -metode for hvert symbol som sendes til det. Legg merke til at likhetstegnet ikke trenger å være en del av symbolet, bare attributtnavnet. Vi kan erstatte name = metode fra forrige eksempel med en samtale til attr_writier: navn.

Og som forventet attr_accessor gjør jobben til begge attr_writer og attr_reader. Hvis du trenger både en setter og getter for et attributt, er det vanlig å ikke ringe de to metodene hver for seg, og i stedet ringe attr_accessor. Vi kan erstatte både de Navn og name = metoder fra forrige eksempel med en enkelt samtale til attr_accessor: navn.

Hvorfor skal du definere bosettere manuelt? Hvorfor ikke bruke attr_ * metoder hver gang? Fordi de bryter innkapsling. Innkapsling er den viktigste som sier at ingen utenforstående enheter skal ha ubegrenset tilgang til den interne tilstanden til din objekter. Alt skal få tilgang til ved hjelp av et grensesnitt som forhindrer brukeren i å ødelegge den indre tilstanden til objektet. Ved hjelp av metodene ovenfor har vi slått et stort hull i innkapslingsveggen vår og tillatt absolutt alt å være satt for et navn, selv åpenbart ugyldige navn.

En ting du ofte vil se er det attr_reader vil bli brukt til å raskt definere en getter, men en tilpasset setter vil bli definert siden den interne tilstanden til objektet ofte vil være lese direkte fra den interne staten. Setteren defineres deretter manuelt og kontrollerer for å sikre at verdien som settes gir mening. Eller, kanskje mer vanlig, er ingen setter definert i det hele tatt. De andre metodene i klassefunksjonen setter forekomstvariabelen bak getteren på noen annen måte.

Vi kan nå legge til en alder og riktig implementere a Navn Egenskap. De alder attributtet kan settes i konstruktormetoden, leses ved å bruke alder getter men bare manipulert ved hjelp av have_birthday metode, som vil øke alderen. De Navn attributt har en normal getter, men setteren sørger for at navnet er store bokstaver og er i form av Fornavn Etternavn.

instagram story viewer