Frage

Ich bin langsam von PHP5 zu Python auf einige persönliche Projekte zu bewegen, und ich die Erfahrung noch zu lieben. Vor der Auswahl des Python Weg zu gehen wir bei Ruby sah. Was ich habe bemerkt, aus der Ruby-Community war, dass Affen-Patching sowohl gemeinsame als auch hoch angesehen war. Ich kam auch über ein Los Horrorgeschichten über die Versuche von Debug-ruby s / w, weil jemand eine relativ harmlose Bibliothek enthalten, aber eine wenig Arbeit zu tun, die ohne zu sagen jemand etwas stark frequentierten Kern Objekt gepatcht.

Ich wählte Python für (unter anderem) seine sauberere Syntax und die Tatsache, dass es alles tun konnte Rubin kann. Python macht OO klicken viel besser als PHP je hat, und ich bin mehr und mehr auf OO Prinzipien der Lektüre dieses besseres Verständnis zu verbessern.

An diesem Abend habe ich über Robert Martin SOLID Prinzipien:

  • S ingle Verantwortung Prinzip
  • O Stift / geschlossen Prinzip
  • L Iskov Substitutionsprinzip,
  • I nterface Segregation Prinzip, und
  • D ependency Inversionsprinzip

Ich bin zur Zeit bis zu O : Software-Einheiten (KLASSEN, Module, Funktionen usw.) sollten für EXTENSION offen, ABER ZU FÜR ÄNDERUNG .

Mein Kopf ist in einem Spin über den Konflikt zwischen in OO-Design und dem ganzen Affen Patchen, was die Kohärenz. Ich verstehe, dass seine möglichen Affen Patching in Python zu tun. Ich verstehe auch, dass „pythonic“ zu sein ist weit verbreitet, gut getestet, oop Best-Practices und Prinzipien zu folgen.

Was Ich mag würde wissen, ist die Stellungnahme der Gemeinschaft an den beiden gegenüberliegenden Themen; , wie sie zusammenarbeiten, wenn seine besten übereinander zu verwenden, ob der Affe-Patching an getan werden soll alle ... hoffentlich können Sie eine Lösung für die Sache für mich sorgen.

War es hilfreich?

Lösung

Es gibt einen Unterschied zwischen Affen-Patching (Überschreiben oder bereits bestehende Methoden zu ändern) und einfache Hinzufügen neuer Methoden. Ich denke, diese völlig in Ordnung ist, und die ehemalige sollte verdächtig angesehen werden, aber ich bin nach wie vor für sie zu halten.

Ich habe schon einige diese Probleme, wenn eine Dritte Erweiterung monkeypatches die Kernbibliotheken und bricht Dinge, und sie wirklich saugen. Leider haben sie alle ausnahmslos stammen aus der die Verlängerung Dritten scheinen Entwickler den Weg des geringsten Widerstandes nehmen, anstatt darüber nachzudenken, wie man tatsächlich ihre Lösungen richtig zu bauen.
Das nervt, aber es ist nicht mehr die Schuld des Affen Patchen, als es die Schuld der Messermacher, dass die Menschen sich manchmal schneiden.

Das einzige Mal, dass ich jemals legitimes Bedürfnis für Affen Patchen gesehen ist, um Fehler in Dritten oder Kernbibliotheken zu arbeiten um. Für diese allein, es ist von unschätzbarem Wert, und ich würde wirklich enttäuscht sein, wenn sie die Fähigkeit, es zu tun entfernt.

Timeline eines Fehlers in einem C # Programm hatten wir:

  1. Lesen Sie seltsame Fehlerberichte und Spuren Problem auf einen kleineren Fehler in einer CLR-Bibliothek.
  2. Investieren Tage mit einer Vermeidung des Problems fangen Ausnahmen in fremden Orten und viele Hacks denen kommen, die den Code viel Kompromisse
  3. Verbringen Sie Ihre Tage befreien Hacky Abhilfe, wenn Microsoft ein Service Pack Release

Timeline eines Fehlers in einem Schienen-Programm hatten wir:

  1. Lesen Sie seltsame Fehlerberichte und Spuren Problem auf einen kleineren Fehler in einer Rubin-Standardbibliothek
  2. Verbringen Sie 15 Minuten durchführen kleinere Affen-Patch-Fehler von Ruby-Bibliothek zu entfernen, und Platz Wache um ihn herum zu stolpern, wenn sie auf der falschen Version von Ruby laufen gelassen.
  3. Fahren Sie mit normaler Codierung.
  4. Einfach löschen monkeypatch später, als nächste Version von Rubin freigegeben wird.

Der Bugfixing Prozess ähnlich, außer mit monkeypatching aussieht, es ist eine 15-minütige Lösung und eine 5-Sekunden ‚Entnahme‘, während ohne sie, Schmerz und Leiden erfolgt.

PS: Das folgende Beispiel ist „technisch“ monkeypatching, aber ist es „moralisch“ monkeypatching? Ich bin kein Verhalten zu ändern - das ist mehr oder weniger tun AOP nur in Ruby ...

class SomeClass
  alias original_dostuff dostuff
  def dostuff
    # extra stuff, eg logging, opening a transaction, etc
    original_dostuff
  end
end

Andere Tipps

