3 Stimmen

Sollte ich eine Elternklasse einführen, nur um ein Datenmitglied zu halten?

Ich entwerfe eine Reihe von kleinen C++-Klassen, die alle eine einzelne Schnittstelle implementieren. Nennen wir die Schnittstelle IHandler. Sie hat nur eine Methode.

Es gibt eine Menge von Handlern, einen für jeden Typ in unserem Bereich. Nennen wir sie FooHandler, BarHandler usw. Es gibt auch einen PassiveHandler, der nichts tut (dies wird für Bereichsobjekte verwendet, die nicht behandelt werden müssen).

Also könnte unsere Hierarchie so schön und flach aussehen:

IHandler
|-PassiveHandler
|-FooHandler
|-BarHandler
| (...)
|-BazHandler

Allerdings benötigen alle Handler ein Datenmitglied, nennen wir es domainObject, also dachte ich daran, eine gemeinsame Oberklasse Handler zu extrahieren, die nur dieses Objekt enthält.

Außerdem benötigen alle Handler außer PassiveHandler ein zweites Datenmitglied, nennen wir es infoObject, also dachte ich daran, eine weitere gemeinsame Oberklasse ActiveHandler zu extrahieren, um dieses Objekt zu halten. Jetzt ist die Hierarchie viel tiefer, aber wir haben einige Duplikate entfernt.

IHandler
|-Handler
| |-PassiveHandler
| |-ActiveHandler
|   |-FooHandler
|   |-BarHandler
|   | (...)
|   |-BazHandler

Würden Sie sich für das flache Design entscheiden, in dem die Deklaration des domainObject-Mitglieds in allen Klassen dupliziert wird und die Deklaration des infoObject in den meisten Fällen? Oder würden Sie die kompliziertere Hierarchie bevorzugen, in der Duplikate entfernt werden? Ist es das wert, nur für diese Datenmitglieder?

3voto

GolezTrol Punkte 111587

Ich würde die zweite, hierarchischere Lösung wählen. Nicht nur wegen des Datenelements, sondern auch wegen Ihrer Bemerkung: "Dies wird für Domänenobjekte verwendet, die nicht behandelt werden müssen". Klingt eher wie ein Nul-Handler, der überhaupt nichts tut. Scheint eine gute Idee zu sein, ihn aus dem Baum zu ziehen, da Sie wahrscheinlich auch andere Funktionen einführen werden, die nur auf 'aktive Handler' angewendet werden.

1voto

Eli Iser Punkte 2748

Wie wäre es, anstelle eines reinen Interfaces eine abstrakte Klasse als Basistyp zu verwenden? Auf diese Weise können Sie sowohl einen gemeinsamen Vorfahren haben als auch Ihr domainObject in allen Basisklassen gemeinsam haben.

In meiner Erfahrung kann reines OO nie erreicht werden, wenn es in der Entwicklung verwendet wird. Es müssen immer weniger als perfekte Lösungen vorhanden sein, aber ein Fall wie dieser, bei dem Sie die Vererbungshierarchie vereinfachen, ist ein gutes Beispiel dafür, wann man die Regeln biegen sollte.

0voto

Angel O'Sphere Punkte 2565

Nun, insgesamt sind 4 Ebenen für Ihre Hierarchie nicht sehr tief ;D

Als mögliche andere Lösung könnten Sie jedoch vielleicht 2 Template-Klassen für ActiveHandler und PassiveHandler erstellen, die jeweils nur die Handler-Methode von IHandler erben und den Template-Parameter verwenden, um die Daten zu speichern, die Sie speichern wollen.

Ich musste einmal etwas Ähnliches machen und am Ende war es sehr leistungsfähig, da ich irgendwo ein Array solcher Handler hatte. Alle wurden also am gleichen Ort instanziiert und es war sehr elegant, einen neuen Handler hinzuzufügen, der eine Variation eines bereits vorhandenen war, indem ich eine neue Hilfsklasse schrieb, die als Template-Argument verwendet wurde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X