In diesem Artikel werden die Hintergründe und Erfahrungen bei der Verwendung des Entwurfsmusters „Chain of Responsibility“ vorgestellt, sodass die Leser ihren Eindruck von diesem Entwurfsmuster vertiefen und sogar dazu inspiriert werden können, die Projekte, an denen sie derzeit beteiligt und für die sie verantwortlich sind, einem „Facelift“ zu unterziehen und dadurch die Qualität zu verbessern „Facelift“ des Systems. Teilen Sie jedes Detail Ihrer Arbeit.
1. Hintergrund
Es gibt ein solches Modul in dem System, für das ich verantwortlich bin, das Partitionsmodul. Wenn Sie dieses Wort direkt betrachten, werden viele Leute verwirrt sein oder es sogar missverstehen wird kurz beschreiben, was „Routing“ ist.
Ich glaube, jeder hat Erfahrung mit Online-Einkäufen und kann jederzeit und überall den Logistikverfolgungsstatus der Bestellung überprüfen. Das oben erwähnte „Routing“-Konzept bezieht sich auf den Transport der Bestellung von Punkt A zu Punkt B. Routing-Linie, zum Beispiel muss Auftrag order1 von A zum Ziel F transportiert werden. Die Route kann von A->B->D->F oder von A->D->F erfolgen genommen werden, hängt es davon ab, dass die im System konfigurierten Routen und die entsprechenden passenden Regeln herausgefiltert werden.
Lange Zeit waren die Routing-Konfiguration und die Regeln im System statisch (sogenannte statisch bedeutet, dass sie im Voraus konfiguriert wurden und nahezu festgelegt sind). Der Nachteil dieses Ansatzes liegt auf der Hand, das heißt, die Kosten können nicht berücksichtigt werden gesteuert werden, wie oben erwähnt, gibt es offensichtlich Möglichkeiten, den Transportweg zu verkürzen oder sogar direkt zu liefern (die Waren von A nach F können natürlich N LKWs füllen, müssen aber entsprechend der Route transportiert werden). (im System festgelegt), aber sie werden vom System blockiert. Aufgrund der festen Routingregeln können wir nur mehr Straßen befahren, was die Kosten für Arbeitskräfte und Transport erhöht.
Auf dieser Grundlage entdeckte ein Experte eine Geschäftsmöglichkeit zur Kostensenkung und Steigerung der Effizienz: die Aktivierung dieser Routing-Linie und -Regeln, damit das System flexibler mit den oben genannten Situationen kompatibel sein und die ultimative Ressourcenauslastung erreichen kann Wenn beispielsweise viele Bestellungen vorliegen, sind sie alle von A zum Ziel F bestimmt. Die statische Leitungskonfiguration im System lautet jedoch nur A->B->D->F. Nach der Systemüberwachung und -berechnung wurde jedoch festgestellt, dass die Die Menge der Waren von A nach F kann zwei LKWs füllen. Zu diesem Zeitpunkt wird vorübergehend eine neue Route für diese Bestellungen von A nach F erstellt. Gleichzeitig werden die Waren am Standort A empfangen und versendet Die Einbindung von Routing-Line-Matching ist mit diesem temporären Routing-Szenario kompatibel, sodass die Gesamtkosten gesenkt werden können, ohne die Benutzergewohnheiten zu ändern, und auch die Effizienz des Transports zum Zielort erheblich verbessert wurde.
Der von diesem Experten vorgeschlagene Plan war sehr gut und wurde von allen weithin anerkannt und gelobt. Nachdem das Projekt etabliert war, trat es in eine intensive Entwicklungsphase ein und ich hatte das Glück, mit der wichtigen Aufgabe betraut zu werden, die Entwicklung und Umsetzung zu leiten dieses Projekt.
Es ist erwähnenswert, dass die Änderungen an der Routing-Schaltung den gesamten tatsächlichen Betriebsprozess der Bestellung sowie einige zusätzliche Abfragen, statistische Berichte und andere Funktionen durchlaufen. Es gibt viele Szenarien, sodass der Druck immer noch besteht Ziemlich hoch, obwohl wir im Laufe der Zeit viele Umwege gemacht haben, aber das Endergebnis war gut. Auch später gab es mehrere ähnliche Notwendigkeiten, die Routing-Linien zu ändern. Aber basierend auf dieser Transformation können wir damit problemlos umgehen . Dies wird später im Artikel besprochen.
Nachdem ich so viel gesagt habe, denken Sie, dass das alles Unsinn ist? Haha, es ist tatsächlich etwas langatmig. Schauen wir uns als nächstes den gesamten Transformationsprozess an, der fragmentiert ist, aber ein Erfolgserlebnis hat .
2. Ideen und Methoden
Die in den folgenden Artikeln erwähnte Partitionierung ist die Bedeutung übereinstimmender Regeln für das Routing
Schauen wir uns zunächst ein einfaches schematisches Diagramm des praktischen Betriebsablaufs an.

