Frage

Ich begann vor kurzem mit Python Dekorateure (und Funktionen höherer Ordnung) zu experimentieren, weil es sah aus wie sie könnten meine Django Unit-Tests prägnanter machen. beispielsweise anstelle des Schreibens:

def visit1():
    login()
    do_stuff()
    logout()

Ich könnte stattdessen tun

@handle_login
def visit1():
    do_stuff()

Doch nach einigem Experimentieren, ich habe festgestellt, dass Dekorateure ist nicht so einfach, wie ich gehofft hatte. Zuerst wurde ich durch die verschiedenen Dekorateur-Syntax verwirrt ich in verschiedenen Beispielen gefunden, bis ich gelernt, dass Dekorateure sehr unterschiedlich verhalten, wenn sie a href <= "http://www.artima.com/weblogs/viewpost.jsp?thread=240845 "rel =" nofollow noreferrer "> nehmen Argumente . Dann habe ich versucht, ein Verfahren dekorieren, und schließlich gelernt, dass es nicht funktioniert, weil ich zum ersten Mal haben

War es hilfreich?

Lösung

Dekorateure ist in Ordnung in der richtigen Position und auf jeden Fall vermieden wird, nicht zu - wenn angemessen ;-). Ich sehe Ihre Frage dahin im Wesentlichen "OK so, wenn sind sie angemessen"?

Hinzufügen einiger Präfix und / oder Postfix-Code um einige, aber nicht alle Methoden einiger Klassen ist ein gutes Beispiel. Gäbe es alle Methoden, ein Klasse Dekorateur alle Methoden zu wickeln wäre besser als @thisonetoo Wiederholung endlos ;-). Wenn es in einem blauen Mond einmal ist, dann ist es nicht wert, Refactoring, um Wrapper (Dekorateure oder auf andere Weise). In der Mitte gibt es einen großen Boden, wo Dekorateure in der Tat durchaus geeignet sind.

Es läuft darauf hinaus, eine der goldenen Regeln der Programmierung nach unten - DRY, Do not Repeat Yourself. Wenn Sie Ihren Code immer wiederholend zu sehen, sollten Sie die Wiederholung Refactoring aus - und Dekorateure sind ein ausgezeichnetes Werkzeug für das, obwohl sie weit von der nur eine (Hilfs Methoden und Funktionen, kundenspezifische metaclasses, Generatoren und anderen Iteratoren sind, Kontext-Manager ... viele von Funktionen, die wir zu Python in den letzten Jahren hinzugefügt wurden, kann am besten als DRY-Helfer gedacht werden, einfacher und glatter Weise dieses oder jene häufige Form der Wiederholung ausklammern!).

Wenn es keine Wiederholung gibt es keinen wirklichen Aufruf für Refactoring, also (insbesondere) keine wirkliche Notwendigkeit für Dekorateure - in solchen Fällen YAGNI (Y'Ain't gehend, es braucht) kann Trumpf DRY; -).

Andere Tipps

Alex beantwortete Ihre Frage schon ziemlich gut, was würde ich hinzufügen, Dekorateure ist, machen Sie Ihren Code viel leichter zu verstehen. (Manchmal, auch wenn Sie es nur einmal tun).

Zum Beispiel zunächst schreibe ich meine Django Ansichten, ohne überhaupt über Genehmigung zu denken. Und wenn ich sie getan schreibe, kann ich sehen, welche autorisierte Benutzer benötigen und nur für sie setzen @login_required.

So jemand nach mir kommt auf einen Blick sehen, welche Ansichten Auth geschützt sind.

Und natürlich sind sie viel mehr trocken und setzt diese überall.

wenn nicht request.user.is_authenticated ():     Rückkehr HttpResponseREdiect (..)

Dekorateure sind eine Möglichkeit, eine gemeinsame Aspect aus Ihrem Code zu hissen.

Aspect-Oriented Programming Befürworter wird Ihnen sagen, dass es so viele Gemeinsamkeiten dass AOP ist wichtig und zentral gelegen. Tatsächlich kann man eine dumme Debatte zu diesem Thema lesen Sie hier:

Aspect Oriented Programming vs. Objektorientierte Programmierung

Es gibt einige allgemeine Anwendungsfälle für AOP. Sie können ein paar hier lesen:

Haben Sie AOP verwenden (Aspect Oriented Programming) in Produktionssoftware?

Es gibt ein paar Querschnittsthemen, für die Dekorateure nützlich sind.

  • Zugriffssteuerung ( "Sicherheit") Authentifizierung, Autorisierung, Berechtigungen, Eigentümer

  • Logging (einschließlich Testhilfen und Revision)

  • Caching (oft eine Implementierung von memoization )

  • Einige Fehlerbehandlung könnte ein gemeinsamer Aspekt sein und daher geeignet für Dekorateur Umsetzung.

Es gibt sehr wenige andere Design-Muster, die wirklich Querschnitts sind und verdienen eine AOP Dekorateur.

Wenn Sie den gleichen Code am Anfang und am Ende viele Funktionen haben, denke ich, dass die zusätzliche Komplexität der Verwendung eines Dekorateur rechtfertigen würde.

Rather eine schöne (aber vielleicht Komplex) Vorlage für eine Website mit vielen Seiten wie verwenden, es spart Zeit wirklich und fügt Klarheit am Ende.

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