Ich habe eine zweiteilige Frage
Beste Übung
- Ich habe einen Algorithmus, der eine Operation an einer Datenstruktur unter Verwendung der öffentlichen Schnittstelle ausführt
- Derzeit handelt es sich um ein Modul mit zahlreichen statischen Methoden, die bis auf die eine öffentliche Schnittstellenmethode alle privat sind.
- Es gibt eine Instanzvariable, die von allen Methoden gemeinsam genutzt werden muss.
Dies sind die Optionen, die ich sehen kann, welche sind die besten?:
- Modul mit statischen Methoden ('Modul' in Ruby)
- Klasse mit statischen Methoden
- Mixin- Modul zur Aufnahme in die Datenstruktur
- Refaktorieren Sie den Teil des Algorithmus, der diese Datenstruktur ändert (sehr klein), und machen Sie daraus ein Mixin, das die statischen Methoden des Algorithmusmoduls aufruft
Technischer Bereich
Gibt es eine Möglichkeit, eine private Modulmethode zu erstellen ?
module Thing
def self.pub; puts "Public method"; end
private
def self.priv; puts "Private method"; end
end
Das private
drin scheint keine Wirkung zu haben , ich kann trotzdem Thing.priv
ohne Probleme anrufen .
ruby
private-methods
access-specifier
Daniel Beardsley
quelle
quelle
private
Betrifft nur Instanzmethoden, keine Klassenmethoden. Verwenden Sieprivate_class_method
stattdessen:module Thing; def self.pub; end; private_class_method :pub; end
Antworten:
Ich denke, der beste Weg (und vor allem, wie vorhandene Bibliotheken geschrieben werden), dies zu tun, besteht darin, eine Klasse innerhalb des Moduls zu erstellen, die sich mit der gesamten Logik befasst, und das Modul bietet nur eine bequeme Methode, z
quelle
perform
ist nicht die Methode, die hier privat sein soll, die private Methode ist die private Methode in derTranslator
Klasse (@ ucrons Beispiel hat keine, was sehr unglücklich ist).GTranslate.translate
ist nur eine bequeme Methode fürGTranslate::Translator#perform
, es gibt keinen wirklichen Gewinn, der es verbirgt, wenn es überhaupt möglich wäre.self.translate
eine Klassen- / Modulmethode deklariert wird.GTranslate::Translator.new.perform(text)
- verschlungen, aber nicht privat!Es gibt auch
Module.private_class_method
, was wohl mehr Absicht ausdrückt.Für den Code in der Frage:
Ruby 2.1 oder neuer:
quelle
private
?quelle
include Writer
Option zu haben!Sie können die "eingeschlossene" Methode verwenden, um ausgefallene Dinge zu tun, wenn ein Modul eingemischt wird. Dies bewirkt, was Sie wollen, denke ich:
quelle
included do |base| [...] end
anstelle von defprivate
Gilt leider nur für Instanzmethoden. Der allgemeine Weg, um private "statische" Methoden in einer Klasse zu erhalten, besteht darin, Folgendes zu tun:Zugegeben, ich habe damit nicht in Modulen gespielt.
quelle
.foo
private Klassenmethode erstellt: "private; def self.foo ()"private
undprivate_class_method
sind im BesitzModule
nichtClass
. Dieser Code funktioniert übrigens und ist die Alternative zur Verwendungprivate_class_method
.Ein schöner Weg ist so
quelle
Was ist mit dem Speichern von Methoden als Lambdas in Klassenvariablen / Konstanten?
Zum Test:
UPD: Eine große Aktualisierung dieses Codes nach 6 Jahren zeigt eine sauberere Möglichkeit, eine private Methode zu deklarieren
d
Hier sehen wir das:
1)
@@L
kann nicht von außen aufgerufen werden, ist aber von fast überall zugänglich2)
class << self ; private ; def
macht die Methoded
von außen und von innen erfolgreich unzugänglich mit -self.
aber nicht ohne - das ist seltsam3)
private ; self.
undprivate ; class << self
macht Methoden nicht privat - sie sind beide zugänglich mit und ohneself.
quelle
Proc
, während Methoden vom Typ sindMethod
.Erstellen Sie ein privates Modul oder eine Klasse
Konstanten sind niemals privat. Es ist jedoch möglich, ein Modul oder eine Klasse zu erstellen, ohne sie einer Konstanten zuzuweisen.
Eine Alternative dazu
:private_class_method
besteht darin, ein privates Modul oder eine Klasse zu erstellen und öffentliche Methoden darauf zu definieren.Verwendung:
Siehe die Dokumente für Module.new und Class.new .
quelle
.self
in den Methodendefinitionen zu entfernen , sie in eine andere Klasse aufzunehmen und sie als Instanzmethoden der einschließenden Klasse zu verwenden. Wissen Sie, ob es eine Möglichkeit gibt, es zum Laufen zu bringen?Diese Methode erlaubt keine gemeinsame Nutzung von Daten mit den privaten Methoden, es sei denn, Sie übergeben die Daten explizit an Methodenparameter.
quelle