gpt4 book ai didi

java - 带有反馈机制的工作流的优雅设计

转载 作者:行者123 更新时间:2023-11-30 11:19:46 26 4
gpt4 key购买 nike

<分区>

我正在寻找一种方法来尽可能好地为我的 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),或者,我需要将反馈服务传递到子类。这两种方式都不是我真正想要的。特别是因为处理对象列表可能比在每个元素上循环一次更复杂。 (有时我们需要获取引用、构建树等)

我觉得我把这个设计复杂化了,但我不想写一个很长的意大利面条函数来让它工作。我正在寻找关于如何解决这个问题的想法、以前的经验和反馈。

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