Коришћење атрибута са Руби кодом

Погледајте било кога објектно оријентисан код и све више или мање слиједи исти образац. Направите објект, назовите неке методе тог објекта и приступите атрибутима тог објекта. Не можете много друго да урадите са објектом, осим што га проследите као параметар методи другог објекта. Али оно што нас овде занима су атрибути.

Атрибути су као променљиве примерака можете приступити преко објектне тачке нотације. На пример, персон.наме приступио би имену неке особе. Слично томе, често можете доделити атрибуте попут персон.наме = "Алица". Ово је слична карактеристика променљивим чланицама (као што је Ц ++), али није сасвим исто. Овдје се ништа посебно не догађа, атрибути се имплементирају у већини језика користећи "геттерс" и "сеттерс", или методе које проналазе и постављају атрибуте из варијабли инстанци.

Руби не прави разлику између атрибута и сеттера и нормалних метода. Због Рубијеве флексибилне методе која позива синтаксу, не треба правити разлику. На пример, персон.наме и персон.наме () иста је ствар, ви зовете

instagram viewer
име метода са нултим параметрима. Један изгледа као позив методе, а други изгледа као атрибут, али заиста су обоје иста ствар. Обоје само зову име метод. Слично томе, било који назив методе који завршава знаком једнаке (=) може се користити у задатку. Изјава персон.наме = "Алица" је стварно иста ствар као персон.наме = (алице), иако постоји простор између имена атрибута и знака једнаке, он још увек само зове наме = метод.

Атрибуте можете лако имплементирати сами. Дефинисањем метода сеттера и геттера можете имплементирати било који атрибут који желите. Ево неколико примера кода за имплементацију име атрибут за класу особе. То име чува у @наме варијабла примерака, али име не мора да буде исто. Запамтите, нема ништа посебно у овим методама.

Једна ствар коју ћете приметити одмах је да је то доста посла. Пуно је куцања само да бисте рекли да желите атрибут по имену име која приступа @наме варијабла примерака. Срећом, Руби нуди неке погодне методе које ће те методе дефинисати за вас.

Постоје три методе Модул класе коју можете користити унутар декларације своје класе. Имајте на уму да Руби не прави разлику између времена извршавања и „времена компилације“, а било који код унутар декларације класе не може само да дефинише методе, већ и методе позива. Позивање аттр_реадер, аттр_вритер и аттр_аццессор методе ће заузврат дефинисати сеторе и геттере које смо сами дефинисали у претходном одељку.

Тхе аттр_реадер метода се свиђа баш ономе што звучи као да ће се учинити. Потребно је узети било који број параметара симбола и за сваки параметар дефинира методу "геттер" која враћа инстанцу истог назива. Дакле, можемо заменити наше име метода у претходном примеру са аттр_реадер: име.

Слично томе аттр_вритер метода дефинира методу "сеттер" за сваки симбол просљеђен њему. Имајте на уму да знак једнаке не мора бити део симбола, већ само име атрибута. Можемо заменити наме = метода из претходног примера са позивом на аттр_вритиер: име.

И, како се и очекивало, аттр_аццессор ради оба посла аттр_вритер и аттр_реадер. Ако су вам потребни и сеттер и геттер за атрибут, уобичајена је пракса да две методе не зовете одвојено, већ уместо тога позивате аттр_аццессор. Могли бисмо заменити и једно и друго тхе тхе име и наме = методе из претходног примера једним позивом на аттр_аццессор: име.

Зашто бисте ручно дефинирали сеторе? Зашто не бисте користили аттр_ * методе сваки пут? Зато што разбијају енкапсулацију. Инкапсулација је главна ствар која наводи да ниједан спољни ентитет не би требао имати неограничен приступ вашем унутрашњем стању објеката. Свему треба приступити помоћу интерфејса који спречава корисника да оштети унутрашње стање објекта. Користећи горе наведене методе, пробушили смо велику рупу у нашем зиду за капсулацију и дозволили да се за име може поставити апсолутно било шта, чак и очигледно неваљана имена.

Једно што ћете често видети је то аттр_реадер користиће се за брзо дефинисање геттера, али прилагођени сеттер ће бити дефинисан с обзиром да често жели бити интерно стање објекта читати директно из интерне државе. Сеттер се затим дефинише ручно и врши провере да би вредност била постављена има смисла. Или, можда чешће, ниједан сеттер уопште није дефинисан. Остале методе у функцији класе постављају променљиву инстанцу иза геттера на неки други начин.

Сада можемо додати старост и правилно имплементирати а име атрибут. Тхе старост атрибут може бити постављен у конструкторској методи, која се чита помоћу старост геттер, али се само манипулише помоћу хаве_биртхдаи метода која ће повећавати старост. Тхе име атрибут има нормалан геттер, али сетер постара да се име користи великим словима и да је у облику Име и презиме.