У группы учеников сначала есть только имя.Начиная с 1-го экзамена они будут иметь как имя, так и оценку.Как спроектировать это простым способом? - PullRequest
1 голос
/ 23 ноября 2010

Сначала у меня есть набор Individual с:

class Individual {
    double characteristics[];
    abstract double CalculateValue();
    ...
}

Каждый человек имеет набор характеристик. Эти характеристики будут реализованы пользователем моей библиотеки через наследование:

class MyIndividualABC : Individual {
    public MyIndividualABC() {
        characteristics = new double[2];
        characteristics[0] = 123;
        characteristics[1] = 456;
    }

    public override double CalculateValue() { 
        return characteristics[0] / characteristics[1]; //for example
    }
}

Затем я возьму их и дам каждому из них баллы (в зависимости от их стоимости). Я буду называть это итерацией.

class EvaluatedIndividual {
    double value;
    double score; //score was calculated based on value
}

Начиная с итерации2, я всегда буду иметь под рукой объекты типа EvaluatedIndividual. Но в первый раз мне придется вести с объектами типа Individual.

Мне бы не хотелось обрабатывать первую итерацию иначе, чем другие. Как мне подойти к этому?

Аналогия будет иметь класс студентов. Перед первым экзаменом вы просто знаете их имена, и начиная с 1-го экзамена вы будете иметь как свои имена, так и средние баллы их экзаменов до этого момента.

Я разработал 3 различных способа справиться с этим:

  1. У меня будет метод Start() в моей программе, а затем Iteration(). Start() занимает Individual[], а Iteration() - EvaluatedIndividual[]. Хаки, но творит чудеса. Будет использовать это, если ничего лучше не придет.

  2. EvaluatedIndividual наследуется от Individual. Это выглядит чисто, но я не слишком уверен в этом, потому что я хотел бы, чтобы Individual был интерфейсом, и моя идея состояла бы в том, чтобы позволить клиенту моей библиотеки / фреймворка наследовать от него и определять набор методов / полей на Individual, как он хочет (Individual может иметь несколько значений, которые будут приняты во внимание, например, для вычисления value). Если я буду следовать этому подходу, мне придется заставить его также реализовать класс из EvaluatedIndividual.

  3. Индивид формируется по значению, а также evaluation и wasEvaluated. Сначала wasEvaluated был false, поэтому любая попытка собрать value вызывает исключение. Мне не особенно нравится это, но я не уверен почему.

Как вы подошли к этому? Вероятно, это довольно распространенный шаблон, но, боюсь, я не знаю ни одного шаблона GoF, соответствующего этому сценарию: (

Спасибо

Ответы [ 4 ]

3 голосов
/ 23 ноября 2010

Я все просто; Я бы только один класс здесь. В C # возможно использовать Nullable<T>:

double? Score {get;set;}

В Java (которой явно не хватает Nullable<T>), возможно, просто выставьте счет вместе с флагом isEvaluated (или счетчиком количества оцененных экзаменов) - если это false (или 0) Вы просто игнорируете счет.

2 голосов
/ 23 ноября 2010

У меня был бы один класс со специальным значением для score, которое означает, что индивидуум не был оценен:

class Individual {
    private double value;
    private double score = -1; // score was calculated based on value,
                               // -1 means not evaluated

    public boolean isEvaluated() { return score != -1; }
}

ИМХО наследование здесь является излишним.

0 голосов
/ 23 ноября 2010
class Individual {
  double score;
  ScoreState scoreState;
}

Я обнаружил, что когда мне нужно одно состояние, мне нужно 2, а потом мне нужно 2 + n, так что можно также сделать перечисление, это учитывает ситуации, такие как «Ожидание обзора» и другие подобные соображения., что может пригодиться в будущем, и это предотвращает от избытка флагов, что может сбивать с толку.

0 голосов
/ 23 ноября 2010

Эй, если это не какое-то упражнение в классе, не усложняйте ситуацию.Шаблоны GoF не для всего, что вы знаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...