Сохраняя мой код сухим в действии Struts 2
-
27-10-2019 - |
Вопрос
Недавно я работал с небольшим проектом, в котором участвуют 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"
конфигурация? - Так далее...
Много вариантов. Что «лучшее» зависит от деталей, которые у нас нет.
Если это расширение плохого кода, с которым вы должны иметь дело, считайте себя счастливчиком-это звучит тривиально для рефактории. Какая реальная борьба?
Другие советы
Я предлагаю создать абстрактный класс действий с общей частью и два подкласса (действия, которые будут называться). Абстрактный класс нельзя назвать напрямую.
В вашем приложении подклассы могут использовать весь код в классе родительского абстрактного.