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?
Antwort
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
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. –
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? –
Angenommen, Sie haben auch Zugriff auf seinen Teil der Codebasis, stecken Sie den Alias einfach wörtlich über seinen MonkeyPatch. – Chuck
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:
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.
Das erfordert nicht, dass Sie Ihre Codebasis umstrukturieren, um den neuen Namen zu verwenden - Twitter :: Mash statt Mash? –
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
- 1. Wie macht man einen sicheren Join-Pfadnamen in Ruby?
- 2. Können Sie einen inkrementierenden Compiler konstant machen?
- 3. Wie machen Sie Leistungstests in Ruby-Webapps?
- 4. Warum verwendet Ruby eine eigene Syntax für einen sicheren Navigationsoperator?
- 5. Wie können Sie einen WCF-Client asynchron machen?
- 6. In VB.NET können Sie einen willkürlichen Codeblock machen?
- 7. Wie können Sie Ruby Code stringisieren/serialisieren?
- 8. Wie können Sie ein sicheres statisches Singleton in Rust machen?
- 9. So erstellen Sie einen XSS-sicheren browserbasierten Code-Editor
- 10. Können Sie in Ruby Semikolons verwenden?
- 11. Wie schreibe ich einen richtigen null-sicheren Koaleszenzoperator in scala?
- 12. Wie können Sie die ID in der URL zufällig machen?
- 13. Ruby 'Groß machen!' Paradoxon
- 14. mit [] mit dem sicheren Navigation Operator in Ruby
- 15. Machen Sie einen Lauf weg in jQuery
- 16. Ruby - Machen Sie meinen Code objektorientiert
- 17. Lösungen für einen sicheren verteilten Cache
- 18. Wie programmiere ich einen sicheren Timer (In-App-Kauf)?
- 19. Wie bekomme ich einen Thread-sicheren Druck in Python 2.6?
- 20. Können wir einen Klassenkopierkonstruktor in C++ virtuell machen?
- 21. Ruby-Experten: Können Sie diese Ruby-Code-Zeile verbessern?
- 22. Können Sie eine Erweiterungsmethode statisch/freigegeben machen?
- 23. Wie Anlegesteg bekommen mit der sicheren-Flagge jsessionid-Cookies zu senden, wenn einen sicheren Kanal mit
- 24. Machen Sie einen Bereich in Postgres
- 25. Machen Sie einen unendlichen Schieberegler
- 26. Können Sie ein Objekt aufrufbar machen?
- 27. Android - Machen Sie einen Anruf
- 28. So machen Sie einen Komponententest in pyCharm
- 29. Können Sie Eigenschaften in JavaScript aufzählbar, aber nicht iterierbar machen?
- 30. Wie können Sie eine Swing/JFace/SWT GUI adressierbar machen?
Könnten Sie ein wenig mehr Kontext zur Verfügung stellen, welche Art von Monkeypatch das war? (Neudefinieren einer einzelnen Methode? mehrere? noch etwas?) –
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? –
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