Partitionsanpassungsregeln sind am tatsächlichen Betriebsprozess jedes Standorts beteiligt. Gleichzeitig sind Routing-Übereinstimmungsregeln auch an der Abfragefunktion oder Berichtsfunktion einiger Hilfsoperationen beteiligt. Sobald die Partitionsanpassungsregeln geändert werden müssen, Dann werden Sie mit den folgenden Schmerzpunkten konfrontiert sein
Aufgrund der oben genannten Schwachstellen habe ich beschlossen, dieses Modul neu zu strukturieren und zu korrigieren. Erstens werde ich mich durch diese Herausforderung verbessern, und zweitens werde ich auch den Weg für die Möglichkeit ebnen, diese Regel in Zukunft erneut zu ändern Was soll ich konkret tun? Wie kann ich die oben genannten Probleme lösen? Das habe ich getan
Einige Leute fragen sich vielleicht, ob dies ein weiteres Problem mit sich bringt: Obwohl die Szenen nicht übersehen werden, werden alle Szenen wirksam, sobald eine Codeänderung erreicht ist. Werden jedoch die ursprünglichen Szenen einiger Szenen geändert? Ich denke, dass die Studenten hier in der Tat sehr vorsichtig sind und dieses neue Problem tatsächlich auftreten wird. Daher muss die einheitliche Schließung die Erweiterung und Reserve-Hooks unterstützen, um die differenzierte Verarbeitung jeder Szene zu unterstützen. Dies ist beispielsweise eher abstrakt: Die allgemeine Szenarioregel lautet beispielsweise, dass alle Bestellungen gemäß den Zonenregeln der festgelegten Konfiguration des Systems transportiert werden, aber jetzt haben einige Händler einige Dienste geöffnet, um diese dann schnell an den Bestimmungsort zu liefern Händlerbestellungen Es ist nicht mehr möglich, die bestehenden allgemeinen Regeln für den Partitionsabgleich und den Transport zu verwenden. Um den Zweck eines schnellen Transports zu erreichen, ist ein Partitionsabgleich gemäß den neuen Regeln erforderlich. Das ist der Unterschied im Inneren.
Was genau ist also das Chain-of-Responsibility-Modell?
Die Definition von Daniel: mehreren Objekten die Möglichkeit geben, Anfragen zu verarbeiten und so die Kopplungsbeziehung zwischen Sender und Empfänger der Anfrage zu vermeiden. Diese Objekte werden zu einer Kette verbunden und die Anforderung wird entlang der Kette weitergeleitet, bis sie von einem Objekt verarbeitet wird.
Lassen Sie uns darüber sprechen, wie ich es basierend auf dem tatsächlichen Geschäft des vorhandenen Systems anwende: Ich habe bereits im Hintergrund des Eröffnungskapitels vorgestellt, dass es sich bei den vorhandenen Partitionsanpassungsregeln um statische Partitionsanpassungen handelt (z. B. ein bestimmtes Geschäft Punkt-zu-Punkt, ein bestimmtes). (Geschäftspunkt auf einen Bereichsbereich) Warten Sie, ich werde nicht auf die spezifischen Geschäftsdetails eingehen. Ich weiß nur, dass es hier viele übereinstimmende Regeln gibt.) Jetzt müssen wir eine neue Regel hinzufügen, um die Dynamik zu unterstützen (es ist auch eine Variante). Hier definiere ich jede Partitionsregel als Partitionstyp und jeden Partitionstyp als Partitionsknoten, sodass jede Anforderung eine passende Zeile finden kann diese Transportkette.
Da die Geschäftsdetails relativ vertraulich sind, werden sie im Artikel nicht im Detail offengelegt, was keinen Einfluss auf das Verständnis der Anwendung wichtiger Entwurfsmuster hat.
Wenn man die Definition und die obige Analyse kombiniert, ist die tatsächliche Situation für die Verwendung des Entwurfsmusters der Verantwortungskette geeignet? Ich glaube, dass es anwendbar ist, solange die oben genannten Probleme gelöst werden können und die Gesamtvorteile die Nachteile überwiegen. Erstens sind die Vorteile der Verwendung dieses Modells zur Transformation folgende:
Natürlich weist dieses Modell auch gewisse Mängel auf: Wenn die Verantwortungskette relativ lang ist, kann es zu Leistungsproblemen kommen, da jede Anfrage die gesamte Kette durchläuft. Gleichzeitig kann das Debuggen für Schüler, die es nicht verstehen, komplizierter sein das Geschäft.
Insgesamt besteht der Vorteil darin, dass es unsere aktuellen Schwachstellen löst und eine spätere Erweiterung erleichtert, während der Leistungsteil der Nachteile durch die Kombination der im Vorlagenmodus reservierten Hook-Funktionen übersprungen werden kann (wenn die aktuelle Anforderung nicht für den aktuellen Partitionsknoten geeignet ist). Regeln), um die Auswirkungen von Leistungsproblemen zu minimieren, und gleichzeitig ist es auch notwendig, dass Entwickler das Geschäft verstehen. Insgesamt scheinen also die Vorteile die Nachteile zu überwiegen.
Lassen Sie uns zunächst einen Blick auf ein einfaches Vergleichsdiagramm des Partitionsmoduls vor und nach der Transformation werfen.

