Wann 'method_missing' zu verwenden ist

7

Im folgenden Code ist die Methode roar nicht in der Klasse Lion definiert, kann aber trotzdem mit method_missing aufgerufen werden.

%Vor%

In welchen Situationen und wie soll ich dieses method_missing verwenden? Und ist es sicher zu benutzen?

    
tokhi 07.12.2012, 09:04
quelle

5 Antworten

9

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.

    
tadman 07.12.2012 09:11
quelle
8

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.

%Vor%

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.

    
Sergio Tulentsev 07.12.2012 09:07
quelle
4

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 ...

    
akuhn 07.12.2012 09:11
quelle
3

Ich habe auch einen Blogbeitrag von (Paolo Perrotta) gefunden, in dem gezeigt wurde, wann method_missing:

verwendet werden sollte %Vor%

Prüfen Sie, ob während der Mittagszeit ein Service angefordert wurde.

%Vor%     
tokhi 07.12.2012 09:32
quelle
3

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:

%Vor%

Mit method_missing kann ich es verkürzen zu:

%Vor%

Mit dem zusätzlichen Vorteil, dass ich das NullOrder nicht aktualisieren muss, wenn ich neue price_xxx Attribute zu Order hinzufüge.

    
doesterr 07.12.2012 15:47
quelle

Tags und Links