Хранение моего кода СУХОГО в Struts 2's Action - PullRequest
0 голосов
/ 01 декабря 2011

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

Мы должны реализовать два модуля с похожими функциями: оба нужно перечислить /добавить / показать / обновить / удалить объект Java Bean, и эти два объекта Java Bean имеют много общих полей, все они имеют id / content / image_url / creation_time / user, единственное отличие состоит в том, что один компонент имеет 2 поля для хранения смещений в созданном времениа другой должен хранить start_time и end_time.

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

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

ADD:

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

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

ADD 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/inherit/base?message.content=hello,, результат будет:

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

, если я перейду к http://localhost:8080/struts2-exp/inherit/extended?message.content=hello,, результат будет:

{}

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

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

Ответы [ 2 ]

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

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

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

0 голосов
/ 01 декабря 2011

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

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

...