Obwohl das Diagramm sehr einfach ist, ist die Bedeutung des Vergleichs immer noch offensichtlich. Vor der Transformation sind Partitionsanpassung und Geschäftsverarbeitung miteinander verbunden: Partitionsanpassung ist eine Kette und es gibt keine Geschäftslogikverarbeitung Von der Kopplung befreite Erweiterungen werden ebenfalls unterstützt. Einige Leute sind möglicherweise verwirrt, nachdem sie dies gesehen haben: Hat das Obige nicht gesagt, dass nur eine dynamische Übereinstimmungsregel hinzugefügt wurde? Warum gibt es so viele Knoten in der Kette und es gibt immer noch zwei Ketten? Lassen Sie mich hier ein wenig erklären: Die aktuellen beiden Ketten haben viele Änderungen an der Nachfrageversion erfahren. Derzeit scheint der Unterschied nicht groß zu sein, hauptsächlich weil die von ihnen bereitgestellten Quellgeschäftsszenarien unterschiedlich sind Die an vielen Stellen in diesem Artikel eingeführten Knoten beeinträchtigen ihre jeweiligen Vorgänge und wurden später hinzugefügt. Sie sind immer noch die Knotenregeln, die bisher im System verwendet wurden (das habe ich am Anfang des Artikels erwähnt: Was wäre, wenn dort). Regeländerungen folgen später. So schlau ich auch bin, die „Prophezeiung“ hat sich tatsächlich erfüllt, ich werde Ihnen hier sagen, wie wichtig es ist, die Erweiterung zu unterstützen, um die Bauzeit zu verkürzen.
3. Praktischer Prozess
Ich glaube, dass viele Leser feststellen werden, dass oben von einem einheitlichen Schließen und Kombinieren mit dem Vorlagenmodus die Rede ist, um Leistungseinbußen weitestgehend zu vermeiden, sodass Ihre Verantwortungskette nicht durch einen Entwurfsmodus unterstützt werden kann.
Ja, Sie haben Recht, Smart. Es ist wahr, dass die Verwendung eines einzelnen Chain-of-Responsibility-Designmusters bei weitem nicht den oben genannten Effekt erzielt. Hier kombinieren wir die Fabrik-, Vorlagen- und Chain-of-Responsibility-Muster Die Vorlage wird verwendet, um allgemeine Methoden, Aufrufe zwischen Methoden und Schalter, Vor- und Nachverarbeitung, Differenzierung und andere Methoden festzulegen, die für die Implementierung verschiedener Knoten reserviert sind sind ein paar einfache Beispiele. Der Knoten zeigt das Klassendiagramm wie folgt an

