3

ユーザーとエリアの 2 つのデータ セットを扱うアプリケーションを設計しています。データは、サードパーティによって作成されたファイルから読み取られます。User クラスと Area クラスがあり、データは Users 配列と Areas 配列 (または使用するテクノロジに応じて、他の適切なメモリ構造) に読み込まれます。

両方のクラスには、ファイルから読み取られる一意の ID メンバーがあり、User クラスにはエリア ID の配列が含まれており、1 人のユーザーが多くのエリアに関連付けられている関係を提供します。

要件は非常に単純です。

  • ユーザー一覧
  • エリア一覧
  • 指定エリア利用者一覧
  • 特定利用者エリア一覧

私が最初に考えたのは、データを 2 つの配列に残しておき、要件ごとに、必要に応じて一方または両方の配列に問い合わせる別の方法を用意することでした。これは簡単に実装できますが、必ずしも最善の方法であるとは確信していません。

次に、User クラスに「Get Areas」メソッドを配置し、Area クラスに「Get Users」メンバーを配置することを考えました。これは、たとえば、Area オブジェクトを持っている段階にある場合に便利です。プロパティによるユーザーですが、Area クラスの「Get Users」メソッドは、Users 配列をどのように認識し、アクセスできるのでしょうか。

私はこれまで何度もこの問題を抱えてきましたが、決定的な解決策を思い付くことはありませんでした。多分私はそれを実際よりも複雑にしています。この種のデザインに役立つヒント、URL、または書籍を提供してくれる人はいますか?

更新: 時間を割いてヒントを残していただき、ありがとうございます。コメントをお待ちしております。

この問題の根本は多対多の関係にあることに同意します。それがリレーショナルデータベースでどのようにモデル化されるかを理解しています。それは非常に簡単です。

私が受け取るデータは第三者からのバイナリ ファイルの形式であるため、これらの構造を制御することはできませんが、読み込むときに最適な方法で保存できます。穴がありますが、それを読み取ってデータベースに保存すると、プログラムはデータベースにクエリを実行して結果を取得する必要があると思いました。大量のデータではないので、メモリ構造に格納することで必要なものを取り出すことができると考えました。

4

7 に答える 7

7

これは実際には多対多の関係です

User <<--->> Area

User、Area、UserArea の 3 つのオブジェクトに分割します。

User: Id, name, etc.
Area: Id, name, etc.
UserArea: UserId, AreaId
于 2008-09-30T15:58:55.990 に答える
3

非常に基本的ですが、アイデアは次のとおりです。

struct/class Membership
{
   int MemberID;
   int userID;
   int areaID;
}

このクラスは、「ユーザーがエリアに属する」メンバーシップの概念を実装します。コレクション内のメンバーシップごとにこれらのいずれかを貼り付け、要件を満たすサブセットについてそのコレクションをクエリします。

編集:別のオプション

各メンバーにエリアのリストを格納し、各エリアにメンバーのリストを格納できます。

エリア:

public bool addMember(Member m)
{
   if (/*eligibility Requirements*/)
   {
      memberList.add(m);
      m.addArea(this);
      return true;
   }
   return false;
}

Member での同様の実装 (コールバックなし)

これの利点は、反復子を返してエリアをウォークスルーし、メンバーを見つけるのが非常に簡単であることです (逆もまた同様です)。

欠点は、非常に密結合であるため、将来的に問題が発生する可能性があることです。

最初の実装の方が LINQ に適していると思います。

于 2008-09-30T16:03:26.917 に答える
2

エリアは複数のユーザーに属していますか? はいの場合、技術的には多対多の関係です。データをリレーショナル データベースに変換する場合は、すべての関係を含むテーブルを作成します。配列を操作したい場合は、3 つ目の配列を作成できます。または、実際にオブジェクト指向の方法でこれを行いたい場合は、両方のクラスに関連する領域/ユーザーへのポインターの配列が必要です。

于 2008-09-30T15:59:19.033 に答える
1

申し訳ありませんが、これはオブジェクト指向の問題ではありません。関係性の問題です。したがって、カーディナリティ (多対多) へのすべての参照。これはリレーショナル データベース モデリングの 101 です。Gavin を批判するつもりはありません。新しい視点を指摘するだけです。

それで、私の暴言は何が良いのですか。答えは、リレーショナル データ ストアと統合することであって、それをオブジェクト指向のパラダイムに押し込むことではありません。これは古典的な四角いペグ、丸い穴の問題です。

于 2008-09-30T16:57:01.407 に答える
0

.NET が関係している場合、リレーションで DataTables を使用しないのはなぜですか? .NET が関係している場合は、Generics も調べる必要があるかもしれません。

于 2008-09-30T15:57:16.417 に答える
0

1 つのオプションは、最後の 2 つの要件のそれぞれに辞書を使用することです。つまり、 aDictionary<Area, List<User>>と aDictionary<User, List<Area>>です。データを読み込んで、これらを構築できます。これら 2 つのディクショナリをクラスでラップし、要件ごとにそのクラスのメソッドを作成することもできます。これにより、辞書が同期していることを確認できます。

于 2008-09-30T16:00:44.100 に答える
0

ダクラコットに同意

DevExpress XPOも見てください

于 2008-09-30T19:51:58.630 に答える