我有一种方法可以将一些代码分解为自己的方法 这就是我所拥有的:
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();
答案 0 :(得分:2)
实例变量(“属性”或“字段”)如果不在整个班级中使用,则不一定是可行的方法。
变量应该具有尽可能小的范围 - 这使代码更易于推理。
由于某些噪音已被删除,并且还在猜测,似乎可以对WorkflowInstance
和WorkflowInstanceDao
进行本地化(更改名称以匹配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()