Pregunta

Recientemente he estado trabajando con un pequeño proyecto que involucra Struts 2 y Spring 3 y mi colega había escrito un código muy malo:

Tenemos que implementar dos módulos de funcionalidades similares: ambos necesitan enumerar/agregar/mostrar/actualizar/eliminar el objeto Java Bean, y esos dos objeto Java Bean tienen muchos campos en común, todos tienen ID/Content/Image_URL/Create_Time/ Usuario, la única diferencia es que One Bean tiene 2 campos para almacenar compensaciones en Create_Time y el otro tiene que almacenar Start_Time y End_Time.

Entonces, mi colega decidió implementar uno de ellos en una clase de acción de Struts y copiar el código e hizo algunos pequeños cambios, luego tuvo otra clase de acción.

Estoy luchando por corregir su error, ¿qué patrón de diseño o práctica puede resolver mi problema?

AGREGAR:

He tratado de hacer que esas dos clases de acción extiendan la misma clase base, desafortunadamente, los Struts 2 parecen ignorar a los setters/getters de las clases de los padres, y no puede usar tipos genéricos porque nuevamente, Struts 2 no sabrá a qué clase instanciar y dar a los setters en las clases de acción.

Quiero reducir el código repetido, pero debido a esos 2 problemas mencionados anteriormente, terminé haciendo un código más repetido y una estructura de clase demasiado complicada que está al borde de ser roto.

Agregar 2:

Probé el siguiente código usando Stuts2-Json-Plugin (porque es más fácil observar los datos en 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>

el código 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;
    }

}

Clase infantil:

package com.carllee.exp;

public class ExtendedAction extends BaseAction {

}

Si ejecuto esta prueba y voy a http: // localhost: 8080/struts2-exp/herhherit/base? Message.content = Hola, el resultado sería:

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

si voy a http: // localhost: 8080/struts2-exp/herhherit/extended? Message.content = Hola, el resultado sería:

{}

y habría advertencias en la consola

Es por eso que digo que Struts 2 ignora a los setters/getters en la clase matriz.

¿Fue útil?

Solución

  • ¿Subclase la acción y agregue las otras propiedades?
  • ¿Usa la misma acción pero diferentes vistas?
  • ¿Hacer un frijol con los tres campos, diferentes vistas, predeterminados cuando no se usa?
  • Usar ModelDriven y decida qué modelo instanciar basado en una sola acción "method" ¿configuración?
  • Etc...

Muchas opciones. Lo cual es "mejor" depende de los detalles que no tenemos.

Si ese es la extensión del código incorrecto con el que tiene que lidiar, considérate afortunado: esto suena trivial para refactorizar. ¿Cuál es la lucha real?

Otros consejos

Sugiero crear una clase de acción abstracta con la parte común y dos subclases (acciones que se llamarán). La clase abstracta no se puede llamar directamente.

En su aplicación, las subclases pueden usar todo el código en la clase de resumen matriz.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top