Podívejte se na všechny objektově orientovaný kód a to víceméně podle stejného vzoru. Vytvořte objekt, zavolejte na něj některé metody a získejte přístup k jeho atributům. S objektem nemůžete dělat nic jiného než předat jej jako parametr jiné metodě objektu. Ale to, co nás zajímá, jsou atributy.
Atributy jsou podobné proměnné instance získáte přístup pomocí notace tečky objektu. Například, jméno osoby bude mít přístup ke jménu osoby. Podobně můžete často přiřadit atributy jako person.name = "Alice". Toto je podobná funkce jako členské proměnné (například v C ++), ale ne úplně stejná. Nic se zde neděje, atributy jsou implementovány ve většině jazyků pomocí „getters“ a „setters“ nebo metod, které načítají a nastavují atributy z proměnných instance.
Ruby nerozlišuje mezi getery a settersy atributů a normálními metodami. Kvůli flexibilní syntaxi volání Ruby není třeba rozlišovat. Například, jméno osoby a person.name () jsou to samé, voláte název metoda s nulovými parametry. Jeden vypadá jako volání metody a druhý vypadá jako atribut, ale ve skutečnosti jsou to stejné. Oba jen volají
název metoda. Podobně lze v přiřazení použít libovolný název metody, který končí znaménkem rovná se (=). Prohlášení person.name = "Alice" je opravdu to samé jako person.name = (alice), přestože mezi názvem atributu a znaménkem rovnosti je mezera, stále to jen volá name = metoda.Atributy můžete snadno implementovat sami. Definováním metod setter a getter můžete implementovat libovolný atribut, který si přejete. Zde je příklad kódu implementujícího název atribut třídy osob. Uloží jméno do @název proměnná instance, ale název nemusí být stejný. Pamatujte, že o těchto metodách není nic zvláštního.
Jedna věc, kterou si hned všimnete, je, že je to hodně práce. Je to hodně psaní jen říct, že chcete atribut pojmenovaný název který přistupuje k internetu @název proměnná instance. Naštěstí Ruby poskytuje některé metody pohodlí, které tyto metody definují za vás.
V systému existují tři metody Modul třídy, které můžete použít uvnitř deklarací třídy. Pamatujte, že Ruby nerozlišuje mezi runtime a „compile time“ a jakýkoli kód uvnitř deklarací třídy může nejen definovat metody, ale také volat metody. Volání attr_reader, attr_writer a attr_accessor metody budou zase definovat settery a getery, které jsme sami definovali v předchozí sekci.
attr_reader metoda dělá stejně jako to, co zní, jako by to udělalo. Trvá jakýkoli počet parametrů symbolu a pro každý parametr definuje metodu „getter“, která vrací instanční proměnnou se stejným názvem. Takže můžeme nahradit naše název metoda v předchozím příkladu s attr_reader: jméno.
Podobně attr_writer metoda definuje metodu "setter" pro každý předaný symbol. Všimněte si, že znaménko rovná se nemusí být součástí symbolu, pouze název atributu. Můžeme nahradit name = metoda z předchozího příkladu s voláním na attr_writier: name.
A jak se očekávalo, attr_accessor dělá práci obou attr_writer a attr_reader. Pokud pro atribut potřebujete setr i getter, je běžnou praxí nevolat obě metody odděleně a místo toho volat attr_accessor. Mohli bychom nahradit oba název a name = metody z předchozího příkladu s jediným hovorem na attr_accessor: jméno.
Proč byste měli definovat nastavovače ručně? Proč nepoužívat attr_ * metody pokaždé? Protože rozbijí zapouzdření. Zapouzdření je princip, který říká, že žádná vnější entita by neměla mít neomezený přístup k vnitřnímu stavu vašeho objekty. Ke všemu by mělo být přistupováno pomocí rozhraní, které zabraňuje uživateli v poškození vnitřního stavu objektu. Pomocí výše uvedených metod jsme do naší zapouzdřovací stěny vyrazili velkou díru a umožnili jsme nastavit pro cokoli jméno, dokonce i zjevně neplatná jména, absolutně cokoli.
Jedna věc, kterou často uvidíte, je to attr_reader bude použito k rychlé definici getteru, ale bude definován vlastní setter, protože vnitřní stav objektu často chce být číst přímo z vnitřního stavu. Nastavovač je poté definován ručně a kontroluje, zda má nastavená hodnota smysl. Nebo, snad více obyčejně, žádný setter není definován vůbec. Jiné metody ve funkci třídy nastavují proměnnou instance za getter jiným způsobem.
Nyní můžeme přidat stáří a správně implementovat a název atribut. stáří Atribut lze nastavit v konstruktorové metodě, číst pomocí stáří getter, ale manipuloval pouze pomocí have_birthday metoda, která zvýší věk. název Atribut má normální getter, ale setter se ujistí, že jméno je velké a je ve tvaru Jméno Příjmení.