Aus meiner Sicht monkeypatching ist nützlich zu haben, sondern etwas, das missbraucht werden kann. Menschen neigen dazu, es zu entdecken und fühlen, wie es in jeder Situation verwendet werden soll, wo vielleicht ein mixin oder ein anderes Konstrukt kann besser geeignet sein.

Ich glaube nicht, es ist etwas, das Sie ächten sollte, es ist nur etwas, das die Ruby-Typen verwenden möchten. Sie können mit Python ähnliche Dinge zu tun, aber die Gemeinschaft hat die Haltung eingenommen, dass die Dinge einfacher und klar sein.

Monkey Patching ist rubin ausdrücklich nicht, es ist alles über Javascript auch getan, mit negativen (IMO) Auswirkungen.

Meine persönliche Meinung ist, Affe Patchen nur sollte getan werden

a) hinzufügen Funktionalität auf eine alte Version einer Sprache, die in der neuen Version der Sprache zur Verfügung, die Sie benötigen.

b) Wenn es kein anderer „logischer“ Platz für sie ist.

Es gibt viele viele einfache Möglichkeiten, Affen Patchen wirklich schrecklich, wie die Fähigkeit zu ändern, wie Grundfunktionen wie ADDITION Arbeit zu machen.

Meine Haltung ist, wenn Sie es vermeiden können, tun dies.

Wenn Sie es auf eine nette Art vermeiden können, ein dickes Lob an Sie.

Wenn Sie es nicht vermeiden können, die Meinung von 200 Menschen, weil Sie wahrscheinlich nur noch nicht darüber nachgedacht, es ist schwer genug.

Mein Haustier Hass ist Mootools Verlängerung der Funktion Objekt. Ja, Sie können dies tun. Statt Menschen nur lernen, wie Sie Javascript funktioniert:

setTimeout(function(){ 
    foo(args); 
}, 5000 ); 

Es wurde eine neue Methode für jedes Funktionsobjekt hinzugefügt, (ja, im nicht einen Scherz), so dass Funktionen jetzt ihre eigenen Funktionen haben.

foo.delay( 5000 , args );

, die die zusätzliche Wirkung dieser Art von Mist hatten gültig:

foo.delay.delay( 500,  [ 500, args ] ); 

Und wie die ad infinitum.

Das Ergebnis? Sie nicht mehr über eine Bibliothek und eine Sprache, Ihr Langauge in die Bibliothek beugt und wenn die Bibliothek in ihrem Umfang geschieht, zu sein, die Sie nicht mehr die Sprache haben, und Sie können nicht nur Dinge tun, die Art und Weise, dass sie fertig waren, wenn Sie das lernen Sprache und müssen stattdessen ein neue Untergruppe von Befehlen lernen einfach nicht haben es flach auf sein Gesicht fallen (auf Kosten der übermäßigen Verlangsamungen!)

kann ich beachten Sie, dass foo.delay auch ein Objekt zurück, mit seinen eigenen Methoden, so könnten Sie tun

x = foo.delay( 500, args ); 
x.clear(); 

und sogar

 x.clear.delay(10); 

, die übermäßig nützlich klingen mögen, ... aber Sie haben zu berücksichtigen, den massiven Kopf verwendet, um diese lebensfähig zu machen.

 clearTimeout(x); 

SO STARK!

(Disclaimer:.. Es ist schon eine Weile her, seit ich verwendet moo, und haben versucht, es zu vergessen, und Funktionsnamen / Struktur möglicherweise falsch Dies ist keine API-Referenz Bitte überprüfen Sie ihre Website für Details (sorry, ihre API-Referenz saugt!))

Mokeypatching ist in der Regel falsch. Erstellen Sie eine geeignete Unterklasse und die Methoden hinzufügen.

ich verwendet habe monkeypatching einmal im Produktionscode.

Das Problem ist, dass REST verwendet GET, POST, PUT und DELETE. Aber der Kunde Django Test bietet nur GET und POST. Ich habe Methoden für PUT (wie POST) monkeypatched und DELETE (wie GET).

Aufgrund der engen Bindung zwischen Django-Client und den Django-Testfahrern, schien es am einfachsten, es zu monkeypatch voll REST-Tests zu unterstützen.

Sie können erhellend finden diese Diskussion über Rubys offene Klassen und das Open-geschlossen-Prinzip.

Auch wenn ich Rubin mag, ich fühle mich Affe-Patchen ein Werkzeug der letzten Instanz ist, die Dinge zu erledigen. Ceteris paribus, ziehe ich es mit einer Prise der funktionalen Programmierung Güte traditionellen OO-Techniken.

In meinen Augen, Affe-Patching ist eine Form von AOP. Der Artikel Aspect-Oriented Design-Prinzipien: Lehren aus Objektorientiertes Design (PDF) gibt einige Ideen, wie solide und andere OOP Prinzipien können auf AOP angewendet werden.

Mein erster Gedanke ist, dass Affen-Patching OCP verletzt, da die Kunden einer Klasse sollten von dieser Klasse zu erwarten, der Lage sein, konsequent zu arbeiten.

Monkey-Patching ist einfach nur falsch , IMHO. Ich habe nicht über das offene / geschlossene Prinzip kommen Sie vor erwähnen, aber es ist ein Prinzip, das ich lange mich gehalten habe, gebe ich es zu 100%. Ich denke an Affen-Patching als Code-Geruch in einem größeren Maßstab, einen Codierung-Philosophie-Geruch, wie es war.

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