-1
0
私は、一般的な概念を記述するクラスと、その概念の差異を記述するサブクラスを持つ傾向があります。 たとえば、 Polygon
<|-\ {` Rectangle`、 `Triangle`など}。
ただし、これらの階層のさまざまな「表現」があることがよくあります。 たとえば、グラフィカルな表現(QPolygonなど)や物理的な表現(mass、centerOfMass)などを保持したい 私が持っている別の表現とは別に。
私の場合、純粋なデータオブジェクトの階層( Command
<|-\ {` WaitCommand`、 UnknownCommand`など)があり、各データクラスに一致するGUI表現があります(
WaitCommandPanel`、 UnknownCommandPanel
)。
私の問題は、データ表現を構築したら、データからGUIに_飛躍する必要があることです。
データオブジェクトのリストが与えられた場合、対応するGUI要素を構築できますが、2つの表現は分離したままにします。
Command`がGUI表現を返す機能(つまり、
Command getPanel() `)を持つことです。 データクラスに表現コードが含まれるようになったので、これは好きではありません。
もう1つの解決策(とりあえず採用しました)は、ルックアップを行うことです。 つまり、GUIの起動時に、 `Command`のリスト(一般化)が与えられると、関数はその特殊化された型に基づいて作成するオブジェクトを決定します。 私もこれが好きではありません。
助言がありますか?
2 Answer
0
私見、どのデータクラスもレンダリングクラスも、特定のデータオブジェクトにどのレンダラーを使用するかを決定する責任はありません。 私はあなたの2番目のオプションを好みます。 通常、データ型をレンダラークラスにマップするマップを使用します。 また、このようなマッピングはコンテキスト固有であることに注意してください(Webレンダリングは、デストップアプリまたはフィットネスコンテキストとは異なるレンダラーを使用します)。
このようなマッピングは、たとえば属性(.Net)または命名規則(Lua)を使用して、自動的に構築できます。 または、外部XML-configファイルを使用します。
要約:誰かがその決定を下す必要があり、SRPによると、レンダラーもデータオブジェクトもその責任を負わないものとします。 そのようなロジックは、アプリケーションコンテキスト固有であり、そのようなものとして、それらの両方のアクター(つまり、 レンダラーとデータ)。
0
Inversion of Control(IoC)コンテナーを使用してクラスを構築することを検討することもできます。
各クラスには、その関連クラスのインターフェースが含まれます。 その後、IoCコンテナは、構成方法に応じて、そのクラスの実装をオブジェクトに挿入します。