2016-04-07 7 views
2

Ich benutze C++. Ich habe verschiedene Klassen, die im Grunde Strategien sind, um das Gleiche zu tun. Wir haben die Basisklasse Strategy, von der erweiterte Strategien erben. Jede direkte oder indirekte Unterklasse von Strategy hat eine Methode run(). Eine fortgeschrittene Strategie wird oft innerhalb ihrer Methode run() die Methode run() ihres Elternteils aufrufen und dann einige Pre- oder Post-Processing hinzufügen. Es könnte auch viele Male innerhalb einer Schleife aufgerufen werden.Strategien mit gängigen Methoden und Datenstruktur

Jetzt werden alle diese Strategien auf die gleiche DataStruct angewendet. In der Tat ist das einzigartige DataStruct für jede Strategie gut definiert. Innerhalb jeder Strategie kann jedoch die Bedeutung von DataStruct nicht dieselbe sein.

Lassen Sie mich Ihnen ein einfaches Beispiel: Stellen Sie sich vor StrategyA hat einige Optimierung über einen Satz A, während StrategyAUnionB Optimierung funktioniert über die Menge A Union B. DataStruct.optimalValue für beide eine Bedeutung hat aber die Bedeutung ist nicht das gleiche.

Die einfache Lösung, die ich jetzt sehe, ist ein Attribut dataStruct vom Typ DataStruct in der Basisklasse zu setzen, und wenn eine Strategie die run() von einer übergeordneten Klasse nennt es eine Kopie dataStruct machen muss, dass es dataStruct zu aktualisieren verwenden nach dem Aufruf an run() der Elternklasse.

Ich sehe deutlich, dass diese Lösung nicht sehr sauber ist und ich würde dankbar sein, wenn ich einen Rat von erfahreneren Programmierern bekommen kann.

Antwort

0

Da niemand antwortet, werde ich es versuchen.

Ich würde empfehlen, die Strategie von der Datenstruktur zu trennen. Jedes Mal, wenn Sie eine run() eines bestimmten spezifischen Strategy aufrufen, übergeben Sie ihr ein Objekt DataStruct (als Referenz), um es zu verarbeiten und zu aktualisieren. Und natürlich wird sich das durch eure Klassenhierarchie hindurch erstrecken. Damit wird die Referenz bis zur Basisklasse weitergegeben und anschließend von der Startfunktion nachbearbeitet.

Dies würde Unklarheiten bezüglich der Bedeutung von Feldern in der Datenstruktur vermeiden, da Sie sicher sein müssen, was Sie meinen, wenn Sie es an die Funktion übergeben.

+0

Ich glaube nicht, dass diese Lösung funktioniert, weil jeder das gleiche DataStruct-Objekt modifizieren wird ... Eine Trennung zwischen Strategie und Datastruct könnte jedoch eine gute Idee sein. –

Verwandte Themen