Вопрос

Недавно я работал с небольшим проектом, в котором участвуют Struts 2 и Spring 3, и мой коллега написал очень плохой код:

Мы должны реализовать два модуля с аналогичными функциями: оба необходимо перечислить/добавить/показать/обновить/удалить объект бобов Java, и эти два объекта Java Bean имеют много общих полей, все они имеют ID/Content/Image_url/Create_time/ Пользователь, единственная разница в том, что у одного боба есть 2 поля для хранения смещений в create_time, а другой должен хранить start_time и end_time.

Таким образом, мой коллега решил внедрить один из них в одном классе действий на стойках, скопировать код и внес несколько небольших изменений, а затем у него был еще один класс действий.

Я изо всех сил пытаюсь исправить его ошибку, какой шаблон дизайна или практика может решить мою проблему?

ДОБАВЛЯТЬ:

Я попытался сделать эти два класса действий, расширяя один и тот же базовый класс, к сожалению, Struts 2, кажется, игнорируют сеттеры/получения родительских классов, и вы не можете использовать общие типы, потому что опять же, Struts 2 не узнает, какой класс экземпляр и дайте сеттерам в классах действий.

Я хочу уменьшить повторный код, но из -за этих двух задач, указанных выше, я в итоге сделал еще более повторяющийся код и слишком сложную структуру классов, которая находится на грани разбивки.

Добавить 2:

Я протестировал следующий код, используя Stuts2-json-plugin (потому что легче наблюдать данные в формате 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>

код 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;
    }

}

Детский класс:

package com.carllee.exp;

public class ExtendedAction extends BaseAction {

}

Если я запускаю этот тест и перейду к http: // localhost: 8080/struts2-exp/nehrit/base? message.content = hello, результатом будет:

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

Если я пойду в http: // localhost: 8080/struts2-exp/nehrit/edgended? message.content = hello, результатом будет:

{}

И в консоли будут предупреждения

Вот почему я говорю, что Struts 2 игнорируют сеттеры/Getters в родительском классе.

Это было полезно?

Решение

  • Подкласс действия и добавить другие свойства?
  • Используйте одно и то же действие, но разные представления?
  • Сделайте один фасоль со всеми тремя полями, разными представлениями, по умолчанию, когда они не используются?
  • Использовать ModelDriven и решить, какую модель создать экземпляры на основе одного действия "method" конфигурация?
  • Так далее...

Много вариантов. Что «лучшее» зависит от деталей, которые у нас нет.

Если это расширение плохого кода, с которым вы должны иметь дело, считайте себя счастливчиком-это звучит тривиально для рефактории. Какая реальная борьба?

Другие советы

Я предлагаю создать абстрактный класс действий с общей частью и два подкласса (действия, которые будут называться). Абстрактный класс нельзя назвать напрямую.

В вашем приложении подклассы могут использовать весь код в классе родительского абстрактного.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top