一般的なデータをより具体的な形式で保存するためのAPI設計は何ですか?


8

私が取り組んでいるプロジェクトでは、ウィジェットに関するメッセージをメッセージキューを介して送信し、XMLとしてキューにシリアル化します。XMLスキーマには、ウィジェットタイプ、コマンド名、宛先など、これらのウィジェットメッセージのすべてのタイプに共通のプロパティのタグが含まれています。また、任意のサイズのキーと値のペアのリストを含めて、特定のタイプのウィジェットメッセージにのみ関連するプロパティを保存することもできます。WidgetMessageクラスは、このデータをカプセル化し、WidgetMessageXmlWriterそしてWidgetMessageXmlReaderクラスは、XMLにしてから直列化を提供します。

特定のメッセージをカプセル化するクラスをいくつか作成しました。たとえばFooPlaySoundMessage、「Foo」ウィジェットやBarSetLightPatternMessage「Bar」ウィジェットなどです。これらはそれぞれ、クラスとの間で変換するためのToWidgetMessageインスタンスメソッドとFromWidgetMessage静的メソッドを持っていますWidgetMessage。メッセージの各ファミリは、そのウィジェットタイプの抽象クラスから継承されます。たとえばFooMessage、and BarMessageWidgetMessageMappingクラスから継承されます。これは、変換のためにサブクラスによって使用される共通のメッセージプロパティと保護されたメソッドを格納します。これらのクラスはWidgetMessage、キーと値のコレクションプロパティと関連するメソッドを継承したくないため、継承しません。単純なキャストではなく変換が必要です。

私はAPIの単純さを気に入っています(例:)が、FooPlaySoundMessage msg = FooPlaySoundMessage.fromWidgetMessage(widgetMessage)機能を共有するために基本クラスで保護されたメソッドを使用し、それを公開するために静的メソッドを使用しなければならないという事実は、別個のクラスまたは2つが関与する必要があるのか​​と疑問に思いますここ(WidgetMessageXmlWriterおよびと同様WidgetMessageXmlReader)。一方、OOPのポイントの一部は、データとメソッドをグループ化して、「ダムデータオブジェクト」を回避することだと思いました。

それで、データオブジェクトに変換メソッドを追加することによって正しいアイデアを持っていますか、それともその機能を別のクラスに抽出する必要がありますか?

更新:

上記の現在の設計の試みのすべての詳細において、私が解決しようとしている問題を十分に明確に説明していなかったと思います。

要約すると、強く型付けされたプロパティと、他のカスタムデータを格納するためのキーと値のペアのコレクションを持つ「ジェネリック」DTOクラスがあります。キーと値のペアが厳密に型指定されたプロパティに置き換えられていることを除いて、汎用DTOと同じデータをすべて格納するカスタムデータのセットごとに、いくつかの特殊なDTOクラスが必要です。これら2つのタイプのDTO間で変換するための最良の設計は何ですか?


デコレータパターンのように聞こえますか?- en.wikipedia.org/wiki/Decorator_pattern
STEVO

第二に。大丈夫だと思います。
スチュ

1
また、脇ランダムのように:それはあなたのために働く場合、それがでます。
スチュ

メッセージであるだけでなく、メッセージは何をしますか?
Piotr Gwiazda 2013年

これらのクラスの唯一の責任は、WidgetMessageクラスとの間で変換されることです。WidgetMessagesを使用してウィジェットと通信する「Widget Comms」プロジェクトがあります。これらのWidgetMessageMappingクラスにこのような通信機能を追加していません。ウィジェットの通信方法を知ることができるのはWidget Commsプロジェクトだけですが、メッセージはアプリケーションのさまざまな部分で作成できるためです。WidgetMessageMappingsは、メッセージの解析と作成コードがアプリケーションのレイヤー全体に広がらないようにするためだけにあります。
ロバートジョンソン

回答:


1

FooPlaySoundMessageがサウンドの再生方法と、自分自身をメッセージキュー形式にマップする方法を知っている場合、クラスには複数の責任があると言えます。実際のサウンド再生を別のクラスに直接委任する場合、FooPlaySoundMessageは基本的にデータ転送オブジェクトです。その場合、共有基本クラスに共通のマッピングを配置するのは問題ないようです。

私はおそらくそれを分離するでしょう。通常、データ転送オブジェクトにはコードがほとんどないか、まったくないので、FooPlaySoundMessageを1つのコードと見なすことができます。

ある時点で、同じデータを他の方法または他の形式(jsonか)で送信する必要がある場合があります。今のところそれをYAGNIして分離することができます。

おそらく、共通部分を解析してメッセージタイプを検出し、特定のパーサー(FooPlaySoundXmlMessageParserなど)に委任するメッセージハンドラークラスを作成します。疑わしい場合は、継承よりも構成を優先します。


XMLとの間で変換されるのはWidgetMessageのみです-専用のDTOはWidgetMessagesとの間でのみ変換されます。私の現在の設計では、キューに入れられるのはWidgetMessageだけであるにもかかわらず、それらはまだ「メッセージ」と呼ばれているので、私はあなたの混乱を理解できます。私が解決しようとしている問題をよりよく説明するために質問を更新しました。
ロバートジョンソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.