Frage

Ich habe kürzlich mit einem kleinen Projekt zusammengearbeitet, an dem Struts 2 und Spring 3 beteiligt sind, und mein Kollege hatte einen sehr schlechten Code geschrieben:

Wir müssen zwei Module ähnlicher Funktionen implementieren: beide müssen das Java -Bean -Objekt hinzufügen/addieren/show/update/löschen/löschen. Diese beiden Java -Bean -Objekte verfügen über viele gemeinsam Benutzer, der einzige Unterschied ist, dass eine Bean 2 Felder zum Speichern von Offsets in created_time hat, und die andere muss start_time und end_time speichern.

Also beschloss mein Kollege, einen von ihnen in einer Struts -Aktionsklasse zu implementieren und den Code zu kopieren und einige kleine Änderungen vorzunehmen, dann hatte er eine andere Aktionsklasse an Ort und Stelle.

Ich kämpfe darum, seinen Fehler zu beheben, welches Designmuster oder welche Praxis kann mein Problem lösen?

HINZUFÜGEN:

Ich habe versucht, diese beiden Aktionsklassen zu ermöglichen, die gleiche Basisklasse zu erweitern, leider scheinen Struts 2 Setter/Getter von übergeordneten Klassen zu ignorieren, und Sie können auch nicht generische Typen verwenden, weil Struts 2 nicht weiß, zu welcher Klasse Instanziieren und geben Sie den Setter in Aktionsklassen an.

Ich möchte den wiederholten Code reduzieren, aber aufgrund dieser beiden oben genannten Probleme habe ich am Ende noch mehr wiederholter Code und viel zu komplizierte Klassenstruktur erstellt, die am Rande des Unterbrechens steht.

Fügen Sie 2 hinzu:

Ich habe den folgenden Code mit STUTS2-JSON-Plugin getestet (da es einfacher ist, Daten im JSON-Format zu beobachten):

Struts.xml:

<package name="inherit" namespace="/inherit" extends="json-default">
        <action name="base" method="doStuff" class="com.carllee.exp.BaseAction">
            <result type="json">
                <param name="excludeNullProperties">true</param>
            </result>
        </action>
        <action name="extended" method="doStuff" class="com.carllee.exp.ExtendedAction">
            <result type="json">
                <param name="excludeNullProperties">true</param>
            </result>
        </action>
</package>

Der Java -Code

package com.carllee.exp;

import com.carllee.exp.bean.Message;
import com.opensymphony.xwork2.ActionSupport;

public class BaseAction extends ActionSupport {

    private Message message; // and getter/setter
    private String text;     // and getter/setter

    public String doStuff() {
        return SUCCESS;
    }

}

Kinderklasse:

package com.carllee.exp;

public class ExtendedAction extends BaseAction {

}

Wenn ich diesen Test durchführe und zu gehe zu http: // localhost: 8080/struts2-exp/inherit/base? message.content = Hallo, Das Ergebnis wäre:

{"message" : {"content":"hello"}}

Wenn ich zu gehe zu http: // localhost: 8080/struts2-exp/inherit/extended? message.content = Hallo, Das Ergebnis wäre:

{}

Und es würde Warnungen in der Konsole geben

Aus diesem Grund sage ich, dass Struts 2 Setter/Getter in der Elternklasse ignoriert.

War es hilfreich?

Lösung

  • Unterklasse die Aktion und fügen Sie die anderen Eigenschaften hinzu?
  • Verwenden Sie dieselbe Aktion, aber unterschiedliche Ansichten?
  • Machen Sie eine Bohne mit allen drei Feldern, unterschiedlichen Ansichten, standardmäßig, wenn sie nicht verwendet werden?
  • Verwenden ModelDriven und entscheiden Sie, welches Modell sie basierend auf einer einzigen Aktion instanziieren sollen "method" Aufbau?
  • Etc...

Viele Optionen. Das "beste" hängt von Details ab, die wir nicht haben.

Wenn dies der Verlängerung des schlechten Code ist, mit dem Sie sich beschäftigen müssen, denken Sie für Glück-dies klingt trivial für den Refactor. Was ist der eigentliche Kampf?

Andere Tipps

Ich schlage vor, eine abstrakte Aktionsklasse mit dem gemeinsamen Teil und zwei Unterklassen (Aktionen, die aufgerufen werden) zu erstellen. Die abstrakte Klasse kann nicht direkt aufgerufen werden.

In Ihrer Anwendung können die Unterklassen den gesamten Code in der übergeordneten abstrakten Klasse verwenden.

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