Существует ли шаблон проектирования, который выражает объекты (их операции) в различных состояниях? - PullRequest
4 голосов
/ 17 мая 2010

У меня есть вопрос о развитии объекта (и его состояния) после завершения некоторой последовательности методов. У меня возникли проблемы с формулировкой того, что я имею в виду, поэтому мне, возможно, потребуется прояснить вопрос на основе обратной связи.

Рассмотрим объект с именем Классификатор . Он имеет следующие методы:

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

Моя проблема в том, что эти методы нужно вызывать в определенном порядке. Кроме того, некоторые методы недопустимы до тех пор, пока не будет вызван предыдущий метод, а некоторые методы недопустимы после вызова метода. Например, было бы недопустимо вызывать предикат () до вызова test (), и было бы недопустимо вызывать train () после вызова test ().

Мой подход до сих пор состоял в том, чтобы поддерживать закрытое перечисление, которое представляет текущее состояние объекта:

private static enum STATE{ NEW, TRAINED, TESTED, READY};

Но это кажется немного слизистым. Есть ли шаблон дизайна для такого типа проблемы? Может быть, что-то связано с методом шаблона.

Ответы [ 3 ]

2 голосов

Да, конечный автомат представляет состояния объекта и то, что действие заставит объект делать в данном состоянии.

Есть несколько очень хороших примеров этой статьи в Википедии.

2 голосов
/ 17 мая 2010

Ну, в данном конкретном случае, я думаю, что вы чрезмерно проектируете здесь. Например, следует ли вам действительно проводить различие между набором данных для обучения и набором данных для тестирования с точки зрения их типа? Мое предложение состояло бы в том, чтобы пойти с фабричным образцом; у вас должна быть фабрика MachineLearningAlgorithm с функцией «train», которая возвращает объект гипотезы, для которого вы можете выполнить «test» или «Foret». Функция "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);
 }
2 голосов
/ 17 мая 2010

Я думаю, что шаблон государственного дизайна может вам помочь. Для каждого состояния вы создаете класс, который реализует эти методы по-своему, и методы, которые вам не нужны, вы можете генерировать исключения или ничего не делать. И ваш основной класс может содержать объект состояния, который будет меняться в зависимости от состояния. Это подходит для вас? Государственный образец проектирования

...