2009-05-16 2 views
4

Wenn Ihr Kollege eine Klasse in Ruby "öffnet" ("monkeypatches") und einige wichtige Funktionen definiert, die Sie verwenden müssen, wie greifen Sie auf diese ursprüngliche vormontierte Funktionalität zu, ohne ein System zu unterbrechen, das bereits Abhängigkeiten zu ihm hat Monkeypatched Definitionen?Wie können Sie in Ruby einen sicheren, abwärtskompatiblen "Reverse-Monkeypatch" machen?

+1

Könnten Sie ein wenig mehr Kontext zur Verfügung stellen, welche Art von Monkeypatch das war? (Neudefinieren einer einzelnen Methode? mehrere? noch etwas?) –

+1

Zum Beispiel, dass er die + -Methode in Ruby eingebaute Numerische Klasse neu definiert Subtraktion anstelle von Addition zu tun und jetzt muss ich hinzufügen, in der App - wie Greife ich auf die ursprüngliche Funktionalität der + -Methode der Numeric-Klasse zu? –

+1

Es könnte sich lohnen, zu fragen, ob Affepatching eine gute Lösung ist, wenn Sie auch diese Art von Problem haben - vielleicht wäre eine explizite Klasse oder ein expliziteres Modul ein besserer Ansatz. – paulthenerd

Antwort

5

Angesichts des Beispiels der Methode überschreiben, wenn Sie einige Code laden können, bevor sein Affe-Patch geladen wird, können Sie die Methode alias.

class Fixnum 
    alias_method :original_plus, :+ 
end 

class Fixnum 
    def +(x) 
    self - x 
    end 
end 

>> 5 + 3 
=> 2 
>> 5.original_plus(3) 
=> 8 
+1

Sie könnten Ihren Code in die gleiche Datei direkt vor dem Monkeypatch Ihres Kollegen setzen , wenn Sie Zugriff auf den Quellcode haben. Andernfalls hängt die Antwort davon ab, wie Ihr Programm geladen wird. –

+0

Das ist so nah an einer Lösung, wie ich mir vorstellen kann, aber ich bin mir nicht sicher, wie ich die Reihenfolge beeinflussen könnte, in der Code geladen wird. Wie könnte ich darauf bestehen, dass Aliase vor seinen Affe-Patches geladen werden - einfach indem Sie tun, was Sie hier getan haben? Nämlich, Definitionen an vorhergehende Punkte im Quellcode einzufügen - ist das wirklich alles was man braucht? –

+0

Angenommen, Sie haben auch Zugriff auf seinen Teil der Codebasis, stecken Sie den Alias ​​einfach wörtlich über seinen MonkeyPatch. – Chuck

0

Hängt genau das, was Funktionalität geändert wurde und in welcher Art und Weise, aber so etwas wie BlankSlate Klasse Jim Wienrich Implementierung helfen kann:

3

Ich sehe dies kürzlich in der rubyflow feed - es ist eine einfache Bibliothek, die Sie Konstanten Namespace oberster Ebene kann genannt aikidoka. Ohne irgendwelche Details darüber, wie/was Affen gepatcht wird, ist es ein bisschen schwer zu helfen. Theoretisch könnten Sie jedoch einen ähnlichen Ansatz verwenden, um die Affe-gepatchte Version der Klasse zu benennen, so dass Sie unabhängig voneinander sowohl auf das Original als auch auf das Original zugreifen können.

+0

Das erfordert nicht, dass Sie Ihre Codebasis umstrukturieren, um den neuen Namen zu verwenden - Twitter :: Mash statt Mash? –

+0

Sie werden fast sicher auf eine der Versionen unter einem anderen Namen verweisen müssen, auch in dem Fall alias_method oben beantwortet, da Sie die gleiche Funktionalität auf 2 verschiedene Arten definieren – paulthenerd

Verwandte Themen