gpt4 book ai didi

java - 使用 OO 原则重构过程方法

转载 作者:行者123 更新时间:2023-11-30 04:55:45 25 4
gpt4 key购买 nike

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

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 block 中获取 wfi.getWorkflow_instance_id() ?我知道它可以消除错误,但我正在尝试应用最佳实践。

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

最佳答案

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

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

消除了一些噪音,并且进行了猜测,看起来 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)它必须由可以模拟静态实用方法的框架(几个可以)来模拟。

关于java - 使用 OO 原则重构过程方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8610035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com