Klasse & lt; & lt; Selbst vs Selbst. Methode mit Ruby: Was ist besser?
Diese Ruby Style Guide sagt, dass ist besser mit self.method_name
statt class method_name
. Aber Warum?
class TestClass
# bad
class << self
def first_method
# body omitted
end
def second_method_etc
# body omitted
end
end
# good
def self.first_method
# body omitted
end
def self.second_method_etc
# body omitted
end
end
Gibt es performance-Probleme?
InformationsquelleAutor der Frage Mich Dart | 2012-06-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
class << self
ist gut beim halten Sie alle, Ihre Klasse zu Methoden in der gleichen block. Wenn Methoden hinzu kommen, indef self.method
ab dann gibt es keine Garantie (außer übereinkommen und Wunschdenken), dass es nicht eine extra Methode der Klasse versteckt, die später in der Datei.def self.method
ist gut, die explizit besagt, dass eine Methode ist eine Methode der Klasse, in der Erwägung, dass mitclass << self
Sie haben zu gehen und finden Sie die container selbst.Welche dieser ist mehr wichtig, Sie ist eine subjektive Entscheidung und hängt auch davon ab, wie viele andere Menschen sind an dem code und was Ihre Vorlieben sind.
InformationsquelleAutor der Antwort Gareth
Generell
class << self
verwendet wird, in metaprogramming um die Klasse als selbst für einen längeren Zeitraum. Wenn ich versuche zu schreiben, die 10 Methoden, ich würde es gerne so:Dies schaffen würde 10 Methoden (method1, method2, Methode3, etc.) das würde einfach nur wieder die Nummer. Ich würde
class << self
für Klarheit in diesem Fall, da in metaprogrammingself
ist entscheidend. Litteringself.
im inneren würde es tatsächlich machen Dinge weniger lesbar.Wenn Sie nur die Definition der Klasse Methoden normalerweise, halten Sie sich an
self.class_method_name
weil mehr Menschen sind wahrscheinlich, um es zu verstehen. Keine Notwendigkeit zu bringen, die sich in meta-syntax, es sei denn, Sie erwarten, dass Ihr Publikum, um es zu verstehen.InformationsquelleAutor der Antwort Chris
Wie oben erwähnt, beide Stile zu sein scheinen gleichwertig, aber mit
class << self
erlaubt es, die Marke-Klasse Methoden alsprivate
oderprotected
. Zum Beispiel:private
betrifft nur Instanz-Methoden. Die Verwendung der singleton-Klasse, wir sind die Instanz-Methoden der Klasse, die wiederum in der Klasse Methoden der übergeordneten Klasse!Können wir auch mark-Klasse Methoden als
private
mitdef self
:Aber wir können nicht markieren Sie als
protected
gibt es keineprotected_class_method
. (Da jedoch Klasse ist die einzige Instanz seiner singletonclass, private Methode der Klasse und der Klasse geschützt-Methoden sind fast die gleichen, außer Ihre Aufruf-syntax ist anders.)Es ist auch weniger einfacher als mit
class << self
zu markierenprivate
Klasse Methoden, da haben Sie, um eine Liste aller Methodennamen inprivate_class_method
oder Präfixprivate_class_method
um alle privaten Klasse-Methode-definition.InformationsquelleAutor der Antwort Jonathan O'Connor
Ich gehe davon aus, dass Sie denken
self.*
ist besser, da können Sie sicher sagen, es ist eine Klasse oder eine Instanz-Methode, ohne scrollen nach oben und Suche von Inhalten dieserclass << self
string.InformationsquelleAutor der Antwort Flexoid
Je nachdem, was Sie wollen. Beide sind sehr klar, was Sie tun. Aber ich denke, einige Empfehlungen für diese.
Wenn es nur die eine Klasse Methode, um zu definieren, Verwenden
def self.xxx
. Da für die Definition nur eine Methode, die zunehmend Einzug wahrscheinlich zu überladen.Wenn es sind mehr als einer Klasse in der Methode zu definieren, Verwenden
class << self
. Weil das schreibendef self.xxx
def self.yyy
unddef self.zzz
ist sicherlich die Wiederholung. Erstellen Sie einen Abschnitt für diese Methoden.Wenn alle Methoden in einer Klasse werden-Klasse Methode, können Sie
module
mitmodule_function
stattclass
. Diese ermöglichen die Definition von Modul-Funktionen nur verwendendef xxx
.InformationsquelleAutor der Antwort nonowarn
Bisher die Frage und die Antworten nur diskutieren, diese zwei Optionen:
Aber hier ist eine andere option zu prüfen, für die Klasse Methoden /singleton-Methoden /statische Methoden Methoden, die auf der class-Ebene (oder was auch immer Sie wollen, Sie zu nennen):
Ich bevorzugen diese option, weil es mehr offensichtlich, was es tut. Die Methodendefinition sieht genauso aus, wie es heißen würde, in Ihrem code, und es ist klar, es funktioniert auf Klassenebene.
Ich komme auch aus einem Python-hintergrund, wo
self
verwendet wird, zum Beispiel Methoden, in der Erwägung, dass in Rubyself
ist für Klassenmethoden. Diese oft verwirrt mich, so zu vermeiden, denken "ist ein self-Methode in Ruby, eine Klasse oder eine Instanz-Methode?" Ich benutzedef ClassName.methodname
.InformationsquelleAutor der Antwort Dennis