2016-10-29 14 views
2

長時間のリーダー/初めてのポスター。私はこれがひどい疑問であれば、私はJavaとソフトウェア開発に新しいので、私を許して!異なるオブジェクトタイプに基づいてJavaのリストを変更する場所

私は現在、メンテナンスしているアイテムオブジェクトのリストを持つItemsOrderManagerというクラスを持っています。それをItemsOrderと呼びます。このリストは、ItemsOrderManagerクラスが構築されたときに、正しい順序でいくつかのデフォルト項目でインスタンス化されます。

次に、イベントのHashMapを持つTimelineという別のクラスがあります。このイベントのDateTimeはHashMapのキーです(つまり、HashMap Date、Event)。イベントには、さまざまなことをしたり、互いに少し変わったりして同様のメソッドや属性を共有しているため、EventA、EventB、EventCなどのサブクラスがいくつかあります。

問題はItemsOrderManagerクラスがDateOnderイベントのタイムラインを処理する必要があることです。これらのイベントはItemsOrderリストの変更方法を決定します。これは、リスト内の特定の項目を見つけるようなことを行いますし、その後:いくつかの項目のプロパティ、または

  • 、その前に新しい項目を追加

    • 変更は、それの後に新しい項目を追加します。

    どのようなイベントの種類によって変化しますか?

    それはこのようになります:/

    public class ItemsOrderManager { 
    
        private List<Item> items = new ArrayList<Item>(); 
        private Timeline timeline; 
    
        Public ItemsOrderManager() { 
         initialiseItems(); //add items to the items list 
         initialiseTimeline(); //for simplicity i put this here to show the timeline gets initialised/we set the events in it and then sort the hashmap 
         processTimeline(); //again for simplicity just showing we need to then process the timeline which modifies the items list 
        } 
    } 
    

    だから私の質問は、私はItemsOrderManagerクラスのメソッドを使用してItemsOrderリストを操作する必要がある場合、または私はEventクラスにメソッドを利用するべきですサブクラスはパラメータとしてリストを取り込み、そこで動作しますか?または、これはこれを行う別の方法がありますか?ここで最高のデザインプラクティスは何ですか?

    だから、次のいずれか

    public void processTimeline() { 
        for (Event event : timeline.getEvents().values()) { 
         if (event instanceof EventA) { 
          //manipulate items list 
         } else if (event instanceof EventB) { 
          //manipulate items list in a different way 
         } else { 
          //manipulate items list in a different way altogether 
         } 
        } 
    } 
    

    または私はこれを行うべきである:

    public void processTimeline() { 
        for (Event event : timeline.getEvents().values()) { 
         //call something like event.applyEventToList(this.items); to modify the list or returned the modified list 
        } 
    } 
    

    か良い方法はありますか?その愚かな質問の場合は、事前にお詫び申し上げます。

  • +0

    私はアイテムタイプごとに "マネージャ"を作成し、対応するマネージャオブジェクトをMap ':' managerMap.get(event.class)から取得します。' –

    +0

    イベントハッシュマップのタイムスタンプ(秒/ミリ秒)をキーとして使用し、このキーセットを取得し、日付順にソートしてこのソート済みリストを使用してイベントリストにアクセスするのはどうですか? –

    答えて

    1

    いずれのソリューションも動作するので、いずれかを選択するのはあなた次第です。それは哲学的な質問や、開発者としてのあなたの原則に関するものです。

    たとえば、オブジェクト指向の愛好家は、Eventクラスがアイテムリストの操作方法を知っているエンティティであると言うかもしれないので、2番目のコードスニペットが選択肢になります。しかし、この場合、私は個人的にオーケストレーターのオブジェクトに処理を行う方が簡単だとわかります。そのため、最初のアプローチに行きます。

    ところで、あなたは

    for (Event event : timeline.getEvents().values()) 
    

    でイテレータが注文したイベントを提供していることを確認していますか?

    +0

    確かに!優秀な応答の仲間のおかげで! – StCicatriz

    関連する問題