在完成一些方法序列后,我有一个关于对象(及其状态)演变的设计问题。我无法表达我的意思,所以我可能需要根据反馈来清理问题。
考虑一个名为 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/