【问题标题】:OO Design - Delegating responsibility of results to a different classOO 设计 - 将结果的责任委托给不同的类
【发布时间】:2019-11-24 03:43:50
【问题描述】:

我有一个调用服务的类,该服务返回做出不同类型的预测。 API 返回每个预测类型的每个标签的置信度分数。目前我调用该服务,然后存储该服务返回的所有分数。但是,在进行了一些调查之后,我发现在我的用例中,我需要更改服务为一种预测类型返回的标签的阈值。

例如:我调用了预测图像是否为动物的服务,该服务有两个标签 True 或 false。

{
  predictedValue: True,
  details: {
    True: 0.65,
    False: 0.35
  }
}

predictedValue 字段是预测服务所有者认为图像基于其阈值的值。但我从 API 得到的结果表明,除非真实置信度大于 0.70,否则它绝不是动物。

public class PredictionResults {
    String prediction;
    Map<String, Double> details;
}
public class PredictionServiceDataLoader {
    public void getAndStorePredictionResults(String predictionType, String id) {
        PredictionResults predictionResults = getPredictionByCallingPredictionService(predictionType);
        saveResults(predictionResults, id);
    }
}

现在,因为我想覆盖服务返回的结果,而这样做的一种方法是:

public void getAndStorePredictionResults(String predictionType, String id) {
    PredictionResults predictionResults = getPredictionByCallingPredictionService(predictionType);
    if(predictionType.equals("detectAnimal")) {
        //Override value based on threshold
        if(predictionResults.getDetails().get("True") < 0.70) {
            predictionResults.setPrediction("False");
        }
    }
    saveResults(predictionResults, id);
}

现在,如果我想消除基于 PredictionServiceDataLoader 之外的阈值更改结果的责任,那么我正在考虑通过以下方式实现:

public interface PredictionResultsOverride {
    public String getPreditionType();
    public String getPredictionResults(PredictionResults predictionResults);
}

public class AnimalPredictionResultOverride implements PredictionResultsOverride {
    @Override 
    public String getPreditionType() {
        return "detectAnimal";
    }

    @Override
    public String getPredictionResults(PredictionResults predictionResults) {
        if(predictionResults.getDetails().get("True") < 0.70) {
            predictionResults.setPrediction("False");
        }
    }
}

然后我的 PredictionServiceDataLoader 将通过以下方式将修改结果的责任委托给不同的类:

public class PredictionServiceDataLoader {

    @Autowired
    private List<PredictionResultsOverride> predictionResultsImpl;
    public void getAndStorePredictionResults(String predictionType, String id) {
        PredictionResults predictionResults = getPredictionByCallingPredictionService(predictionType);
        Optional<PredictionResultsOverride> predictionResultsOverrideImpl = 
            predictionResultsImpl.stream()
                .filter(x -> x.getType().equals(predictionType)) 
                .findFirst();
        predictionResults = predictionResultsOverrideImpl.map(x -> x.getPredictionResults(predictionResults)).orElse(predictionResults);
        saveResults(predictionResults, id);
    }
}

这是将覆盖阈值的责任委托给不同类的最佳方式吗?我可以采取不同的方法吗?在我看来,PredictionServiceDataLoader 类的职责应该只是调用预测服务并存储结果。

【问题讨论】:

    标签: java oop interface abstract-class


    【解决方案1】:

    “在我看来,PredictionServiceDataLoader 类的职责应该只是调用预测服务并存储结果。”

    您是对的,PredictionServiceDataLoader 理想情况下应该检索结果并将其存储。

    您的要求是根据某些标准覆盖结果。这可以在将其展示给最终用户之前(或在将其用于进一步处理之前)加以注意。这样,您将存储原始结果,并且可以在修改覆盖标准的情况下引用(例如,true 应该 >=80%)。如果您在覆盖结果后存储结果,那么您必须将附加详细信息(如 isOverridden、criteria 等)与结果一起保留。

    【讨论】:

    • 由于 details Map 具有原始结果,我认为可以替换预测变量,因为这是服务认为标签的内容。既然是地图,我也可以加个字段说这个被覆盖了,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 2014-01-23
    • 2011-10-24
    • 2018-05-07
    • 2021-03-15
    相关资源
    最近更新 更多