6

これはより概念的な質問です。私は自分がやろうとしていることを行う方法を知っています。それが正しいことかどうかは疑問ですが。

実生活で少し入れ子になっているものを表現しようとしています。一連のアイテムで実行するアクティビティを指定するドキュメントです。1 つの文書が複数の項目をカバーし、各項目が複数のアクティビティを持つ場合があります。

したがって、階層は Document -> Item -> Activity になります。

私の現在の考えでは、これを 1 つのトップ レベル クラス Document で表し、このクラスには内部クラス ItemProgram が含まれており、このクラス自体に内部クラス Activity が含まれています。はい、それは 2 レベルの入れ子です。

public class Document {

   // Properties of the document itself

   private Map<Item, ItemProgram> itemPrograms; // Map of item programs

   public class ItemProgram {

      // Properties of the item program itself

      private List<Activity> activities; // List of activities

      public class Activity {
         // Properties of the activity
      }
   }
}

内部クラスは公開する必要がありますが、コンストラクターを非公開にして、外部クラスにメソッドを追加することによってのみ作成されるようにしています。ご覧のとおり、コレクションのタイプを使用してインスタンスを保存します。

これはこれについて正しい方法ですか?二重入れ子?

内部クラスのすべてのインスタンスへの参照を格納するために、外部クラスでコレクションを使用することは適切ですか?

4

2 に答える 2

3

あなたがこの構文を使用したくなる理由はわかりますが、私が選択するものではありません (もちろん、絶対的な正しい/間違った答えはありません)。考慮すべき点がいくつかあります。

内部クラスのインスタンスは、それらを囲んでいるオブジェクトの内部状態にアクセスできますが、これはおそらくあなたの例では必要なく、クラスを非常に密結合にします。

このような二重の入れ子は「異常」であり、コードを読む他の人を混乱させる可能性があります。

将来、システムの設計が変更され、アイテムとは独立してアクティビティを作成できるようになった場合 (たとえば)、コードで大規模な操作を実行する必要があります。

内部クラスのインスタンスは、親オブジェクトへの暗黙的な参照を使用して作成されます。実際にこの追加の参照が必要ですか (親は、プライベート コレクションを介して子について既に知っています。ある程度の複雑さ)?

この設計がコードのテスト容易性にどのように影響するか考えたことがありますか? Activity クラスを単体テストしたい場合はどうすればよいでしょうか? テストの失敗が、親クラスの 1 つではなく、Activity の問題を明確に示すような方法でこれを行うことができますか?

于 2012-10-09T07:58:54.693 に答える
1

この特定のアプローチは問題ありませんが、それぞれに 1 つのタイプがあります。 の複数のタイプまたは派生物が必要になった場合DocumentActivityまたはItemProgramよりスケーラブルにするために、このクラスを分割する必要がある可能性が高いことに注意してください (コメントで文書化してください)。パターン。

Document独自のロジックに加えて、インスタンスを作成するActivityロジックとインスタンスを作成するためのロジックが含まれている場合ItemProgram、SRP (Single Responsibility Principle) のガイダンスに反しています。この原則は、構成パターンを使用するのではなく、組み合わせを表すクラスを取得し始める場合に、スケールアウトの問題を防ぎ、クラスの爆発を防ぐのに役立ちます。

また、ネストされたクラスのクライアントが親(囲んでいる)クラスのみである場合は、ネストされたクラスは問題ないと言い、他の場所でそれらを使用している場合は分離します。

編集以上のことをすべて述べたので、クラスを別々のクラスとしてネストするよりもクラスをネストする利点はありません。少なくとも、開発しているシステムにプラスの影響を与える利点はありません。

  • 隠された複雑さ。他の開発者は、ファイルに 3 つのクラスが含まれていることを知っています。
  • プライベートへのアクセス、親はネストされたクラス変数にアクセスできますが、その逆も同様です。
于 2012-10-09T07:57:21.740 に答える