Ищем конкретный шаблон дизайна - PullRequest
1 голос
/ 30 апреля 2009

Я ищу шаблон, описывающий определенную ситуацию. Может быть, кто-то что-то знает и может дать мне подсказку

Ситуация Объект типа A, 1: n привязка к объектам типа B. Пример: Человек и все его питомцы. У домашних животных есть элемент данных о возрасте. Теперь у каждого человека должен быть элемент данных о среднем возрасте его домашних животных. Я не хочу, чтобы эта информация была сохранена и загружена, но чтобы она вычислялась во время процесса загрузки (вся необходимая информация уже есть, поэтому она является избыточной, но я хочу, чтобы эта информация была в объекте person).

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

Спасибо за ваши мысли.

Ответы [ 2 ]

1 голос
/ 30 апреля 2009

Если вы создаете класс для ассоциации с типом B, это довольно просто: вам все равно нужен какой-то список. Так что просто создайте «PetList» или что-то в этом роде, у которого есть метод «averageAge()», который вычисляет это значение для всех своих питомцев.

Теперь вы можете получить среднее значение, позвонив person.getPets().averageAge().

С объектно-ориентированной точки зрения информация о среднем в любом случае не должна быть непосредственно в объекте Person.

0 голосов
/ 30 апреля 2009

Это не шаблон проектирования Gang of Four, а общепринятое решение, когда абсолютно необходимо для хранения данных, которые являются избыточными для вычислений, состоит в том, чтобы их лениво загружать, а затем сохранять логическое значение чтобы описать, является ли оно все еще действительным.

Другими словами:

class Person
{
List<Pet> myPets;
float averageAge;
boolean isAgeValid = false;

float getAverageAge()
{
    if(isAgeValid)
        return averageAge;
    else
        ...calculate age, save it in averageAge, set bool to true, and return derived float...
}

//all list operations should mark the bool false
void Add(Pet p)
{
    myPets.Add(p);
    isAgeValid=false;
}
}
...