In object.initialize ist es besser, self zu verwenden. Über @?

8

Es gibt eine Konvention, um die Attribute eines Objekts soweit möglich über seine Instanzvariablen zu referenzieren. Praktisches objektorientiertes Design in Ruby sagt:

  

Umschließen Sie Instanzvariablen immer in Accessormethoden statt direkt   Bezug auf Variablen ...

Dies wird mit einem Beispiel gezeigt, das ich umschrieben habe:

%Vor%

Die gängigste Methode zum Erstellen eines neuen Objekts mit einer Instanzvariablen ist:

%Vor%

@title= greift direkt auf die Instanzvariable title zu. Angenommen, wir folgen der Konvention 'Attribut über Instanzvariable' , ist es besser, self.title= zu verwenden, was würde das Objekt anweisen, sich selbst die Nachricht title= zu senden und dabei das Attribut write method über die Instanzvariable direkt zu benutzen?

%Vor%

Das Buch spricht über "Attribut über Instanzvariable" mit Bezug auf das Lesen einer Instanzvariable, aber nicht auch für das Schreiben?

    
ben 10.01.2014, 04:07
quelle

2 Antworten

10
  

Das Buch spricht über "Attribut über Instanzvariable" mit Bezug   um eine Instanzvariable zu lesen, aber gilt das nicht auch für das Schreiben?

Ja, das gilt auch für das Schreiben. Die Methode initialize ist jedoch speziell, da sie für das Einrichten des Objekts verantwortlich ist. Wenn Sie eine Setter-Methode verwenden, tun Sie dies, weil der Setter möglicherweise zusätzliche Arbeit leistet (z. B. Attribut-Setter in Rails). In einem Initialisierer möchten Sie normalerweise keine Nebenwirkungen haben, daher greifen Sie direkt auf Instanzvariablen zu.

    
phoet 12.01.2014, 05:22
quelle
0

Zunächst ist in einigen Fällen self.feature= bevorzugter als @feature= , im Allgemeinen in diesem Fall, wenn die Zuweisung zu feature property shell mehr Aktionen ausführt, als nur die Zuweisung. Zum Beispiel in einer Datenbank Zugriffsmethoden.

Als Zweites können Sie in dem guten Ruby-Style-Guide sehen, dass der gute Style self.feature= nur eingebunden ist einmal, wenn die komplexe Zuweisung erfolgt ist. Dies bedeutet, dass nicht nur eine Instanzvariable unterstützt wird. Beim Lesen wird immer eine Konstruktion wie Feature == "Wert" verwendet.

    
quelle

Tags und Links