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

标签 design-patterns

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

考虑一个名为 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/

相关文章:

JavaFx TableView 、表网关模式和联接

c# - Linq-To-Sql 的工作单元模式与事务范围?

java - Kafka Consumer架构设计 : java plugin or external client

c++ - 您如何调用位于类及其基类之间的接口(interface)?

java - (java) 确保插件工厂存在特定的构造函数

java - Spring 环境中的领域驱动设计和事务

java - 微服务中的事务

c# - XNA - 使用游戏组件

design-patterns - 单一职责原则是否适用于功能?

ios - 哪种模式将是创建记录的 ApiClient 实例的最佳解决方案,为所有 Controller 共享