[RUBY] Über Instanzvariablen und attr_ *

Überblick

Auch wenn es sich um eine bequeme Funktion handelt, kann es einige Nachteile geben.

Daher muss der Benutzer in der Lage sein, das Gleichgewicht zwischen Vor- und Nachteilen zu beurteilen und angemessen umzusetzen. Ich dachte, ich habe es in einem Artikel zusammengefasst.

In einigen Fällen überwiegt die Schwierigkeit der Wartung tatsächlich die Schwierigkeit, und ist sie erneut erforderlich? Ich hoffe, es wird hilfreich für Sie sein, darüber nachzudenken

Was passiert, wenn Sie zuerst attr_ * verwenden?

Die Getter-Methode wird durch den Namen des Arguments definiert, indem "attr_reader: name" gesetzt wird.

def name
  @name
end

Die Setter-Methode wird durch den Namen des Arguments definiert, indem "attr_writer: name" gesetzt wird.

def name=(val)
  @name = val
end

attr_accessor: name ist eine zusammengesetzte Methode aus Leser und Schreiber

Normalerweise sind Instanzvariablen, auf die mit "@ hoge" innerhalb der Instanz zugegriffen werden kann, öffentlich und die Methode ist definiert, sodass der Wert der Instanzvariablen von außen berührt werden kann.

Zu diesem Zeitpunkt ist es auch möglich, eine Methode privat mit "privat" zu definieren.

private
attr_reader :hoge

Über Vor- und Nachteile

verdienen

Anruf von außen

Es kann von außen verwendet werden, da es als "öffentliche" Methode geschnitten wird, was der ursprüngliche Zweck ist.

Wie Sie alle hier wissen.

Einfache Reparatur

class Hoge
  private
  attr_accessor :hoge

  def initialize(hoge:)
    @hoge = hoge
  end

  def connect
    Service.call(hoge: hoge) # <-Hier
  end
end

Wenn es so implementiert ist

def hoge
  @hoge + 1
end

Wenn Sie das Problem beheben müssen, können Sie es überschreiben, um die Fehlerbehebung zu vereinfachen.

Fehler

Umfang Bewusstsein

Sie müssen richtig über "öffentlich" oder "privat" usw. nachdenken.

Methodendefinition

Das versehentliche Definieren einer Methode kann zu widersprüchlichen Methodennamen führen

Lesbarkeit

--Wenn Sie es überschreiben können, wird die Methode überschrieben? Überprüfungsbedarf => Lesbarkeit ist eingeschränkt

Beispiel

class Hoge
  include Hoge::XXXable
  include Hoge::ZZZable

  private
  attr_accessor :hoge

  def initialize(hoge:)
    @hoge = hoge
  end

  def connect
    Service.call(param: param)
  end
end

module Hoge::XXXable
  include ::YYYable
  def param
    {
      hoge: hoge # <-Hier
    }
  end
end

Für das auf diese Weise in der Zielklasse enthaltene Voraussetzungsmodul (Cutout-Modul) Es verweist nur auf eine Instanzvariable, kann jedoch ein Methodenaufruf sein

Das ist

module Hoge::XXXable
  include ::YYYable
  def param
    {
      hoge: @hoge # <-Hier
    }
  end
end

Wenn dies der Fall ist, können Sie leicht verstehen, dass "die Instanzvariable der Klasse, die eingeschlossen und geladen werden soll, festgelegt wird", indem Sie sich nur die Quelle im Modul ansehen.

Da dies jedoch die Getter-Methode von attr ist, wo ist das "hoge" definiert, wenn Sie sich nur das "XXXable" -Modul ansehen? Ich verstehe nicht. Also irgendwo unten? Die Arbeit der Suche wird stattfinden. --Ist es in "XXXable" definiert? --In dem Modul enthalten oder erweitert um XXXable

Fazit

** Leicht zu pflegen **, das im Verdienst erwähnt wird, gilt in dem Sinne, dass es leicht zu überschreiben ist. Wenn der Bedarf zu diesem Zeitpunkt nicht vorhersehbar ist, ist es nicht ** schwierig zu warten **?

Ist dies nicht ein Fall, in dem diese Nachteile bei der Verwendung größer werden? Ich werde überlegen, ob ich es verwenden soll, während ich noch einmal darüber nachdenke Ich würde gerne ein besseres Programm schreiben

Recommended Posts

Über Instanzvariablen und attr_ *
Unterschied zwischen Variablen und Instanzvariablen
Organisieren Sie Klassen, Instanzen und Instanzvariablen
[Java] Unterschiede zwischen Instanzvariablen und Klassenvariablen
Informationen zum Einschließen von Instanz 2
Über Bean und DI
Über Klassen und Instanzen
Über bekommt und bekommt.chomp
Informationen zum Aufrufen von Instanzmethoden
Über Weiterleiten und Weiterleiten
Über Kapselung und Vererbung
Informationen zu Serializable und serialVersionUID
[Java] Variablen- und Typtypen
[Java Silver] Was sind Klassenvariablen, Instanzvariablen und lokale Variablen?
Über für Anweisung und wenn Anweisung
Über Java-Instanzen
Über synchronisierte und Wiedereintrittssperre
Java-Programmierung (Variablen und Daten)
Über Ruby-Hashes und -Symbole
[Java] Über String und StringBuilder
Ungefähr der gleiche und der gleiche Wert
Unterschied zwischen Klasse und Instanz
Über Klassen und Instanzen (Evolution)
Über die Zupfmethode und die ID-Methode
Überlegungen zu Klassen und Instanzen
Java-Klasse Variable Klassenmethode
Über Java-Paket und Import
Über Ruby und Objektmodell
[Vollständige Programmierung] §4 Variablen und Konstanten
Informationen zu Bereich und Umfang, in denen Day16-Variablen verwendet werden können
Unterschied zwischen Instanzmethode und Klassenmethode
Informationen zu statischen und nicht statischen Java-Methoden
Über Biocontainer fastqc und Java
Java Primer Series (Variationen und Typen)
Informationen zu den Methoden equals () und hashcode ()
[Java-Anfänger] Über Abstraktion und Schnittstelle
Über Ruby einfache Anführungszeichen und doppelte Anführungszeichen
[Ruby] Klassen, Instanzvariablen, Instanzen usw.
Informationen zur Einstellungsphase und Ausführungsphase von Gradle
Unterschied zwischen Instanzvariable und Klassenvariable
Informationen zum Ruby-Produktoperator (&) und zum Summenoperator (|)
[Ruby] Behandeln Sie Instanzvariablen mit Instanzmethoden
Informationen zu removeAll und RetainAll von ArrayList
If-Anweisung und Verzweigungsverarbeitung
Über objektorientierte Vererbung und über Ertrag Ruby
Informationen zu primitiven Java-Typen und Referenztypen
Überlegungen zu Schienen und sauberer Architektur
Dies und das über Base64 (Java)
Über Docker, gefälschten Server und Container