在一些方法序列完成后,我有一个关于对象(及其状态)演变的设计问题。我无法明确表达我的意思,因此我可能需要根据反馈清理问题。
考虑一个名为 Classifier 的对象。它有以下方法:
void initialise()
void populateTrainingSet(TrainingSet t)
void pupulateTestingSet(TestingSet t)
void train()
void test()
Result predict(Instance i)
我的问题是需要按特定顺序调用这些方法。此外,在调用前一个方法之前,某些方法无效,并且在调用方法后某些方法无效。例如,在调用test()之前调用predict()是无效的,并且在调用test()之后调用train()将无效。
到目前为止,我的方法是维护一个表示对象当前状态的私有枚举:
private static enum STATE{ NEW, TRAINED, TESTED, READY};
但这似乎有点不完整。这种问题类型有设计模式吗?也许与模板方法有关的东西。
答案 0 :(得分:2)
我认为州设计模式可以帮助你。对于每个状态,您创建一个以您的方式实现这些方法的类,以及您不需要的方法,您可以抛出异常或不执行任何操作。并且您的主类可以包含一个状态对象,该状态对象将根据状态进行更改。它适合你吗? State Design pattern
答案 1 :(得分:2)
是的,有限状态机表示对象的状态以及操作将导致对象在给定状态下执行的操作。
this维基百科文章中有一些非常好的例子。
答案 2 :(得分:2)
嗯,对于这个特殊情况,我认为你在这里过度设计了。例如,您是否应该根据类型区分训练数据集和测试数据集?我的建议是采用工厂模式;你应该有一个具有“train”功能的MachineLearningAlgorithm工厂,它返回一个Hypothesis对象,你可以在其上执行“test”或“predict”。 “训练”功能应该以训练数据集作为参数,而“测试”功能应该以测试数据集作为参数。两个数据集应该可以是相同的类型,因为它们的形式/结构是相同的,即使其中包含的数据不同。至于填充数据集,真的不应该是你的机器学习算法的关注;使用该算法的人应负责提供这些数据集。但是,如果你想拥有某种示例数据集,我会建议各种不同的列车/测试数据集对的工厂。
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);
}