Mantenere il mio codice DRY in Struts 2 di Azione
-
27-10-2019 - |
Domanda
Ho lavorato con un piccolo progetto di recente che coinvolge Struts e Spring 2 3 e il mio collega aveva scritto codice molto BAD:
Dobbiamo implementare due moduli di funzionalità simili: le due esigenze a elenco / add / mostra / aggiornamento / eliminazione oggetto Java Bean, e quelli oggetto di due Bean Java ha molti campi in comune, tutti hanno id / content / image_url / created_time / utente, l'unica differenza è un fagiolo ha 2 campi a memorizzare gli offset in created_time e l'altro ha per memorizzare start_time e end_time.
Quindi, il mio collega ha deciso di implementare uno di loro in una puntoni di classe Azione e copiare il codice e ha apportato alcune piccole modifiche poi ha avuto un'altra classe di azione in atto.
Ho difficoltà a correggere il suo errore, quale schema di progettazione o pratica può risolvere il mio problema?
ADD:
Ho cercato di rendere queste due classi di azione estendono la stessa classe base, purtroppo, Struts 2 sembrano ignorare setter / getter delle classi genitore, e non è possibile utilizzare i tipi generici o perché ancora una volta, Struts 2 non si sa quale classe per istanziare e dare ai setter nelle classi di azione.
Voglio ridurre il codice ripetuto, ma a causa di questi 2 problemi di cui sopra, ho finito per rendere il codice ancora più ripetute e struttura di classe troppo complicata, che si trova ai margini di essere rotto.
ADD 2:
ho provato il seguente codice utilizzando stuts2-JSON-plugin (perché è più facile osservare i dati in formato JSON):
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>
il codice Java
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;
}
}
classe figlio:
package com.carllee.exp;
public class ExtendedAction extends BaseAction {
}
se corro questo test e vado a http: // localhost: 8080 / Struts2-exp / ereditare / base message.content = ciao , il risultato sarebbe:?
{"message" : {"content":"hello"}}
se vado a http: // localhost: 8080 / struts2- exp / ereditare / esteso message.content = ciao , il risultato sarebbe:?
{}
e non ci sarebbe avvisi nella console
Questo è il motivo per cui dico Struts 2 ignora setter / getter in classe genitore.
Soluzione
- sottoclasse l'azione e aggiungere le altre proprietà?
- Utilizza la stessa azione, ma diversi punti di vista?
- Fare un fagiolo con tutti e tre i campi, diversi punti di vista, di default quando non è utilizzato?
- Usa
ModelDriven
e decidere quale modello di istanziare in base alla configurazione"method"
di una singola azione? - Etc ...
Un sacco di opzioni. Che è "migliore" dipende da dettagli che non abbiamo.
Se questo è il codice di estendere di BAD bisogna fare i conti con, consideratevi fortunati - questo suoni banale da refactoring. Qual è la lotta reale?
Altri suggerimenti
suggerisco di creare una classe di azione astratto con la parte comune, e due sottoclassi (azioni che verranno chiamati). La classe astratta non può essere chiamato direttamente.
Nella propria applicazione, le sottoclassi può usare tutto il codice nella classe astratta genitore.