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?
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
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. –
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