作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
<分区>
我正在寻找一种方法来尽可能好地为我的 Java 应用程序代码建模,但我无法全神贯注于一个好的设计。
我正在尝试导入数据,将其处理到数据库中,然后发送反馈。我还将导入过程的状态作为一个实体保存在数据库中,因为有关该过程的反馈是一个重要因素。我想出了这个设计,但我感觉不太好。
public interface FeedbackService {
void startingImport();
void fetchingDataSuccessful(int amountObjectsFetched);
void fetchingDataUnsuccessful(Exception e);
void addSuccessfulObjectProcess(Object processedObject);
void addUnsuccessfulObjectProcess(Object processedObject);
void processingDataSuccessful(int amountObjectsProcessed);
void processingDataUnsuccessful(Exception e);
void sendFeedback();
void finishImport();
}
我对这个设计的一个大担忧是,你有不同的状态,在这些状态下只能调用某些函数。我在某处读到,当您的方法依赖于首先调用其他方法时,这是糟糕的设计。此外,这将需要 State 设计模式,这对于基本上是一个扩展日志库的东西来说可能有点矫枉过正。
我试图通过使用模板模式来解决这个问题,这样工作流和日志记录及其顺序依赖关系由父类(super class)处理,而子类可以处理数据特定代码(处理产品、处理目录、 ETC)。
public void handle(){
registration.startImport();
try {
int amount = fetchData();
registration.fetchingDataSuccessful(amount);
try {
for (Object o : getData()) {
if (handleObject(o)) {
registration.addSuccessfulObjectProcess(o);
} else {
registration.addUnsuccessfulObjectProcess(o);
}
}
registration.processingDataSuccessful(getData().size());
} catch (DataHandlingException e) {
registration.processingDataUnsuccessful(e);
}
} catch (DataFetchingException e) {
registration.fetchingDataUnsuccessful(e);
}
registration.sendFeedback();
}
fetchData()、getData() 和 handleObject() 将是子类实现的抽象方法
但是,现在我的代码泄露了,尤其是 add(Un)successfulObjectProcess 方法和 getData() 方法。由于这个需要在循环内执行,我需要将循环(和数据)拉到父类(super class),或者,我需要将反馈服务传递到子类。这两种方式都不是我真正想要的。特别是因为处理对象列表可能比在每个元素上循环一次更复杂。 (有时我们需要获取引用、构建树等)
我觉得我把这个设计复杂化了,但我不想写一个很长的意大利面条函数来让它工作。我正在寻找关于如何解决这个问题的想法、以前的经验和反馈。
我是一名优秀的程序员,十分优秀!