2009-08-06 7 views
15

私は、同じ概念を表す外部ソース(変更不可能)からのいくつかの異なるクラスを持っています。たとえば、Addressです。私が持っているcom.namespace2.Addressnamespace3.com.CoolAddress(フィールドhouse_numstreetcity付き)、(フィールドhsc付き)、(フィールドhouseNumstreetcity付き)com.namespace1.Addressオブジェクト変換パターン

私が使用する特定のWebサービスでは、特定のAddressオブジェクトタイプが必要なので、namespace3.com.CoolAddressというcom.namespace1.Addressを作成する必要があります。フィールドはマップするのは簡単ですが、私はそれを行う方法のパターンを探しています。

インスタンスオブジェクトAddressConverterは、状態がない(動作のみ)ため、意味がありません。クラスには動作しかないため、ユーティリティクラスの静的メソッドになってしまいます。長期的には、いつでも私は新しいオブジェクトをお互いにマップする必要があります。メソッドを追加/変更/削除する場所が1つあります。どのように変わっていくのかは分かりますが、コードがどこにあるのかを知り、必要なときにマッピングを変更することができます。

思考?

答えて

8

私はあなたが探していると思います。ファクトリパターンは、関連するいくつかのクラスのうちの1つをインスタンス化する必要がある場合に使用され、開発者ではなく工場によって決定されます。

はあなたがClassOne.toClassTwo()、ClassOne.toClassThree()を実行するのではなく、一つの場所にこのすべてのビジネスロジックを維持しようとするのは正しいですhttp://en.wikipedia.org/wiki/Factory_method_pattern

、...を参照してください

最も柔軟に私はこれを実装すると思いますが(これまででは最も簡単ではありません)、基本的な共通メソッドを持つ単純なクラスから開始し、ハンドラをHashtableまたは他のコンテナに追加することです。そうすれば、可能なすべての機能の組み合わせを具体的に実装する必要はありません。

もちろん、それぞれの可能なアドレスバリアントに対して具体的な実装を行う方が早いでしょうが、重複したコードがかなりあり、新しいアドレスクラスタイプを追加するのは少し難しくなります。

+1

+1ハンドラテーブルの提案 - 私はかなりそのパターンを使用します。 しかし、 'Hashtable'ではなく' Map'を使用してください。 :) –

+1

工場は創造的なパターンです。問題は、新しいオブジェクトを作成するのではなく、既存のオブジェクトを管理することです。 – SomeWittyUsername

+0

@icepack私は、あるオブジェクトを別のオブジェクトにマッピングするときに、OPが新しいインスタンスを作成したいと思うと思います。私は、「いくつかの異なるオブジェクトが外部ソースから来ている(変更不可能)」という文で、オブジェクトのクラスが変更不可能であることを意味すると思います。私はこれを次の文章に基づいています。 "** namespace3.com.CoolAddressを指定して** com.namespace1.Addressを作成する必要があります。"私は文章を編集します。 –

1

あなたはクラス自体を変更することはできませんので、私は、各方向にAdapterパターンの実装をお勧めしたいです。あなたが言ったように、アダプター・メソッド自体は静的でもかまいませんが、ロジックがすべて1つの場所に収まるように、両方向を1つのクラスにグループ化できます。あなたは関係なく、あなたがそれを呼んでいるものと同じタスクを実行しないことになるだろうか、コードを配置している一日の終わりに

。私は両方の方向が同じファイルに存在することをお勧めします。両方の方向が変更されると更新が必要になることがよくあります。

0

あなたが常に同じクラスに変換する場合、私はあなただけ異なるクラスのカップルを扱っている場合は特に、工場などの心配それをシンプルに保つと、そのクラス内のすべてのあなたの変換コードを入れていないでしょう。なぜ、これらのものには常に複雑なパターンが必要ですか?

public class A { 

    ... 

    public static A convertB(B b) { 

    ... 

    } 
} 
+0

元のオブジェクトは変更不可能であるとの質問があります。 –

+0

@BrianYarger彼は、クラス定義が列挙可能であることを意味していると思います。私はそれを次の文章に基づいています。「** namespace3.com.CoolAddressを指定して** com.namespace1.Addressを作成する必要があります。 –

+0

変換ロジックをクラスに入れることで、コードは密接に結合されました。デザインパターンの1つのポイントは、互いに独立して存在するクラスの結合を避けることです。私はこの答えのアドバイスに対して助言したいと思います。 – Chaos

0

出力するクラスはfinalですか?そうでない場合は、それらをサブクラス化して適切なAdaptersを作成することができます。さもなければ、dj_segfaultがハンドラのテーブルを持つファクトリを提案します。

または、お待ちください - 話す必要のあるウェブサービスですか?もしそうなら、そのデータ型の実装が、入力データ型をラップするアダプタ、またはあなた自身の何らかの中間オブジェクトになることはできません。

関連する問題