Dies ist eine allgemeinere Frage, die sprachspezifisch ist, obwohl ich mit dem Python-Ncurses-Modul auf dieses Problem gestoßen bin. Ich musste Locale-Zeichen anzeigen lassen und sie als Zeichen erkannt haben, also habe ich einfach einige Funktionen / Methoden aus dem Curses-Modul gepatcht.
Das nenne ich eine schnelle und hässliche Lösung, auch wenn es funktioniert. Und die Veränderungen waren relativ klein, also kann ich hoffen, dass ich nichts vermasselt habe. Mein Plan war, eine andere Lösung zu finden, aber da es funktioniert und gut funktioniert, weißt du, wie es ist, ging ich auf andere Probleme zu, mit denen ich zu tun hatte, und ich bin mir sicher, wenn es keinen Fehler gibt, werde ich es nie tun mach es besser.
Die allgemeinere Frage erschien mir jedoch - offensichtlich erlauben uns einige Sprachen, große Teile des Codes in Klassen zu patchen. Wenn dies der Code ist, den ich nur für mich benutze, oder wenn die Änderung klein ist, ist es in Ordnung. Was ist, wenn ein anderer Entwickler meinen Code benutzt, sieht er, dass ich ein bekanntes Modul verwende, damit er davon ausgehen kann, dass es so funktioniert, wie er es gewohnt ist. Dann verhält sich diese Methode plötzlich anders als es sollte.
Also, sehr subjektiv, sollten wir Affepatch verwenden, und wenn ja, wann und wie? Wie sollen wir das dokumentieren?
edit: für @guerda:
Das Monkey-Patchen ist die Fähigkeit, das Verhalten eines Teils des Codes zur Ausführungszeit dynamisch zu ändern, ohne den Code selbst zu verändern.
Ein kleines Beispiel in Python:
%Vor%Gerade bei freier Software haben Sie alle Möglichkeiten, Ihre Änderungen in die Hauptdistribution zu bringen. Aber wenn Sie einen schwach dokumentierten Hack in Ihrer lokalen Kopie haben, werden Sie nie in der Lage sein, das Produkt zu versenden und ein Upgrade auf die nächste Version von curses (Sicherheitsupdates für jedermann) ist sehr teuer.
Siehe diese Antwort für einen Einblick in das, was auf ausländischen Codebasen möglich ist. Der verlinkte Screencast ist wirklich einen Besuch wert eine Uhr. Plötzlich wird ein schmutziger Hack zu einem wertvollen Beitrag.
Wenn Sie den Patch aus irgendeinem Grund nicht upstream erhalten können, erstellen Sie zumindest ein lokales (git) Repo, um Upstream zu verfolgen und Ihre Änderungen in einem separaten Zweig zu haben.
In letzter Zeit bin ich auf einen Punkt gestoßen, an dem ich als letzten Ausweg Affenflicken akzeptieren kann: Puppe ist ein "run-everywhere" Stück Ruby-Code. Da der Agent auf potenziell zertifizierten Systemen ausgeführt werden muss, kann eine bestimmte Ruby-Version nicht erforderlich sein. Einige davon haben Fehler, die man umgehen kann, indem man im Runtime bestimmte Methoden auswählt. Diese Patches sind versionsspezifisch, enthalten und das Ziel ist eingefroren. Ich sehe dort keine andere Alternative.
Ich würde sagen, nicht.
Jeder Affe-Patch sollte eine Ausnahme sein und als solcher markiert sein (zum Beispiel mit einem // HACK-Kommentar), so dass sie leicht zurückverfolgt werden können.
Wie wir alle wissen, ist es alles zu einfach, den hässlichen Code an seinem Platz zu belassen, weil er funktioniert, also warum sollte man mehr Zeit darauf verwenden? Der hässliche Code wird also noch lange da sein.
Ich stimme David in dieser Affenflicker-Produktion zu Code ist normalerweise keine gute Idee.
Ich glaube jedoch, dass das Patchen von Affen für Sprachen, die es unterstützen, ein sehr wertvolles Werkzeug für das Komponententesten ist. Es ermöglicht Ihnen, den Code zu isolieren, den Sie testen müssen, selbst wenn er komplexe Abhängigkeiten aufweist - beispielsweise bei Systemaufrufen, die nicht Abhängigkeitsinjektiert werden können.
Ich denke, dass die Frage nicht mit einer einzigen definitiven Ja-Nein / Gut-Schlecht-Antwort beantwortet werden kann - die Unterschiede zwischen den Sprachen und ihren Implementierungen müssen berücksichtigt werden.
In Python muss man überlegen, ob eine Klasse überhaupt affe-gepatcht werden kann (siehe SO-Frage zur Diskussion), die sich auf Pythons etwas weniger OO-Implementierung bezieht. Also wäre ich vorsichtig und geneigt, einige Anstrengungen zu unternehmen, um vor dem Affen-Patchen nach Alternativen zu suchen.
In Ruby, OTOH, das als OO in den Interpreter eingebaut wurde, können Klassen unabhängig davon modifiziert werden, ob sie in C oder Ruby implementiert sind. Even Object (so ziemlich die Basisklasse von allem) ist offen für Änderungen. Affenpatching wird also eher enthusiastisch als Technik in dieser Gemeinschaft angenommen.
Ein Wort: oscommerce.
Wenn du noch nie damit gespielt hast, bevor es mit
durchlöchert wurde %Vor%Ganz zu schweigen davon, dass die gesamte Codebasis aufgrund der "Putting the functionality wherever you" -Mentalität degradiert wurde. Neuere Programmierkonzepte wie OO (Vererbung und zusammengesetzte Klassen kommen in den Sinn) sollen diese Nicht-Probleme machen. Benutze sie!
Tags und Links language-agnostic design oop monkeypatching