如何重构此Java方法以更好地利用OOP
我正试图重构这段代码,使之更干净,并使用更好的OOP实践。此方法获取一组radio/checkbox和textbox响应,并在数据库表中更新它们,然后在另一个数据库表中更新清单本身 我觉得这个方法很有用。但我需要确定其他方法和类使用的一些东西,例如,如果存在缺陷(radio value=2),是否推进工作流(在processUpdateCheckbox中确定advanceWorkflow布尔值),根据currentActionItem和advanceWorkflow布尔值的状态,下一步向谁发送电子邮件,以及坚持回应 setFormFeedback也不属于这里,因为该方法是从处理表单数据的另一个Servlet调用的,并且该消息丢失 非常感谢您在重构方面的帮助如何重构此Java方法以更好地利用OOP,java,refactoring,Java,Refactoring,我正试图重构这段代码,使之更干净,并使用更好的OOP实践。此方法获取一组radio/checkbox和textbox响应,并在数据库表中更新它们,然后在另一个数据库表中更新清单本身 我觉得这个方法很有用。但我需要确定其他方法和类使用的一些东西,例如,如果存在缺陷(radio value=2),是否推进工作流(在processUpdateCheckbox中确定advanceWorkflow布尔值),根据currentActionItem和advanceWorkflow布尔值的状态,下一步向谁发送电
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;
}
快速修复:
HttpServletRequest
HttpServletRequest
创建此类对象的方法(构造函数、静态方法、setter,如您所愿) 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*/
第一件事优先:您正在进行面向对象编程,而不是过程编程,这就是为什么您应该事先考虑哪个类应该承担哪些责任 那么,这里的责任是什么?我们可以列出以下必须独立完成的任务:
- 验证用户输入数据:检查客户端通过HTTP提供的值的有效性(值范围、无效值、安全问题(注入保护)…)
- 只包含对域模型方法调用列表的控制器
- 域模型:表示业务数据并提供操作方法的一组类
- 持久化域模型的一种方法:数据库、XML文件
不要重新发明轮子:使用MVC框架,例如用于验证和控制器需求。使用一个持久性框架,比如。我是在那里转发问题还是版主移动问题,你可能会得到更好的答案?不想因为交叉发帖而被责骂!谢谢你的第一句话恰到好处。我来自FORTRAN语言背景。我计划最终使用一个持久性框架,但我必须一次重构一个小程序,我的Dao类对我来说运行得非常好。这是需要立即注意的程序性问题。我不是已经在做步骤3和4了吗;clr.SETU值(无线电值);