Wann verwenden Sie ein Modul, und wenn Sie zu einer Klasse
Ich bin momentan durch die Gregory Brown Ruby Best Practices Buch. Früh auf, er spricht über die Umgestaltung einige Funktionen von helper-Methoden, auf eine Verwandte Klasse, einige Methoden, Modul, dann hatte das Modul extend self
.
Hatte nicht gesehen, dass vor, nach einer schnellen google, fand heraus, dass extend self
auf einem Modul definierten Methoden, die auf dem Modul sehen, was Sinn macht.
Nun, meine Frage ist, Wann würde Sie so etwas tun
module StyleParser
extend self
def process(text)
...
end
def style_tag?(text)
...
end
end
und dann finden Sie es in tests mit
@parser = Prawn::Document::Text::StyleParser
als Gegensatz zu etwas wie diesem?
class StyleParser
def self.process(text)
...
end
def self.style_tag?(text)
...
end
end
ist es so, dass Sie können verwenden Sie es als ein mixin? oder gibt es andere Gründe, die ich nicht sehe?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer Klasse sollte verwendet werden, für die Funktionalität, die erfordert die Instanziierung bzw. zu verfolgen Zustand. Ein Modul kann entweder verwendet werden, als ein Weg, um mix-Funktionalität in mehrere Klassen, oder als ein Weg, um one-off-Funktionen, die nicht brauchen, um instanziiert zu werden oder zu verfolgen Zustand. Eine Klasse Methode könnte auch verwendet werden, für die letzteren.
In diesem Sinne, ich denke, die Unterscheidung liegt darin, ob oder nicht Sie wirklich brauchen, eine Klasse. Eine Klasse Methode scheint besser geeignet, wenn Sie eine vorhandene Klasse, die einige singleton-Funktionalität. Wenn das, was du machst besteht nur aus der singleton-Methoden, macht es mehr Sinn, Sie zu implementieren, wie Sie ein Modul aus und greifen Sie über das Modul direkt.
In diesem speziellen Fall würde ich wahrscheinlich Benutzer weder eine Klasse noch ein Modul.
Einer Klasse ist eine factory für die Objekte (man beachte den plural). Wenn Sie nicht wollen, erstellen Sie mehrere Instanzen der Klasse, es gibt keine Notwendigkeit für Sie zu existieren.
Module ein Modul ist ein container für Methoden, die gemeinsam von mehreren Objekten. Wenn Sie nicht mischen, in die das Modul in mehrere Objekte, es gibt keine Notwendigkeit für Sie zu existieren.
In diesem Fall, sieht es wie Sie wollen einfach nur ein Objekt. So verwenden Sie eine:
Alternativ:
Aber wie @Azeem schon schrieb: für eine richtige Entscheidung benötigen Sie mehr Kontext. Ich bin nicht vertraut genug mit den Interna von der Garnele zu wissen, warum Gregor aus, dass bestimmte Entscheidung.
Wenn es etwas, das Sie instanziieren möchten, verwenden Sie eine Klasse. Den rest deiner Frage braucht mehr Kontext Sinn zu machen.