Es ist vollständig sicher zu verwenden, vorausgesetzt, Sie verwenden es in erwarteter Weise und lassen sich nicht mitreißen. Nicht alles, was Sie tun können, ist es wert, immerhin.
Der Vorteil von method_missing
ist, dass Sie auf alle Arten von Dingen auf einzigartige Weise reagieren können.
Der Nachteil ist, dass Sie nicht für Ihre Fähigkeiten werben. Andere Objekte, die von respond_to?
etwas erwarten, erhalten keine Bestätigung und behandeln Ihr benutzerdefiniertes Objekt möglicherweise auf eine Weise, die Sie nicht beabsichtigen.
Für den Aufbau domänenspezifischer Sprachen und das Bereitstellen von sehr lockerem Klebstoff zwischen Komponenten ist diese Art von Dingen von unschätzbarem Wert.
Ein gutes Beispiel dafür, wo das passt, ist der Ruby OpenStruct Klasse.
Zusammenfassung: Wann verwenden? Wenn es dein Leben einfacher macht und nicht das Leben anderer erschwert.
Hier ist ein Beispiel, das mir in den Sinn kommt. Es ist von redis_failover .
%Vor%Hier prüfen wir, ob es sich bei der aufgerufenen Methode um einen Befehl der redis-Verbindung handelt. Wenn dies der Fall ist, delegieren wir sie an die zugrunde liegenden Verbindungen. Wenn nicht, Relais zu Super.
Ein weiteres bekanntes Beispiel für die Anwendung method_missing
ist ActiveRecord finders.
Natürlich gibt es keine Methode find_by_email_and_age
. Stattdessen bricht der method_missing
den Namen, analysiert die Teile und ruft find
mit geeigneten Parametern auf.
Hier ist ein Favorit von mir
%Vor%Damit kann ich auf Werte eines Hash zugreifen, als wären es Attribute. Dies ist besonders praktisch, wenn Sie mit JSON-Daten arbeiten.
Also zum Beispiel, anstatt tweets.collect{|each|each['text']}
schreiben zu müssen, kann ich einfach tweets.collect(&:text)
schreiben, was viel kürzer ist. Oder auch, anstatt tweets.first['author']
kann ich einfach tweets.first.author
schreiben, was sich viel natürlicher anfühlt. Tatsächlich gibt es Ihnen Javascript-artigen Zugriff auf Werte eines Hash.
NB, Ich erwarte jeden Augenblick, dass der Affe die Polizei an meiner Tür flickt ...
Bleib in erster Linie bei Sergio Tulentsevs Zusammenfassung.
Abgesehen davon denke ich, dass das Betrachten von Beispielen der beste Weg ist, ein Gefühl für richtige und falsche Situationen für method_missing
zu bekommen; Also hier ist ein weiteres einfaches Beispiel:
Ich habe vor kurzem method_missing
in einem Null-Objekt verwendet.
Das Null-Objekt war ein Ersatz für ein Auftragsmodell.
Der Auftrag speichert verschiedene Preise für verschiedene Währungen.
Ohne method_missing
sieht das so aus:
Mit method_missing
kann ich es verkürzen zu:
Mit dem zusätzlichen Vorteil, dass ich das NullOrder
nicht aktualisieren muss, wenn ich neue price_xxx
Attribute zu Order
hinzufüge.
Tags und Links ruby metaprogramming