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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top