【发布时间】: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