Verwenden von Attributen mit Ruby-Code

Schau dir welche an objektorientierter Code und alles folgt mehr oder weniger dem gleichen Muster. Erstellen Sie ein Objekt, rufen Sie einige Methoden für dieses Objekt auf und greifen Sie auf Attribute dieses Objekts zu. Sie können mit einem Objekt nicht viel anderes tun, als es als Parameter an die Methode eines anderen Objekts zu übergeben. Aber hier geht es um Attribute.

Attribute sind wie Instanzvariablen Sie können über die Objektpunktnotation zugreifen. Beispielsweise, Name der Person würde auf den Namen einer Person zugreifen. Ebenso können Sie häufig Attribute wie zuweisen person.name = "Alice". Dies ist eine ähnliche Funktion wie Mitgliedsvariablen (wie in C ++), jedoch nicht ganz dieselbe. Hier ist nichts Besonderes los. Attribute werden in den meisten Sprachen mithilfe von "getters" und "setters" oder Methoden implementiert, mit denen die Attribute aus Instanzvariablen abgerufen und festgelegt werden.

Ruby unterscheidet nicht zwischen Attribut-Gettern und -Setzern und normalen Methoden. Aufgrund der flexiblen Methode zum Aufrufen der Syntax von Ruby muss keine Unterscheidung getroffen werden. Beispielsweise,

instagram viewer
Name der Person und Name der Person() sind das gleiche, du rufst das an Name Methode mit Nullparametern. Einer sieht aus wie ein Methodenaufruf und der andere wie ein Attribut, aber beide sind wirklich dasselbe. Sie rufen beide nur an Name Methode. Ebenso kann jeder Methodenname, der mit einem Gleichheitszeichen (=) endet, in einer Zuweisung verwendet werden. Die Aussage person.name = "Alice" ist wirklich das gleiche wie person.name = (alice)Obwohl zwischen dem Attributnamen und dem Gleichheitszeichen ein Leerzeichen steht, wird immer noch nur das aufgerufen name = Methode.

Sie können Attribute einfach selbst implementieren. Durch Definieren von Setter- und Getter-Methoden können Sie jedes gewünschte Attribut implementieren. Hier ist ein Beispielcode für die Implementierung des Name Attribut für eine Personenklasse. Es speichert den Namen in a @Name Instanzvariable, aber der Name muss nicht identisch sein. Denken Sie daran, dass diese Methoden nichts Besonderes sind.

Eine Sache, die Sie sofort bemerken werden, ist, dass dies eine Menge Arbeit ist. Es wird viel getippt, nur um zu sagen, dass Sie ein Attribut mit dem Namen möchten Name das greift auf die @Name Instanzvariable. Glücklicherweise bietet Ruby einige praktische Methoden, die diese Methoden für Sie definieren.

Es gibt drei Methoden in der Modul Klasse, die Sie in Ihren Klassendeklarationen verwenden können. Denken Sie daran, dass Ruby nicht zwischen Laufzeit und "Kompilierungszeit" unterscheidet und jeder Code in Klassendeklarationen nicht nur Methoden definieren, sondern auch Methoden aufrufen kann. Rufen Sie die attr_reader, attr_writer und attr_accessor Methoden definieren wiederum die Setter und Getter, die wir im vorherigen Abschnitt selbst definiert haben.

Das attr_reader Methode mag genau das, wie es sich anhört. Es werden beliebig viele Symbolparameter verwendet und für jeden Parameter eine "Getter" -Methode definiert, die die gleichnamige Instanzvariable zurückgibt. So können wir unsere ersetzen Name Methode im vorherigen Beispiel mit attr_reader: name.

Ebenso die attr_writer Methode definiert eine "Setter" -Methode für jedes an sie übergebene Symbol. Beachten Sie, dass das Gleichheitszeichen nicht Teil des Symbols sein muss, sondern nur der Attributname. Wir können die ersetzen name = Methode aus dem vorherigen Beispiel mit einem Aufruf von attr_writier: name.

Und wie erwartet attr_accessor macht den Job von beiden attr_writer und attr_reader. Wenn Sie sowohl einen Setter als auch einen Getter für ein Attribut benötigen, ist es üblich, die beiden Methoden nicht separat aufzurufen, sondern aufzurufen attr_accessor. Wir könnten ersetzen beide das Name und name = Methoden aus dem vorherigen Beispiel mit einem einzigen Aufruf von attr_accessor: name.

Warum sollten Sie Setter manuell definieren? Warum nicht die attr_ * Methoden jedes Mal? Weil sie die Kapselung brechen. Die Kapselung ist das Prinzip, das besagt, dass keine externe Entität uneingeschränkten Zugriff auf den internen Status Ihrer Person haben sollte Objekte. Auf alles sollte über eine Schnittstelle zugegriffen werden, die verhindert, dass der Benutzer den internen Status des Objekts beschädigt. Mit den oben genannten Methoden haben wir ein großes Loch in unsere Kapselungswand gestanzt und zugelassen, dass für einen Namen absolut alles festgelegt werden kann, auch offensichtlich ungültige Namen.

Eine Sache, die Sie oft sehen werden, ist die attr_reader wird verwendet, um schnell einen Getter zu definieren, aber ein benutzerdefinierter Setter wird definiert, da der interne Status des Objekts häufig sein möchte lesen direkt aus dem internen Zustand. Der Setter wird dann manuell definiert und prüft, ob der eingestellte Wert sinnvoll ist. Oder vielleicht häufiger ist überhaupt kein Setter definiert. Die anderen Methoden in der Klassenfunktion setzen die Instanzvariable hinter dem Getter auf andere Weise.

Wir können jetzt eine hinzufügen Alter und richtig implementieren a Name Attribut. Das Alter Das Attribut kann in der Konstruktormethode festgelegt und mit dem gelesen werden Alter Getter aber nur mit dem manipuliert have_birthday Methode, die das Alter erhöht. Das Name Das Attribut hat einen normalen Getter, aber der Setter stellt sicher, dass der Name groß geschrieben wird und die Form hat Vorname Nachname.