gpt4 book ai didi

design-patterns - 是否有一种设计模式可以在各种状态下表达对象(及其操作)?

转载 作者:行者123 更新时间:2023-12-04 06:57:17 25 4
gpt4 key购买 nike

在完成一些方法序列后,我有一个关于对象(及其状态)演变的设计问题。我无法表达我的意思,所以我可能需要根据反馈来清理问题。

考虑一个名为 Classifier 的对象。它有以下方法:

void initialise()
void populateTrainingSet(TrainingSet t)
void pupulateTestingSet(TestingSet t)
void train()
void test()
Result predict(Instance i)

我的问题是这些方法需要按一定的顺序调用。此外,有些方法在调用前一个方法之前是无效的,有些方法在调用一个方法之后是无效的。例如,在调用 test() 之前调用 predict() 是无效的,在调用 test() 之后调用 train() 也是无效的。

到目前为止,我的方法是维护一个表示对象当前状态的私有(private)枚举:
private static enum STATE{ NEW, TRAINED, TESTED, READY};

但这似乎有点胡说八道。这种问题类型是否有设计模式?也许与模板方法有关。

最佳答案

好吧,对于这种特殊情况,我认为您在这里过度设计。例如,您真的应该根据类型区分训练数据集和测试数据集吗?我的建议是采用工厂模式;您应该有一个带有“train”函数的 MachineLearningAlgorithm 工厂,该函数返回一个 Hypothesis 对象,您可以在该对象上执行“test”或“predict”。 “train”函数应该将训练数据集作为其参数,而“test”函数应该将测试数据集作为其参数。两个数据集可能应该是相同的类型,因为它们的形式/结构是相同的,即使其中包含的数据不同。至于填充数据集,这真的不应该是您的机器学习算法关心的问题;使用该算法的人应负责提供这些数据集。但是,如果您想要某种示例数据集,我会建议工厂用于各种不同的训练/测试数据集对。

 public interface Result
{
public double getDecisionValue();
public String getPredictedLabel();
}

public interface TestResult extends Result
{
public String getActualLabel();
}

public interface TestResults extends Iterable<TestResult>
{
public int getErrorCount();
public double getErrorRate();
}

public interface Hypothesis
{
public TestResults test(Iterable<DataPoint> dataset, Iterable<String> labels);
public Result predict(DataPoint datapoint);
}

public interface MachineLearningAlgorithm
{
public Hypothesis train(Iterable<DataPoint> trainset, Iterable<String> trainlabels);
}

关于design-patterns - 是否有一种设计模式可以在各种状态下表达对象(及其操作)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2846107/

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