2016-10-27 6 views
1

以下のような擬似コードを実行しようとしています。これはネストされたクラスを使用するための規則やベストプラクティスに反しますか?外部クラス内に複数のリストを保持する静的ネストされたCass

public class Foo{ 
    private list1, list2; 

    Bar bar = new Bar(list1, list2); 
    // use bar.listA, bar.listB, bar.listC, 
    //bar.listD, bar.listE 

    private static class Bar{ 
    private list1, list2; 
    private listA, listB, listC, listD, listE; 

    private Bar(list1, list2) { 
     this.list1 = list1; 
     this.list2 = list2; 
     //logic to split list1 and list2 into 5 lists: listA, listB, listC, listD, listE. 
     //initialize the 5 lists 
    } 
    } 
} 

私はそれが論理的にのみそれがカプセル化 を高める

  • 1つの 代わりに使用されるクラスをグループ化する方法であるOracleのor the reasons mentioned by Oracle:

    • で述べた理由のために、ネストされたクラスを使用しています
    • それはより読みやすくなり、維持可能なコード
    • そして理由mentioned here

    外部クラスメンバーに直接アクセスする必要がないため、ネストされたクラスを静的にしています。

    :より具体的には、ネストされたクラスの代わりにENUMを使用する必要がありますか?ネストされたクラスの5つのリストに対してgetters/setterを使うべきですか?ネストされたクラスのコンストラクタは分割ロジックを配置する正しい場所ですか?ネストされたクラスのプライベートメンバーを外部クラスで直接参照することはできますか?

  • +0

    このような抽象的なデザインについて考えるのは難しいです。あなたが解決しようとしている実際の世界の問題は何ですか? – plalx

    +0

    2つのリストが外側のインスタンスに渡される場合、私はちょうどそれらを5つのリストに分割し、外側のインスタンス(のみ)にそれらのハンドルを持っているエレガントな方法が必要です。その単なるデータ変換プロセスです。 – Gadam

    +0

    それだけであれば、外部クラスに機能的なソリューションを実装しています。ネストされたクラスやOO設計のどのような形式でも気にしません。それはあなたがそれらのリストに特別な振る舞いをしない限りです。分割ロジックはどのように使用されますか?いくつかの動作は一部のリストにのみ適用されますか? – plalx

    答えて

    1

    list1とlist2には 'events'が含まれています。そして、イベントの「タイプ」に基づいて、私は5つのリストにそれらを分割

    さて、あなたはその副作用のためのコンストラクタを使用すべきではない一般的な経験則として。

    したがって、私はおそらくの範囲内でgroupEventsの機能を選択します。グループ化ロジックがかなり複雑な場合、GroupedEventsインスタンスまたはMap<EventType, List<Event>>などを返すEventGrouperステートレスサービスを持つことができます。

    など。

    public class Foo { 
        private GroupedEvents groupedEvents; 
    
        public Foo(List<Event> list1, List<Event> list2) { 
         this.groupedEvents = groupEvents(list1, list2); 
        } 
    
        private GroupedEvents groupEvents(List<Event> list1, List<Event> list2) { 
         Map<EventType, List<Event>> eventsByType = //perform grouping 
         return new GroupedEvents(eventsByType); 
        } 
    } 
    

    ロジックはあなたがネストされたかどうかのいずれかであるステートレスEventGrouperクラスにgroupEvents機能を移動することができ、十分に複雑である場合。デザインの重要な側面は、EventGrouperがそのコンストラクタ内でグループ化を実行してはならないということです。

    今、私はあなたが言っていることを聞いています。いいえ、Fooは今ではコンストラクタでグループ化していますか?私たちはチェーンの問題をより強く押し込んでいませんか?さて、Fooの構築中にグループ化が行われるのは間違いですが、Fooオブジェクトのクライアントは、グループ化の副作用についてのみFooインスタンスをインスタンス化していません(できればそうではありません)。グループ化は、Fooの初期化プロセスの一部として実装の詳細になり、クライアントはそのようなグループ化が発生したことさえ知りません。

    +0

    'Map >'の代わりに 'GroupedEvents'を使用した場合、5つのプライベート・リストがメンバーとして正しいでしょうか?また、Foo内でのみ使用されるため、ネストされた静的クラスとして作成できますか? – Gadam

    +0

    @Gadam 5種類のイベントしか持たない場合は5つのリストがあるかもしれませんが、特定のタイプのイベントを内部的に取得するために 'eventsOfType(EventType type)'のような関数を持っていれば、それらをマップに格納する。はい、あなたが望むなら、クラスは入れ子にすることができますが、それをユニットでテストできるようにpublicに入れ子にすることもできます。 – plalx

    関連する問題