Frage

geerbt ich diesen gigantischen Vermächtnis Java-Web-App mit Struts 1.2.4. Ich habe eine konkrete Frage zu Aktionen. Die meisten Seiten haben genau eine Aktion, und die processExecute () Methoden sind schreckliche Monster (sehr lange und Tonnen von verschachtelten Anweisungen, wenn basierend auf Anfrage Parameter).

Da die Aktionen eine Implementierung des Befehlsmusters sind, denke ich, diese Aktionen in eine Aktion pro Benutzergeste zu teilen. Dies wird allerdings eine große Refactoring sein, und ich frage mich:

  1. Ist das die richtige Richtung?
  2. Gibt es einen Zwischenschritt ich nehmen könnte, ein Muster, das mit dem Durcheinander in den monolithischen Aktionen zu tun hat? Vielleicht ein anderer Befehl Muster innerhalb der Aktion?
War es hilfreich?

Lösung

Meine Art und Weise des Umgangs mit dieser sei:

  • nicht tun 'alles auf einmal'
  • , wenn Sie etwas ändern, lassen Sie es besser als Sie es gefunden
    • conditionals mit separater Aktion Implementierungen ersetzt, ist ein Schritt.
    • Noch besser wäre es: Machen Sie Ihre Implementierungen von den Action-Klassen trennen, so dass Sie es verwenden können, wenn Sie Frameworks ändern
    • Halten Sie die neue Befehls Implementierung absolut ohne Verweise auf Struts, verwenden Sie Ihre neue Aktionen als Wrapper um diese Implementierungen.
    • Sie müssen möglicherweise Schnittstellen zu Ihren Struts Action schaffen, um ihnen alle Daten zu übergeben um ohne sie zu kopieren. Auf der anderen Seite - Sie könnten um andere Objekte als Actionübergeben wollen, die in der Regel eine Reihe von Strings sind (siehe Ihre andere Frage über Struts 1.2 Action )
  • starten Teile auf neuere und bessere Technologie zu migrieren. 1.2 Struts war groß, als es herauskam, ist aber definitiv nicht das, was Sie in der Ewigkeit unterstützen wollen. Es gibt einige Generationen von besseren Rahmenbedingungen jetzt.

Es gibt definitiv mehr - Sorry, ich laufe hier aus der Zeit ...

Andere Tipps

Struts Aktionen, in meinem Kopf, sollte nicht sehr viel Code in ihnen überhaupt. Sie sollten in Wechselwirkung treten nur direkt mit der Anfrage und Antwort - nehmen einige Daten aus einem Formular oder einen Anfrageparameter, Hand, dass Informationen zum Preis Service Layer, und dann ein paar Sachen in einem Response-Objekt setzen oder vielleicht einige Daten in der Sitzung des Benutzers speichern.

würde ich empfehlen, weg zu bleiben von der Erbschaftssteuer zu tun mit Aktionsklassen. Es klingt wie eine gute Idee, auf den ersten, aber ich denke, früher oder später merkt man, dass Sie Schuh-Horning Dinge mehr sind als Sie tatsächlich die Code-Basis robust. Struts hat genügend Basis Aktionen wie es ist, wenn Sie neue sind Erstellen Sie wahrscheinlich Code in der Web-Schicht haben, die nicht da sein sollte.

Das ist nur meine persönliche Erfahrung.

Ich habe vor mit dieser Art der Sache befasst. Ein guter erster Schritt ist, eine andere Basisklasse in der Vererbungskette zwischen Aktion und einer der ursprünglichen monströsen Aktionsklassen einzufügen (nennen wir es KlasseA). Vor allem, wenn Sie keine Zeit haben, alles auf einmal zu tun. Dann können Sie herausziehen Stücke von Funktionalität in kleinere parallele Action-Klasse starten (ClassB, ClassC). Alles, was zwischen dem ursprünglichen KlasseA und den neuen Überarbeitete Klassen gemeinsam ist bis in die neue Basisklasse gezogen werden. So ist die Hierarchie sieht nun wie folgt aus:

