0

我正在尝试重构此代码以使其更清洁并使用更好的 OOP 实践。此方法采用一堆单选框/复选框和文本框响应并在数据库表中更新它们,然后在另一个数据库表中更新检查表本身。

我觉得这种方法正在尝试做很多事情。但是我需要确定其他方法和类使用的一些东西,例如是否存在缺陷(单选值 = 2),是否推进工作流(在 processUpdateCheckbox 中确定的高级工作流布尔值),接下来根据状态向谁发送电子邮件currentActionItem 和advanceWorkflow 布尔值,以及持久化响应。

setFormFeedback 也不属于这里,因为该方法是从另一个处理表单数据的 Servlet 调用的,并且该消息丢失了。

非常感谢任何有助于重构的帮助。

public ChecklistInstance updateYesNoNAChecklistTogles(HttpServletRequest request, ChecklistInstance ci) throws DAOException {
    String work_item_class_id = request.getParameter("work_item_class_id");
    String work_action_class_id = request.getParameter("work_action_class_id");

    String paramName;
    String attribute_id;
    String radioValue;
    String textValue;
    String strStatus = "1";
    String strStoredNo = "";
    Date dateNow = new Date();

    YesNoNAAnswerDAO ynnDao = new YesNoNAAnswerDAO();
    ChecklistInstanceDAO ciDao = new ChecklistInstanceDAO();

    WorkflowInstanceWorkItemAction currentActionItem = new WorkflowInstanceWorkItemAction();
    currentActionItem.setWork_item_class_id(work_item_class_id);
    currentActionItem.setWork_action_class_id(work_action_class_id);

// Put the form check list responses into a list
    List answer_attribute_list = new ArrayList();

    java.util.Enumeration enum2 = request.getParameterNames();
        while (enum2.hasMoreElements()) {
            paramName = (String) enum2.nextElement();
            boolean isNewQ = paramName.startsWith("qID_");

            if (isNewQ) {
                attribute_id = paramName.replaceAll("qID_", "");
                YesNoNAAnswer clr = new YesNoNAAnswer();

                if (request.getParameter("radio_" + attribute_id) != null) {
                    radioValue = request.getParameter("radio_" + attribute_id);
                } else {
                    radioValue = "0";
                }

                if (request.getParameter("textbox_" + attribute_id) != null) {
                    textValue = request.getParameter("textbox_" + attribute_id);
                } else {
                    textValue = "";
                }

                if (request.getParameter("check_" + attribute_id) != null) {
                    radioValue = request.getParameter("check_" + attribute_id);
                } else {
                    // checkValue = "";
                }

                if ("0".equals(radioValue) || "2".equals(radioValue)) {
                    strStatus = "0";
                }

                strStoredNo = request.getParameter("stored_" + attribute_id);
                if ("2".equals(radioValue) && !"yes".equals(strStoredNo)) {
                    deficiencyFound = true;
                }

                clr.setWorkflow_instance_id(ci.getWorkflow_instance_id());
                clr.setWfi_work_item_action_id(ci.getWfi_work_item_action_id());
                clr.setFail_reason(textValue);
                clr.setAttribute_id(attribute_id);
                clr.setToggle_value(radioValue);
                answer_attribute_list.add(clr);
            }
        }

        ci.setChecklist_state(strStatus);
        ci.setLast_update(dateNow);
        ci.setAdditional_info(FormUtil.getFieldValue(request, FIELD_ADDITIONAL_INFO));

        processUpdateCheckbox(request, ci, currentActionItem);

            // Update the base check list
            ciDao.updateInstance(ci, authenticatedUser);

            // Update the check list question responses
            ynnDao.updateToggles(answer_attribute_list, authenticatedUser);

            // update the work flow
            WorkflowInstanceDAO wfiDao = new WorkflowInstanceDAO();
            WorkflowInstanceForm wfiForm = new WorkflowInstanceForm(wfiDao, authenticatedUser);
            WorkflowInstance wfi = (WorkflowInstance) wfiForm.view(ci.getWorkflow_instance_id(), authenticatedUser);
            wfiForm.updateWorkFlowInstance(wfi, currentActionItem);

            setFormFeedback("You have successfully updated the checklist.");
            triggerUpdateEmail(request, ci, wfi, currentActionItem);

    return ci;
}
4

2 回答 2

1

首先要做的事情是:您正在做面向对象的编程,而不是过程编程,这就是为什么您应该事先考虑哪个类应该承担哪些责任。

那么,这里的职责是什么?我们可以列出以下必须独立完成的任务:

  • 验证用户输入数据:检查客户端通过 HTTP 提供的值的有效性(值范围、无效值、安全问题(注入保护)...)。
  • 仅包含对域模型方法的调用列表的控制器。
  • 领域模型:一组代表您的业务数据并提供操作方法的类。
  • 一种将您的域模型持久化的方法:到数据库,到 XML 文件......

不要忘记从所有处理的开始到结束管理事务(如果需要)。

删除无用的依赖项:您的域模型不应该知道 HTTP 以及数据的来源。你的控制器不应该知道数据是如何被持久化的。

不要重新发明轮子:使用像Struts 2这样的 MVC 框架来满足您的验证和控制器需求。使用像hibernate/JPA这样的持久性框架。

于 2012-09-07T14:38:56.677 回答
0

快速解决 :

  1. 手工制作这个函数中发生的事情的简单图表
  2. 为所采取的每种类型的操作编写一个小函数。
  3. 创建一个包含所有有价值的参数值的类HttpServletRequest
  4. HttpServletRequest创建从(构造函数、静态方法、设置器,如您所愿)创建此类对象的方法
  5. 您可以为 UI 组件使用状态

伪代码看起来像

  HttpServletRequest req;
  RequestParameters params = new RequestParameters(req);
  //make some processing here (database)
  for(UIState state : stateList){
    state.makechanges(params)
  }
  /* UIState can be an interface, each UI item has it own subclass*/
于 2012-09-07T14:37:56.807 回答