32

私のアプリケーションでは、さまざまな種類のオブジェクトをインスタンス化する必要があります。各タイプにはいくつかのフィールドが含まれており、含まれているタイプに追加する必要があります。どうすればエレガントな方法でこれを行うことができますか?

現在の初期化手順は次のようになります。

public void testRequest() {

        //All these below used classes are generated classes from xsd schema file.

        CheckRequest checkRequest = new CheckRequest();

        Offers offers = new Offers();
        Offer offer = new Offer();
        HotelOnly hotelOnly = new HotelOnly();
        Hotel hotel = new Hotel();
        Hotels hotels = new Hotels();
        Touroperator touroperator = new Touroperator();
        Provider provider = new Provider();
        Rooms rooms = new Rooms();
        Room room = new Room();
        PersonAssignments personAssignments = new PersonAssignments();
        PersonAssignment personAssignment = new PersonAssignment(); 
        Persons persons = new Persons();
        Person person = new Person();
        Amounts amounts = new Amounts();

        offers.getOffer().add(offer);
        offer.setHotelOnly(hotelOnly);

        room.setRoomCode("roomcode");
        rooms.getRoom().add(room);

        hotels.getHotel().add(hotel);
        hotel.setRooms(rooms);

        hotelOnly.setHotels(hotels);

        checkRequest.setOffers(offers);

        // ...and so on and so on
    } 

このようなコードを書くのは本当に避けたいです。なぜなら、各オブジェクトを個別にインスタンス化してから、複数行のコードで各フィールドを初期化する必要があるためです (たとえば、new Offer()and thensetHotelOnly(hotelOnly)と thenを呼び出す必要があるadd(offer))。

私が持っているものの代わりに、どのエレガントな方法を使用できますか? 使える「Factories」はありますか?このようなコードを書くことを避けるための参照/例はありますか?

きれいなコードを実装することに本当に興味があります。


環境:

RestClient投稿リクエストをWebサービスに送信するためのアプリケーションを開発しています。

API はxsd schemaファイルとして表され、すべてのオブジェクトをJAXB

リクエストを送信する前に、相互に依存関係があるため、多くのオブジェクトをインスタンス化する必要があります。 (オファーにはホテルがあり、ホテルには部屋があり、部屋には人がいます...そして、これらのクラスは生成されたものです)

ご協力いただきありがとうございます。

4

6 に答える 6

3

いくつかの良い答えがすでにここに与えられています!

追加で思いついたのはDomain Driven Designです。EntityValue ObjectAggregateFactoryなどを使用して、ビルディング ブロックパーツを特定します。

Domain Driven Design - Quickly (pdf)にすばらしい紹介があります。

于 2015-10-21T08:23:08.647 に答える
1

理想的には、オブジェクトはその依存関係のインスタンス化について気にするべきではありません。それは、それらに対して行うべきことだけを心配する必要があります。依存性注入フレームワークを検討したことがありますか? Spring またはGoogle の Juiceは非常に汎用性が高く、フットプリントが小さいです。

アイデアは単純です。依存関係を宣言し、フレームワークに依存関係をいつ/どのように/どこで作成するかを決定させ、それをクラスに「注入」します。

フレームワークを使用したくない場合は、それらからデザイン ノートを取得し、それらのデザイン パターンをエミュレートして、ユース ケースに合わせて微調整することができます。

また、コレクションを使い分けることで、ある程度は簡素化できます。たとえばOffers、のコレクションを保存する以外に、どのような追加機能がありOfferますか? あなたの制約が何であるかはわかりませんが、その部分をもう少しきれいにすることができれば、オブジェクトをインスタンス化するすべての場所で大きな利益が得られます.

于 2015-10-22T10:45:31.563 に答える
1

コメントで言及されていたので、この回答を提供します。これは、このデザインパターンの列挙の一部でもあるはずです。


Null オブジェクトの設計パターン

意図

Null オブジェクトの目的は、適切なデフォルトの何もしない動作を提供する代用可能な代替手段を提供することによって、オブジェクトの不在をカプセル化することです。要するに「無から無」のデザイン。

次の場合に Null オブジェクト パターンを使用します。

  • オブジェクトには共同作業者が必要です。Null Object パターンは、このコラボレーションを導入しません。既存のコラボレーションを利用します。
  • 一部のコラボレーター インスタンスは何もしないでください
  • クライアントから null の処理を​​抽象化したい

「Null Object」デザインパターンの全文はこちら

于 2015-10-21T12:31:07.470 に答える
0

Dozer フレームワークは、ws オブジェクトから dto に値をコピーする優れた方法を提供します。別のを次に示します。さらに、ゲッター/セッターの名前が両方のクラスで同じである場合、カスタム コンバーターは必要ありません。

于 2015-10-22T14:54:01.727 に答える