2009-04-30 9 views
1

Je cherche un motif décrivant une situation particulière. Peut-être que quelqu'un sait quelque chose et peut me donner un indiceRecherche d'un motif de dessin spécifique

Situation Objet de type A, 1: n association avec des objets de type B. Exemple: Une personne et tous ses animaux de compagnie. Les objets familiers ont un membre de données d'âge. Maintenant, chaque personne devrait avoir un membre de données pour l'âge moyen de ses animaux de compagnie. Je ne veux pas que cette information soit sauvegardée et chargée, mais qu'elle soit calculée pendant le processus de chargement (toutes les informations nécessaires sont déjà là, donc c'est un peu redondant, mais je veux les informations dans l'objet personnel).

Question Alors, comment puis-je faire cela de manière orientée objet? Y a-t-il un modèle qui décrit cette situation? Ma première idée était d'avoir une classe ComputedFieldsUpdater qui prend un objet animal de compagnie et ensuite calcule tout le champ qui n'a pas été chargé. Mais je me demande si c'est la bonne façon ou s'il pourrait y avoir une solution plus élégante?

Merci pour votre avis.

Répondre

1

Si vous créez une classe pour l'association de type B, c'est assez simple: vous avez besoin d'une sorte de liste de toute façon. Il suffit donc de créer une "PetList" ou quelque chose comme ça, qui a une méthode "averageAge()" qui calcule cette valeur de tous ses animaux de compagnie.

Vous pouvez maintenant accéder à la moyenne en appelant le person.getPets().averageAge(). D'un point de vue orienté objet, les informations sur la moyenne ne doivent pas être directement dans l'objet Person de toute façon.

+0

encore mieux la moyenne peut alors être mis en cache au lieu de recalculée chaque fois – MahdeTo

+0

« D'un point de vue orienté objet les informations sur la moyenne ne devrait pas être directement dans la personne -objet de toute façon. " - Je ne suis pas si sûr de ça. Généralement dans la POO, du code veut demander à une classe d'effectuer le calcul pour elle - et ne pas s'inquiéter des représentations internes ou intermédiaires des données. Je pense que quelque chose comme person.getPetsAverageAge() serait une méthode appropriée pour cela. – harto

+0

Mais cela violerait le principe de la responsabilité unique. Une classe Person telle que je la comprends est responsable de la représentation du concept abstrait d'une personne. Si vous lui confiez également la responsabilité de faire des calculs sur des classes associées, vous lui avez confié une seconde responsabilité. À moins bien sûr que le seul but de la personne est de faire ces calculs et de ne pas représenter une personne. Mais le nom est très trompeur. –

0

ne est pas une bande de modèle de conception à quatre, mais la solution généralement acceptée quand il est absolument nécessaire pour stocker des données qui sont redondantes à un calcul est à la charge paresseux, puis garder une valeur booléenne pour décrire si c'est toujours valide.

En d'autres termes:

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; 
} 
} 
+0

Vous pouvez également avoir une méthode Person pour les animaux de compagnie à appeler lorsque leur état interne/age change pour définir isAgeValid sur false. Le faire marquer public (ou plus convenablement au niveau de la conception, paquet) fonctionne bien, parce que l'appeler à un moment inapproprié n'endommage pas les données, il provoque juste des calculs supplémentaires sur toute la ligne. – JoshJordan

+0

Je voudrais vraiment que les classes A et B soient correctement séparées. C'est pourquoi j'ai pensé à mettre le code de mise à jour dans une classe séparée en premier lieu. – jpfollenius

+0

La séparation correcte serait probablement la réponse ci-dessus, où il y a une sous-classe d'une collection générique tapée à Pet, qui ajoute cette fonctionnalité. – JoshJordan

Questions connexes