Dieser Abschnitt ist relativ einfach. Das obige Klassendiagramm ist fast eine praktische Anwendung im Code. In tatsächlichen Aufrufen wird die Bean-Kette spezifisch abgerufen Partitionsanpassung.
4. Gedanken zum Praxisablauf und Wirkungsbewertung
Die Ergebnisse nach der Transformation spiegeln sich hauptsächlich in der anschließenden Erweiterung und Wartung wider. Sobald die Partitionsanpassungsregeln geändert werden, treten zwei Probleme auf Wenn Sie diesen Block zum ersten Mal verwenden, wenn die Anforderungen für neue Routing-Regeln geändert werden, beträgt die gesamte tatsächliche Bauzeit auf der F&E-Seite 45 Tage, ganz zu schweigen davon, dass die Testzeit nicht garantiert werden kann, sobald ein Fehler auftritt (entsprechend den dynamischen Knoten). in den Knoten in der Abbildung oben)

Doch nicht lange danach kamen erneut neue Anforderungen an die Matching-Regeln hinzu (entsprechend dem Fahrgemeinschaftsknoten im obigen Knoten). Bei ähnlichen Anforderungen wurde die Bauzeit um fast die Hälfte verkürzt und die optimale Zeitspanne von 45 Tagen auf 27 Tage verkürzt Die Anforderungen umfassen auch die Transformation anderer nicht-partitionierter Module. Natürlich hatte die Transformation der ersten Version einige perfekte Aspekte. Nach dieser Zeit wurde sie entsprechend den Anforderungen optimiert

Die nächsten beiden verkörpern wirklich das, was als „Verschwinden der Bauzeit“ bezeichnet wird. Eines ist die erste Vorschrift zur Zoneneinteilung, und die andere ist die direkte Zoneneinteilungsregel in den jüngsten B-Netzwerkintegrationsanforderungen.
Ehrlich gesagt habe ich keinen so großen Effekt erwartet, als ich jetzt nicht auf die Daten zurückblickte. Wer hätte gedacht, dass die Anwendung eines Entwurfsmusters die Bauzeit verkürzen kann? 45 Tage für 1 Gott, das ist unglaublich.
Natürlich gibt es auch einige Bereiche, die verbessert und aktualisiert werden können. Derzeit wird die Zusammenstellung von Verantwortungskettenknoten manuell angegeben und kann in eine automatische Zusammenstellung geändert werden (ich habe sie bereits in der Transformation eines anderen Geschäftsszenarios implementiert). Hier wird auch eine synchrone Transformation durchgeführt. Eine andere Möglichkeit besteht darin, die Anzahl der Knoten zu steuern. Wenn die Anzahl zu groß ist, müssen Sie möglicherweise eine Kompatibilitätslösung in Betracht ziehen.
Wie das Sprichwort sagt: Es dauert keinen Tag, einen Wassertropfen zu durchdringen, und es dauert keinen Tag, um einen Meter Eis einzufrieren. Es ist sicherlich machbar, leistungsstarke Werkzeuge und neuartige Technologien zu verwenden, aber nicht. Vergessen Sie nicht die kleinen Veränderungen in der täglichen Arbeit. In kurzer Zeit werden Sie vielleicht nichts sehen, aber sobald quantitative Veränderungen zu qualitativen Veränderungen führen, werden die Ergebnisse meiner Meinung nach sehr beeindruckend sein.