Nehmen wir an, wir haben ein Objekt, das die Konfiguration eines Geräts darstellt. Zur Veranschaulichung: ein Temperaturregler (TempController). Er enthält eine Eigenschaft, die Sollwerttemperatur.
Ich muss diese Konfiguration in einer Datei zur Verwendung in einem anderen Gerät speichern. Das Dateiformat (FormatA) ist in Stein gemeißelt. Ich möchte nicht, dass das TempController-Objekt etwas über das Dateiformat erfährt... es ist für dieses Objekt einfach nicht relevant. Also erstelle ich ein weiteres Objekt, "FormatAExporter", das den TempController in die gewünschte Ausgabe umwandelt.
Ein Jahr später machen wir einen neuen Temperaturregler, nennen wir ihn "AdvancedTempController", der nicht nur einen Sollwert, sondern auch eine Ratenregelung hat, also ein oder zwei Eigenschaften mehr. Es wird auch ein neues Dateiformat erfunden, um diese Eigenschaften zu speichern... nennen wir es FormatB.
Beide Dateiformate sind in der Lage, beide Geräte zu repräsentieren (gehen Sie davon aus, dass AdvancedTempController vernünftige Standardeinstellungen hat, wenn es keine Einstellungen hat).
Hier ist also das Problem: Wie kann FormatBExporter beide Fälle behandeln, ohne 'isa' oder eine andere "schummelnde" Methode zu verwenden, um herauszufinden, welche Art von Objekt ich habe?
Mein erster Gedanke ist, in jedem Temperaturregler eine Methode zu haben, die einen Kundenexporter für diese Klasse bereitstellen kann, z. B. TempController.getExporter() und AdvancedTempController.getExporter(). Dadurch werden mehrere Dateiformate nicht gut unterstützt.
Der einzige andere Ansatz, der mir in den Sinn kommt, ist eine Methode in jedem Temperaturregler, die eine Liste von Eigenschaften und deren Werte zurückgibt, und dann kann der Formatierer entscheiden, wie diese ausgegeben werden sollen. Es würde funktionieren, aber das scheint verworren.
UPDATE: Bei näherer Betrachtung stellt sich heraus, dass der letztgenannte Ansatz nicht wirklich gut funktioniert. Wenn alle Ihre Typen sind einfach es könnte, aber wenn Ihre Eigenschaften sind Objekte, dann Sie am Ende nur schieben das Problem eine Ebene nach unten ... Sie sind gezwungen, ein Paar von String, Objekt-Werte zurückgeben, und der Exporteur müssen wissen, was die Objekte tatsächlich sind, um sie zu nutzen. Damit verschiebt sich das Problem nur auf eine weitere Ebene.
Gibt es irgendwelche Vorschläge, wie ich das flexibel halten kann?