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
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
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.
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.
Sie müssen richtig über "öffentlich" oder "privat" usw. nachdenken.
Das versehentliche Definieren einer Methode kann zu widersprüchlichen Methodennamen führen
--Wenn Sie es überschreiben können, wird die Methode überschrieben? Überprüfungsbedarf => Lesbarkeit ist eingeschränkt
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
** 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