2016-05-29 9 views
2

nehmen wir an, dass wir Befehlsmuster in this wayRolle der Fragesteller Klasse in Command Muster

umgesetzt haben, bin ich ein wenig verwirrt über die Rolle der Fragesteller hier. Aus meiner Sicht:

  1. Wenn wir Geschichte (oder irgendeine Art von Aktion vor der Ausführung des Befehls) benötigen, dann ist es sinnvoll, diese Klasse zu machen. Aber dann bricht es Single-Verantwortung-Prinzip, ja? Jetzt ist es nicht nur ein Delegierter, es speichert auch Geschichte dort.
  2. Wenn wir keine Historie benötigen, sehe ich kein Ziel, diesen Invoker zu erstellen, der einfach delegiert. Ist der Grund nur dafür eine Annahme, dass wir eine Art Logik vor/nach der Befehlsausführung in der Zukunft benötigen würden?

Oder fehlt mir etwas?

Antwort

2

Wenn wir Geschichte (oder irgendeine Art von Aktion vor der Befehlsausführung) benötigen, dann ist es sinnvoll, diese Klasse zu erstellen. Aber dann bricht es Single-Verantwortung-Prinzip, ja?Jetzt ist es nicht nur ein Delegierter, es speichert auch Geschichte dort.

Ich stimme voll und ganz mit Andreas Antwort. Wenn Sie denken, dass Sie mehrere Verantwortlichkeiten ausführen, teilen Sie sie in verschiedene Methoden auf.

Prinzip der einfachen Verantwortung ist gut zu hören, aber wir sollten diesem Prinzip nicht zu viel Aufmerksamkeit schenken. Wenn Sie diesem Prinzip streng folgen, bin ich sicher, dass die Codebasis mit zu vielen kleinen Klassen überladen ist. Ich glaube nicht, dass eines der großen Projekte in der Softwareindustrie dieses Prinzip nutzt. Das Beste, was wir tun können, haben verschiedene Methoden in derselben Klasse für verschiedene Aktionen.

Wenn wir keine Historie benötigen, sehe ich kein Ziel, diesen Invoker zu erstellen, der einfach delegiert. Ist der einzige Grund dafür nur eine Annahme, dass wir in der Zukunft eine Art Logik vor/nach der Befehlsausführung benötigen würden?

Der Kern USP von Befehl Muster ist Invoker. Es entkoppelt Client (Sender) und Empfänger.

Von oodesign Artikel:

Der Kunde fragt nach einem Befehl ausgeführt werden. Der Invoker nimmt den Befehl, kapselt ihn und platziert ihn in einer Warteschlange, falls es zuerst etwas anderes zu tun gibt, und der ConcreteCommand, der für den angeforderten Befehl verantwortlich ist, sendet sein Ergebnis an den Empfänger.

Ich habe die Rolle des Invoker in unten SE Frage erklärt:

Command Pattern seems needlessly complex (what am I failing to understand?)

+0

danke, coole Antwort. –

1

Haben Sie den Wikipedia-Artikel gelesen, auf den Sie verwiesen haben?

ein Aufrufer-Objekt verwenden, kann Buchhaltung über Befehlsausführungen bequem durchgeführt werden, sowie verschiedene Modi für die Befehle der Umsetzung, die von dem Aufrufer-Objekt verwaltet werden, ohne dass der Kunde Kenntnis von der Existenz zu sein, Buchhaltung oder Modi.

Die Verantwortung/Zweck ist nicht Delegation, aber Buchhaltung, so gibt es keinen Bruch von Einzel Verantwortung Prinzip.

Man könnte argumentieren, dass, wenn die Fragesteller sowohl tun Buchhaltung und Modus-Management, es zwei Aufgaben hat, aber Sie können innerhalb der Aufrufer trennen, dass, wenn nötig.

Denken Sie daran, das Befehlsmuster kümmert sich nicht um die alleinige Verantwortung. Das ist ein anderes Muster, und es liegt an Ihnen, beides anzuwenden, wenn Sie das brauchen.

1

In diesem speziellen Entwurfsmuster führt Invokeroptional Buchhaltung über die Befehlsausführung.

Also würde ich mir nicht zu viele Gedanken darüber machen, ob das Führen der Geschichte notwendig ist, oder ob dies das Prinzip der einheitlichen Verantwortung verletzt (wenn die "Buchhaltung" kompliziert würde, könnte der Aufrufer die Buchhaltung immer an eine andere Klasse delegieren).

Also warum existiert die Invoker überhaupt?

Es gibt Ihnen im Grunde einen einzigen Punkt für die Registrierung Ihrer Command Aktionen, die so wenig wie möglich über die eigentliche Problemdomäne wissen - nur wie execute() auf einem Command aufrufen.

Vorteile auf diese Weise gehören ein leicht verständliches Design-Muster und eine reduzierte Kopplung (die Invoker muss nichts über die Light wissen).

0

von http://www.oodesign.com/command-pattern.html:

Das Beispiel der Mahlzeit, um in einem Restaurant ist ein sehr gut, wenn versucht, besser zu erklären, wie das Muster funktioniert: Der Kellner (Invoker) nimmt die Orde r vom Kunden auf seinem Pad. Die Bestellung wird dann in die Warteschlange für den Auftrag Koch und gelangt zum Koch (Receiver), wo es verarbeitet wird.