Original Hierarchy:      New Hierarchy:

     Action                   Action
       |                        |
       |                      BaseA
  (old)ClassA                   |
                       +--------+----------+
                       |        |          |
                   ClassB (new)ClassA   ClassC
  1. Gehen Sie eine Methode zu einem Zeitpunkt
  2. Nehmen Sie einige Testfälle Sie später spielen können, zurück. Beispiel hier (stellen Sie sicher, wie viele Pfade durch den Code zu treffen, wie Sie können, dh alle Benutzer Gesten auf der Seite, die diese Aktion aufrufen)
  3. Refactoring der Methode seiner Komplexität zu reduzieren, indem kleinere Methoden zu schaffen, kleinere Dinge zu tun.
  4. Re-run-Tests, wie Sie tun, um diese

An diesem Punkt haben Sie Version der großen großen lästigen Methode Refactoring. Jetzt können Sie tatsächlich bestimmte Aktionen starten zu schaffen.

Sie können Ihre neu Refactoring Klasse als Basisklasse verwenden und implementieren jede spezifische Aktion als eine Unterklasse dieser Refactoring kleine Methoden verwenden.

Sobald Sie dies getan haben, sollten Sie ein gutes Bild von der zwischen den Klassen gemeinsamen Logik und Pull-up können oder Push-down diese Methoden nach Bedarf.

Es macht keinen Spaß, aber wenn man auf der Codebasis für eine Weile arbeiten wird, wird es Ihnen Zeit und Kopfschmerzen speichern.

Tough Problem, aber typisch für die frühe Web-App-Entwicklung.

Das Wichtigste zuerst müssen Sie sich Gedanken über die Business-Logik Verhalten darstellt, die logisch „Flow“ (das heißt, was der Benutzer sieht) darstellt, und welche Logik wird der Inhalt für das, was er sieht.

Sie haben, um die Strecke von Fabriken und Schnittstellen und alles, was nicht untergehen; rückwirkende Umsetzung ist weit weniger nützlich ... aber die Konsolidierung der Geschäftslogik und Datenabruflogik in den Delegierten von einer Art ... und verläßt die Streben Aktionen Seitenfluss basierend auf Erfolg / Misserfolg dieser Logik zu bestimmen.

Von dort Sie nur ein paar Wochen in Anspruch nehmen und es mahlt

Eine lange Methode ist nie gut, wenn es eine einzige Switch-Anweisung sein geschieht, wo die Fälle sehr kurz sind (Token-Parsing oder so ähnlich).

Sie könnten zumindest die lange Verfahren in kleinere Methoden mit beschreibenden Namen Refactoring.

Wenn möglich können Sie Ihre Methode beginnen mit zu erkennen, was es ist, es durch Untersuchung der Form tun soll, und dann, wenn / sonst den Weg zu den verschiedenen Optionen. obwohl keine verschachtelten ifs, neigen dazu, diejenigen zu Code unleserlich zu machen. Nur

enum Operation {
  ADD, DELETE;
}

...

Operation operation = determineOperation(form);
if (operation == Operation.DELETE) { 
  doDelete(form); 
} else if (operation == Operation.ADD) {
  doAdd(form);
}

Wenn Sie so weit gehen Sie Ihre Logik schön haben und sauber und man kann tun, was Refactoring Sie wollen.

Der schwierige Teil ist Ihre Logik klar zu bekommen, und Sie können das in den Schritten tun. Verwenden Sie kein Muster wählen, bis Sie genau verstehen, was dein Problem ist.

Wenn Sie planen, den Code Refactoring sollten Sie Tests für den vorhandenen Code stellen Sie sicher, zuerst zu schreiben, so dass Sie sicher sein, können Sie nicht die Funktionalität davon verändert haben, sobald Sie Refactoring starten.

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