使用OO原则重构程序方法

时间:2011-12-22 21:40:46

标签: java oop web-applications

我有一种方法可以将一些代码分解为自己的方法 这就是我所拥有的:

public class TD0301AssignmentForm extends Form {  
 public TD0301AssignmentForm(TD0301AssignmentDAO dao, STKUser authenticatedUser) {
    this.dao = dao;
    this.authenticatedUser = authenticatedUser;
 }

  public Object insert(HttpServletRequest request) {
    TD0301Assignment tdas = new TD0301Assignment();
    TD0301Assignment tdas_orig = null;
    Date dateNow = new Date();

    try {
        // Get the inuput from HTML form
        tdas.setCalc_num(FormUtil.getFieldValue(request, FIELD_CALC_NUM));
        processDate(request, tdas);
        tdas.setCalc_dept(FormUtil.getFieldValue(request, FIELD_CALC_DEPT));
        tdas.setYear_oi(Integer.toString(DateUtil.getIntYear(dateNow)));
        processCalcSafetyRequirements(request, tdas);
        ...etc...
        if (isSucces()) {
             // Instantiate a base work flow instance!
             WorkflowInstance wfi = new WorkflowInstance();
             WorkflowInstanceDAO wfiDAO = new WorkflowInstanceDAO();
             wfi.setWorkflow_class_id(tdas.getCalc_level());
             wfi.setStarted_by(authenticatedUser.getBadge());
             wfi.setStatus("0");
             wfi.setLast_date(dateNow);
             // Insert the WorkFlowInstance into the database, db sets returned sequence number into the wfi object.
             wfiDAO.insert(wfi, authenticatedUser);

             // Insert the TD0301Assignment into the db
             tdas.setWorkflow_instance_id(wfi.getWorkflow_instance_id());
          } 

我想将WorkflowInstance代码删除到自己的方法中(仍在此类中),如下所示:

        if (isSucces()) {
            insertWorkFlowInstance(request, tdas);
            tdas.setWorkflow_instance_id(wfi.getWorkflow_instance_id());

但是wfi现在被Eclipse标记为不可用。我应该做这样的事情来修复错误,这样我仍然可以在上面的isSuccess块中获得wfi.getWorkflow_instance_id()吗?我知道它消除了错误,但我正在尝试应用最佳实践。

public class TD0301AssignmentForm extends Form {
 private WorkflowInstance wfi = new WorkflowInstance();
 private WorkflowInstanceDAO wfiDAO = new WorkflowInstanceDAO();

2 个答案:

答案 0 :(得分:2)

实例变量(“属性”或“字段”)如果不在整个班级中使用,则不一定是可行的方法。

变量应该具有尽可能小的范围 - 这使代码更易于推理。

由于某些噪音已被删除,并且还在猜测,似乎可以对WorkflowInstanceWorkflowInstanceDao进行本地化(更改名称以匹配Java约定):

public class TD0301AssignmentForm extends Form {  

    public Object insert(HttpServletRequest request) {
        TD0301Assignment tdas = new TD0301Assignment();

        try {
            tdas.setCalcNum(FormUtil.getFieldValue(request, FIELD_CALC_NUM));
            processDate(request, tdas);

            tdas.setCalcDept(FormUtil.getFieldValue(request, FIELD_CALC_DEPT));
            tdas.setYearOi(Integer.toString(DateUtil.getIntYear(dateNow)));
            processCalcSafetyRequirements(request, tdas);

            if (isSuccess()) {
                WorkflowInstance wf = buildWorkflow(tdas);
                tdas.setWorkflowInstanceId(wf.getId());
            }
        }
    }

    private buildWorkflow(TD0301Assignment tdas) {
        WorkflowInstance wfi = new WorkflowInstance();
        wfi.setWorkflowClassId(tdas.getCalcLevel());
        wfi.setStartedBy(authenticatedUser.getBadge());
        wfi.setStatus("0");
        wfi.setLastDate(new Date());

        WorkflowInstanceDao wfiDao = new WorkflowInstanceDao();
        wfiDao.insert(wfi, authenticatedUser);
    } 

}

这是否合适取决于您显示的方法片段的其余部分如何/ WorkflowInstance。 DAO几乎肯定能够本地化。

随着方法变得更小,更容易思考,它们变得更容易测试。

例如,buildWorkflow几乎很容易测试,除了“手动”实例化DAO。这意味着测试方法将(a)依赖于具有工作DAO层,或者(b)必须由可以模拟静态实用程序方法的框架(几个可以)进行模拟。

答案 1 :(得分:0)

如果没有看到所有代码,就不容易确切地看到你想要实现的目标。 eclipse之所以抱怨是因为它已经不再使用wfi实例,因为你已经将其本地实例移动到了你的方法中,但是创建另一个wfi实例可能不是你的答案。

要实现此功能,请将wfi更改为本地类,并直接使用它的id或从insertWorkFlowInstance()返回wfi.getWorkflow_instance_id(),然后将该值传递给tdas.setWorkflow_instance_id()