「オブザーバー」タイプと「サブジェクト」タイプの2つのクライアントタイプがあります。それらは両方ともグループの階層に関連付けられています。
オブザーバーは、異なる階層全体で関連付けられているグループから(カレンダー)データを受信します。このデータは、データを収集しようとしているグループの「親」グループからのデータを組み合わせて計算されます(各グループは1つの親のみを持つことができます)。
サブジェクトは、関連付けられているグループにデータ(オブザーバーが受信するデータ)を作成できます。グループでデータが作成されると、グループのすべての「子供」もデータを持ち、データの特定の領域の独自のバージョンを作成できますが、作成された元のデータにリンクされます(私の特定の実装では、元のデータには期間と見出しが含まれますが、サブグループは、それぞれのグループに直接リンクされた受信者の残りのデータを指定します)。
ただし、サブジェクトがデータを作成するとき、影響を受けるすべてのオブザーバーがこれと競合するデータを持っているかどうかを確認する必要があります。つまり、理解できる限り、巨大な再帰関数を意味します。
したがって、これは、上下に移動できる階層を持たせる必要があるという事実に要約できると思いますし、いくつかの場所はそれらを全体として扱うことができます(基本的に再帰)。
また、私は単に機能するソリューションを目指しているわけではありません。比較的理解しやすく(少なくともアーキテクチャ的には)、将来的に追加機能を簡単に受信できる柔軟性を備えたソリューションを見つけたいと思っています。
この問題または同様の階層の問題を解決するための設計パターン、または実行すべき優れたプラクティスはありますか?
編集:
私が持っているデザインは次のとおりです。
「Phoenix」クラスは、適切な名前をまだ考えていなかったため、そのように命名されています。
しかし、これに加えて、グループを通じて特定のオブザーバーに関連付けられている場合でも、特定のオブザーバーに対して特定のアクティビティを非表示にする必要があります。
少しオフトピック:
個人的には、この問題をより小さな問題に切り詰めることができるはずだと感じていますが、それは私をどのように回避します。相互に関連付けられていない複数の再帰機能と、さまざまな方法で情報を取得する必要があるさまざまなクライアントタイプが関係しているためだと思います。本当に頭を包むことはできません。階層の問題をカプセル化する方法を改善する方向に誰かが私を導くことができれば、それを受け取ることも非常にうれしいです。
O(n)
明確に定義されたデータ構造のための効率的なアルゴリズムを探しているなら、私はそれに取り組むことができます。変異メソッドGroup
や階層構造は一切追加しなかったようです。これらは静的であると仮定しますか?
n
が0の一意の頂点が常に存在し、他のすべての頂点には最低1の入次数があるのは本当ですか?すべての頂点が接続されていn
ますか?n
一意のパスはありますか?データ構造のプロパティを一覧表示し、その操作をインターフェイス(メソッドのリスト)に抽象化できる場合、私たち(I)はそのデータ構造の実装を考え出すことができます。