2017-01-24 2 views
1

Ich arbeite derzeit an USB-Firmware für ein Projekt. Während ich herausgefunden habe, wie ich Service-Anfragen vom Host am besten behandeln kann, habe ich mich entschieden, ein Chain-of-Responsibility-Muster zu implementieren.Warum wäre die Kette der Verantwortung unangemessen, wenn es für jede Anfrage nur einen Handler gibt?

In meiner Anwendung wird immer genau ein Handler für jede Anfrage vom Host abgerufen werden. Also im Grunde habe ich meine Handler-Kette im Voraus eingerichtet und die Schleife beginnt mit dem Warten auf eine Anfrage vom Host. Die Anforderung wird an den "root" -Handler übergeben, der entscheidet, indem er einen Teil der Anfrage untersucht, ob er damit umgehen oder sie in der Kette weiterleiten soll. Sobald die Anfrage bearbeitet ist, kehren wir zum Warten auf eine weitere Anfrage vom Host zurück.

Wieder wird nur ein Handler eine Anfrage bearbeiten. Eine Anfrage, die nicht behandelt wird, d. H. Die gesamte Abwicklerkette durchläuft, ist eine Fehlerbedingung.

Nach dem www.sourcemaking.com auf der Zuständigkeitskette Muster zu lesen auf, fing dieses Zitat mein Auge (letzten Absatz in der Diskussion Abschnitt):

Sie, wenn nur von einer gehandhabt wird jede Anforderung nicht Zuständigkeitskette verwenden Handler oder, wenn das Client-Objekt weiß, welches Dienstobjekt die Anfrage behandeln soll.

Gibt es einen guten praktischen Grund, warum dies der Fall ist? Es scheint mir, dass die Verwendung von Chain of Responsibility in dem Fall, in dem der Autor warnt, absolut gültig ist. Könnte mir jemand einen Einblick geben, warum das eine schlechte Design-Wahl wäre?

Antwort

2

Ich denke, dass die Warnung, die Sie zitierten, schlecht formuliert war und etwas Verwirrung verursachen konnte. Ich denke, der Autor wollte sagen:

Verwenden Sie nicht die Chain of Responsibility, wenn alle Anfragen von nur einem Handler behandelt werden, oder wenn das Clientobjekt weiß, welches Serviceobjekt die Anfrage behandeln soll.

Ein anderer Weg, dies zu sagen ist, dass die Zuständigkeitskette Muster einig Komplexität führt und Sie sollten nur diese Komplexität verwenden, wenn Sie tatsächlich mehrere Handler haben, und wenn es nicht einfach ist für das Client-Objekt zu wissen, welche Handler benutzen. Wenn Sie nur einen Handler kennen, brauchen Sie weder eine Kette noch einen Zeiger, weil Sie genau wissen, an welches Objekt die Anfrage weitergeleitet werden soll. Wenn Sie einen multiplen Handler haben, aber es ist einfach, sich die Anfrage anzuschauen und zu sagen, welches Objekt mit einfachen "if" -Anweisungen umgehen wird, brauchen Sie keine Kette oder einen Zeiger.

Beiseite: Als jemand, der USB-Firmware auf verschiedenen Plattformen implementiert hat, glaube ich nicht, dass Sie etwas so förmlich als eine Kette der Verantwortung brauchen. Ich denke auch, dass du nicht einmal Zeiger brauchst. Sie können einfache if-Anweisungen und fest codierte Rückrufe vom USB-Stack zum Benutzercode verwenden, um jede eingehende Steuerungsübertragung an den entsprechenden Code zu leiten, der damit umgehen kann.

+0

Ah, ja das macht Sinn. @DavidGrayson, "Sie können einfache if-Anweisungen und fest codierte Rückrufe vom USB-Stack zum Benutzercode verwenden, um jede eingehende Steuerungsübertragung an den entsprechenden Code zu leiten, der damit umgehen kann." Können Sie näher erläutern, was Sie hier meinen? – amandion

+1

Sie können sich [diesen USB-Stack] ansehen (https://github.com/pololu/wixel-sdk/blob/master/libraries/src/usb/usb.c) und sehen, wie eine neue Steuerungsübertragung gestartet wird, Je nach den Werten in der Steuerelementübertragung ruft es entweder usbStandardDeviceRequestHandler oder usbCallbackSetupHandler auf. Die letztere Funktion muss in jeder Anwendung definiert werden, die den USB-Stack verwendet. –

+0

danke für den link! Ich habe ähnliche Beispiele vom Hersteller der Plattform, die wir verwenden, gesehen.Ich habe jedoch Anforderungen, die eine Laufzeitflexibilität für die Behandlung von Anfragen erfordern. Dies war einer der Gründe, warum ich mit AdR gegangen bin. Nochmals vielen Dank für Ihre Eingabe! – amandion

Verwandte Themen