Attribútumok használata a Ruby-kóddal

click fraud protection

Nézz bármilyenre objektum-orientált kód és mindegyik többé-kevésbé ugyanazt a mintát követi. Hozzon létre egy objektumot, hívjon fel néhány módszert ehhez az objektumhoz és elérje az objektum attribútumait. Nem sok más tehet egy objektummal, kivéve, ha átadja azt paraméterként egy másik objektum módszerének. De amit itt foglalkoztatunk, az attribútumok.

Az attribútumok hasonlóak Példányváltozók az objektum pont jelöléssel érhető el. Például, person.name hozzáférne egy személy nevéhez. Hasonlóképpen, gyakran hozzárendelhet olyan attribútumokhoz, mint például person.name = "Alice". Ez hasonló a tagváltozókhoz (például a C ++ esetében), de nem egészen ugyanaz. Nincs itt semmi különös, az attribútumok a legtöbb nyelven "getters" és "setters", vagy olyan módszerekkel valósulnak meg, amelyek lekérik és beállítják az attribútumokat a példányváltozókból.

A Ruby nem tesz különbséget az attribútumgyűjtő és a beállító között a normál módszerek között. Mivel a Ruby rugalmas szintaxist hívó módszer miatt nincs különbségtétel. Például,

instagram viewer
person.name és person.name () ugyanaz, hívod a név nulla paraméterrel rendelkező módszer. Az egyik úgy néz ki, mint egy módszerhívás, a másik pedig egy attribútum, de valójában mindkettő ugyanaz. Mindketten csak hívják a név eljárás. Hasonlóképpen, bármely metódusnév, amely egyenlőségjelet (=) ad meg, felhasználható egy hozzárendelésben. Az állítás person.name = "Alice" valóban ugyanaz, mint a person.name = (Alice), bár van szóköz az attribútum neve és az egyenlőségjel között, még mindig csak hívja a name = eljárás.

Az attribútumokat önmagában is könnyen végrehajthatja. A setter és getter módszerek meghatározásával bármilyen attribútumot megvalósíthat. Íme néhány példakód a név attribútum egy személyosztályhoz. Tárolja a nevet egy @név példány változó, de a névnek nem kell egyeznie. Ne feledje, hogy ezekben a módszerekben nincs semmi különös.

Az egyik, amit rögtön észre fog venni, hogy ez sok munka. Sokat gépelni csak azt mondani, hogy egy attribútumot szeretne név amely hozzáfér a @név példány változó. Szerencsére a Ruby olyan kényelmi módszereket kínál, amelyek meghatározzák ezeket a módszereket az Ön számára.

Három módszer létezik a modul osztály, amelyet felhasználhat az osztálynyilatkozatokban. Ne felejtse el, hogy a Ruby nem tesz különbséget a futásidejű és a "fordítási idő" között, és az osztálynyilatkozatokban szereplő bármely kód nem csak a metódusokat definiálja, hanem a metódusokat is meghívja. Hívja a attr_reader, attr_writer és attr_accessor A módszerek viszont meghatározzák azokat a settereket és gettereket, akiket az előző szakaszban határoztuk meg.

Az attr_reader módszer ugyanúgy tetszik, mint amilyennek hangzik. Tetszőleges számú szimbólumparamétert igényel, és minden paraméternél meghatároz egy "getter" módszert, amely az azonos nevű példányváltozót adja vissza. Tehát kicserélhetjük a miénket név módszer az előző példában a attr_reader: név.

Hasonlóképpen: attr_writer módszer meghatároz egy "beállító" módszert minden hozzá átadott szimbólumhoz. Vegye figyelembe, hogy az egyenlőségjelnek nem kell lennie a szimbólum részének, csak az attribútum nevét. Cserélhetjük a name = módszer az előző példából egy hívással attr_writier: név.

És a várakozások szerint attr_accessor mindkettő munkáját elvégzi attr_writer és attr_reader. Ha egy attribútumhoz mind setterre, mind getterre van szükség, akkor szokás, hogy a két módszert külön nem hívja meg, hanem hívja attr_accessor. Cserélhetnénk mindkét az név és name = módszerek az előző példából egyetlen hívással attr_accessor: név.

Miért kellene manuálisan meghatározni a beállítókat? Miért nem használja a attr_ * módszerek minden alkalommal? Mert megtörik a kapszulát. A beágyazás az az elv, amely szerint egyetlen külső entitásnak sem szabad korlátlan hozzáférése az Ön belső állapotához tárgyak. Mindent felülettel kell elérni, amely megakadályozza a felhasználót, hogy megsérölje az objektum belső állapotát. A fenti módszerekkel nagy lyukat lyukasztunk a kapszulázási falunkba, és hagyhattunk bármit is megadni egy névhez, még nyilvánvalóan érvénytelen neveket is.

Egy dolog, amit gyakran látni fog attr_reader kerül felhasználásra a getter gyors meghatározásához, de egyéni setter kerül meghatározásra, mivel az objektum belső állapota gyakran azt akarja, hogy olvas közvetlenül a belső állapotból. A beállító ezután manuálisan kerül meghatározásra, és ellenőrzi, hogy a beállított értéknek van-e értelme. Vagy talán gyakrabban, semmilyen szetter nincs meghatározva. Az osztályfüggvény többi módszere más módon állítja be a getter mögötti példányváltozót.

Most hozzáadhatunk egy kor és megfelelően hajtsa végre a név tulajdonság. Az kor Az attribútum beállítható a konstruktor módszerben, a kor getter, de csak a have_birthday módszer, amely növeli a korot. Az név Az attribútumnak normál getterje van, de a setter gondoskodik arról, hogy a név nagybetűvel jelenjen meg és a formája legyen Keresztnév vezetéknév.

instagram story viewer