Java 使用面向对象原则重构过程方法

Java 使用面向对象原则重构过程方法,java,oop,web-applications,Java,Oop,Web Applications,我有一个方法,我想把一些代码分解成它自己的方法 这就是我所拥有的: public class TD0301AssignmentForm extends Form { public TD0301AssignmentForm(TD0301AssignmentDAO dao, STKUser authenticatedUser) { this.dao = dao; this.authenticatedUser = authenticatedUser; } public O

我有一个方法,我想把一些代码分解成它自己的方法 这就是我所拥有的:

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标记为不可用。我是否应该这样做来修复错误,以便仍然可以在上面的issucess块中获取
wfi.getWorkflow\u instance\u id()
?我知道它消除了错误,但我正在尝试应用最佳实践

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

没有看到所有的代码,就很难准确地看到您想要实现的目标。eclipse抱怨的原因是因为您已经将其本地实例移动到了方法中,所以它不再有wfi实例可供使用,但创建另一个wfi实例不太可能是您的答案

要获得此工作,请将wfi更改为类本地,并直接使用其id,或从insertWorkFlowInstance()返回wfi.getWorkflow_instance_id(),然后将该值传递到tdas.setWorkflow_instance_id()

实例变量(“属性”或“字段”)如果在整个课程中没有使用它们,则不一定是正确的方法

变量应该具有尽可能小的作用域——这使代码更容易推理

排除了一些干扰和猜测,似乎可以本地化
WorkflowInstance
WorkflowInstanceDao
(名称更改以匹配Java约定):

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

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


例如,
buildWorkflow
几乎很容易测试,只是DAO是“手动”实例化的。这意味着测试方法要么(a)依赖于有一个工作的DAO层,要么(b)它必须由一个可以模拟静态实用程序方法的框架来模拟(几个可以)。

我的文章往往会被代码填满,所以我试图限制显示的数量,以便让大家理解我的观点。我在问题的底部写了一些东西,通过创建私有类变量(字段)来实现它。但我想知道这种方法是否是重构它的好方法。听起来你说创建局部类变量是在暗示同样的事情。@jeff要小心术语:有“类变量”(静态)、“实例变量”(在方法外定义,但不是静态)和“局部变量”(在方法/块内定义)。太棒了!谢谢你,戴夫。现在一切都开始有点道理了。WorkflowInstance用于我的方法的其余部分(其代码也必须进行重构。您有什么理由在两种方法中都设置WorkflowInstanceId吗?再次感谢Dave。@jeff剪切粘贴错误,我想……我更喜欢在主线代码中使用它,但仅仅是……在方法中,它正在修改一个参数,这是我想要避免的。
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);
    } 

}