ハードウェアの構成を表すオブジェクトがあるとします。議論のために、温度コントローラ(TempController)。 1つのプロパティ、設定温度が含まれています。モデルとその表現を分離するオブジェクト指向の方法
他のデバイスで使用するために、この設定をファイルに保存する必要があります。ファイル形式(FormatA)は石で設定されています。私は、TempControllerオブジェクトにファイル形式について知りたがりません...そのオブジェクトには関係ありません。そこで私は別のオブジェクト "FormatAExporter"を作成し、TempControllerを望ましい出力に変換します。
1年後、私たちは新しい温度コントローラーを作りました。これは「AdvancedTempController」と呼ばせましょう。セットポイントだけでなく、1つまたは2つ以上のプロパティーを意味するレートコントロールも備えています。これらのプロパティを保存するために、新しいファイル形式も発明されています。それをFormatBとしましょう。
両方のファイル形式が両方のデバイスを表すことができます(設定が不足している場合、AdvancedTempControllerには適切なデフォルト値が設定されているものとします)。
ここに問題があります:私が持っているオブジェクトのタイプを理解するために 'isa'やその他の不正な方法を使用しないと、FormatBExporterはどのように両方のケースを処理できますか?
私の最初の本能は、TempController.getExporter()とAdvancedTempController.getExporter()のように、そのクラスの顧客エクスポータを提供できるメソッドを各温度コントローラに持たせることです。これは、複数のファイル形式をうまくサポートしません。
唯一の考え方は、各温度コントローラにプロパティとその値のリストを返すメソッドを持たせてから、フォーマッタがそれらの出力方法を決定できることです。それはうまくいくだろうが、それは畳み込まれているようだ。
更新:今後の作業では、後者のアプローチは実際にうまく機能しません。あなたのすべての型がシンプルな場合は、プロパティがオブジェクトの場合、レベルを下げて問題をプッシュするだけです...あなたはString、Object値のペアを返さなければならず、エクスポータは何を知る必要がありますオブジェクトは実際にそれらを利用することです。だから、問題を別のレベルにプッシュするだけです。
これをどのように柔軟に保つための提案はありますか?
を適用する場所だと思います共同作業者をモックする。 –
これは、私が計画していたよりも手の込んだ感じですが、私はそれが好きです。これは、リスト内のすべてのプロパティを返す柔軟性を提供しますが、インターフェイス全体で型情報を保持します。そして、それは確かにテスト容易性に役立ちます。 –