Frage

Dies ist eher eine Allgemeine Frage, dann bestimmte Sprache, obwohl ich stieß auf dieses problem, während Sie mit ncurses-python-Modul.Ich musste display locale Zeichen und habe Sie erkannt, als Zeichen, so dass ich nur schnell monkey-Patch einige Funktionen / Methoden aus der curses-Modul.

Das war es, was ich fordere eine schnelle und hässliche Lösung, auch wenn es funktioniert.Und die änderungen waren relativ klein, so kann ich hoffe, ich habe nicht versaut alles.Mein plan war, nach einer Lösung zu suchen, sondern zu sehen, es funktioniert und funktioniert gut, wissen Sie, wie es ist, ich nach vorne ging, um die anderen Probleme, die ich hatte, zu beschäftigen, und ich bin sicher, wenn es gibt keine Fehler in das ich nicht immer machen es besser.

Die mehr Allgemeine Frage erschien mir aber - offensichtlich einige Sprachen erlauben es uns zum Affen-patch große Abschnitte von code in Klassen.Wenn dies ist der code, den ich nur für mich selbst, oder der Wechsel ist klein, es ist ok.Was ist, wenn einige andere Entwickler meinem code, obwohl er sieht, dass ich einige bekannte Modul, so kann er davon ausgehen funktioniert es wie es ist verwendet.Dann, diese Methode plötzlich verhält sich anders, dann sollte es.

So, sehr subjektiv ist, sollten wir nutzen monkey-patching, und wenn ja, Wann und wie?Wie sollten wir es zu dokumentieren?


edit:für @guerda:

Monkey-patching ist die Fähigkeit, dynamicly ändern Sie das Verhalten der einige Stück code an der Ausführung Zeit zu verändern, ohne den code selbst.

Ein kleines Beispiel in Python:

import os
def ld(name):
    print("The directory won't be listed here, it's a feature!")

os.listdir = ld

# now what happens if we call os.listdir("/home/")?
os.listdir("/home/")
War es hilfreich?

Lösung

Nicht!

Vor allem mit gratis-software, haben Sie alle Möglichkeiten gibt, um Ihre änderungen in das Haupt-distribution.Aber wenn Sie haben eine schwach dokumentiert hack in Ihrer lokalen Kopie, die Sie werden nie in der Lage zu Schiff die Produkt und ein Upgrade auf die nächste version von curses (Sicherheits-updates jemanden) sehr hohe Kosten.

Finden diese Antwort für einen Einblick in das, was möglich ist, auf fremden code-Basen.Die verlinkten screencast ist wirklich eine Uhr Wert.Plötzlich ein schmutziger hack verwandelt sich in einen wertvollen Beitrag.

Wenn Sie wirklich nicht bekommen kann die patch upstream-aus welchem Grund auch immer, wenigstens erstellen Sie einen lokalen (git) repo zu verfolgen upstream-änderungen in einem separaten Zweig.

Vor kurzem habe ich über einen Punkt, wo ich Sie zu akzeptieren monkey-patching als letztes Mittel: Puppet ist ein "run-everywhere" Stück von ruby-code.Da der agent hat zu laufen, auf - möglicherweise certified - Systeme, es nicht erfordern eine bestimmte ruby-version.Einige dieser Fehler haben, dass kann umgangen werden, indem monkey-patching wählen Sie Methoden, die in der Laufzeit.Diese patches sind bestimmte version, enthalten, und das Ziel ist eingefroren.Ich sehe keine andere alternative gibt.

Andere Tipps

Ich würde sagen, dies nicht tun.

Jeder Affe Patch sollte eine Ausnahme und markiert sein (zum Beispiel mit einem // HACK Kommentar) als solche, so dass sie leicht zu verfolgen zurück sind.

Wie wir alle wissen, ist es zu einfach, den hässlichen Code an ihrem Platz zu bleiben, weil es funktioniert, warum also auf sie mehr Zeit verbringen. So ist der hässliche Code für eine lange Zeit da sein wird.

Ich stimme mit David , dass Affen Patchen Produktion Code ist in der Regel keine gute Idee.

Aber ich glaube, für Sprachen, die es unterstützen, Affe Patchen ein sehr wertvolles Werkzeug für die Unit-Tests ist. Es ermöglicht Ihnen das Stück Code, den Sie selbst testen müssen zu isolieren, wenn es komplexe Abhängigkeiten hat -. Zum Beispiel mit Systemaufrufen, die nicht kann Dependency injiziert werden

Ich denke, die Frage kann nicht mit einer einzigen endgültigen Ja-Nein / gut-schlecht Antwort angesprochen werden. - die Unterschiede zwischen den Sprachen und ihren Implementierungen in Betracht gezogen werden

In Python, muss man überlegen, ob eine Klasse Affen gepatcht überhaupt sein kann (siehe diese SO Frage zur Diskussion), die etwas weniger-OO-Implementierung von Python bezieht. Also würde ich vorsichtig und geneigt sein, einige Mühe aufwenden, um Alternativen vor Affen Patching suchen.

In Ruby OTOH, die nach unten in den Interpreter werden gebaut, um OO können Klassen geändert werden, unabhängig davon, ob sie in C oder Ruby implementiert sind. Auch Object (so ziemlich die Basisklasse von allem) ist Änderungen offen. So Affe-Patchen wird eher mehr begeistert als eine Technik angenommen in dieser Gemeinschaft.

Ein Wort:. Oscommerce

Wenn Sie noch nie mit, dass gespielt haben, bevor sie mit

gespickt ist
// BOF: Fixed/added/removed bla bla bla
...
// EOF

Ganz zu schweigen davon, dass die gesamte Codebasis aufgrund der „die Funktionalität setzen wo immer Sie können“ degradiert Mentalität. Neuere Programmierkonzepte wie OO (Vererbung und Composite-Klassen in den Sinn kommen) sind so konzipiert, diese nicht-Fragen zu machen. Verwenden Sie sie!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top