2009-04-30 29 views
1

Ich suche ein Muster, das eine bestimmte Situation beschreibt. Vielleicht weiß jemand etwas und kann mir einen Tipp gebenAuf der Suche nach einem bestimmten Designmuster

Situation Objekt vom Typ A, 1: n Zuordnung zu Objekten des Typs B. Beispiel: Eine Person und alle seine Haustiere. Die Haustierobjekte haben ein Altersdatenelement. Jetzt sollte jede Person ein Datenmitglied für das Durchschnittsalter seiner Haustiere haben. Ich möchte nicht, dass diese Informationen gespeichert und geladen werden, sondern während des Ladevorgangs berechnet werden (alle notwendigen Informationen sind bereits vorhanden, also ist es irgendwie redundant, aber ich möchte die Informationen in dem Personenobjekt).

Frage Also wie kann ich das in einer objektorientierten Weise tun? Gibt es ein Muster, das diese Situation beschreibt? Meine erste Idee war, eine Klasse ComputeredFieldsUpdater zu haben, die ein Haustierobjekt annimmt und dann das ganze Feld berechnet, das nicht geladen worden ist. Aber ich frage mich, ob dies der richtige Weg ist oder ob es eine elegantere Lösung geben könnte?

Danke für Ihre Gedanken.

Antwort

1

Wenn Sie eine Klasse für die Zuordnung zu Typ B erstellen, ist das ziemlich einfach: Sie brauchen sowieso irgendeine Art von Liste. Also erstellen Sie einfach eine "PetList" oder etwas ähnliches, das eine Methode "averageAge()" hat, die diesen Wert von all seinen Haustieren berechnet.

Jetzt können Sie auf den Durchschnitt zugreifen, indem Sie person.getPets().averageAge() anrufen.

Aus objektorientierter Sicht sollte die Information über den Durchschnittswert sowieso nicht direkt im Person-Objekt liegen.

+0

noch besser die durchschnittliche kann dann statt jedes Mal – MahdeTo

+0

„Von einer objektorientierten Sicht neu berechnet zwischengespeichert wird, die Informationen über den Durchschnitt nicht direkt in der Person sein sollten -Objekt sowieso. " - Ich bin mir da nicht so sicher. Im Allgemeinen möchte ein Code in OOP eine Klasse bitten, die Berechnung dafür durchzuführen - und sich keine Gedanken über interne oder intermediäre Darstellungen der Daten machen. Ich denke, etwas wie person.getPetsAverageAge() wäre eine geeignete Methode dafür. – harto

+0

Dies würde jedoch das Prinzip der einheitlichen Verantwortung verletzen. Eine Personenklasse, wie ich sie verstehe, ist verantwortlich für die Darstellung des abstrakten Konzepts einer Person. Wenn Sie es auch dafür machen, Berechnungen für assoziierte Klassen durchzuführen, haben Sie eine zweite Verantwortung übernommen. Es sei denn, der einzige Zweck der Person besteht darin, diese Berechnungen durchzuführen und nicht eine Person darzustellen. Aber die Benennung ist sehr irreführend. –

0

Es ist kein Gang of Design-Muster Vier, aber die allgemein akzeptierte Lösung, wenn es unbedingt notwendig Daten zu speichern, die für eine Berechnung überflüssig ist zu faul Last, und dann einen Booleschen Wert halten zu beschreiben, ob es ist immer noch gültig.

Mit anderen Worten:

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

Sie können auch eine Person-Methode für die Haustiere einrichten, wenn sich ihr interner Status/ihr Alter ändert, um isAgeValid auf false zu setzen. Wenn es als öffentlich markiert wird (oder besser auf der Ebene der Design-Ebene, Paket), funktioniert das in Ordnung, denn wenn es zu einem unangemessenen Zeitpunkt aufgerufen wird, beschädigt es keine Daten, es verursacht lediglich zusätzliche Berechnungen auf der ganzen Linie. – JoshJordan

+0

Ich würde wirklich gerne die Klassen A und B richtig getrennt haben. Deshalb habe ich überlegt, den Update-Code überhaupt in eine separate Klasse zu stellen. – jpfollenius

+0

Richtige Trennung wäre wahrscheinlich die obige Antwort, wo es eine Unterklasse einer generischen Sammlung gibt, die nach Pet getippt ist, die diese Funktionalität hinzufügt. – JoshJordan

Verwandte Themen