子から親へのリンク-悪い考えですか?


15

私は私の親がそれが子供だと知っている状況がありますが(duh)、子供が親を参照できるようにしたいです。その理由は、子供が自分がそう感じたときに、自分自身を最も重要または最も重要でないものとして指定できるようにすることです。子がこれを行うと、親の子の上部または下部に移動します。

過去に、親に対して参照するために子のWeakReferenceプロパティを使用しましたが、面倒なオーバーヘッドが追加されると感じていますが、それが最善の方法かもしれません。

これは悪い考えですか?この機能をどのように異なる方法で実装しますか?

更新1:コンテキストの追加。これはレンダリングシステムなので、親コンテナはグループ化されたウィンドウのリストです。「私は最も重要です!」という子項目(ウィンドウ)基本的に、残りのウィンドウの上部にレンダリングしたい。

親は、これらの子をグループ化するための単なる論理コンテナーです。イベントを追加して、リクエストが一番上にあることを通知するのは良い考えです。しかし、実装(子が親に対して何をしたいのか)は別として、なぜあなたは子→親リンクを持ちたくないのでしょうか?二重にリンクされたリストがこれを行うので、人々は何かを行き来できます。


3
あなたは必要ありませんWeakReference。.netガベージコレクターはサイクルを処理できます。子が使用されなくなった場合(親がそれを指していない場合)、親への参照が含まれていても収集されます。
dbkk

2人の子供が両方とも自分が最も重要な子供になりたいと思ったらどうなりますか?
btilly

@btilly最も重要な子は、実際には親の子リストのスタックの一番上にそれを並べ替えます。だから、最後にそれをする人が最も重要になります。私のシナリオでは、最も重要な競合は決してありません。
スラーカ

回答:


18

これは悪い考えですか?

しばしば。

  • 親のカプセル化を解除します。
  • 両方のカップリングが増加します。
  • それは、子供がシステムの残りの部分に到達するためのブレイクアウトポイントとして機能し、漠然とその近くにあるものとの結合を増やします(人々その参照乱用するため)
  • 親のいない子供が欲しい場合は、デザインが制限されます。

どうすればそれを改善できますか?子供は、それがコレクション内にあることを知らないか、気にするべきではありません。自分自身を重要とみなす代わりに、気になる人(親)が優先度(または子供が住んでいるコンテキストのルール)を高めることができるように、知っている何らかのイベントが発生したことを通知する必要があります。私はそれには興奮していませんし、おそらく子供のモデルと重要な行動の間の懸念をより良く分離することを好むでしょうが、それ以上の文脈なしでは詳しく説明することはできません。

[編集:]

ええ、レンダリングシステムは親の所有権の1つのケースです...まあ、私は言いたくありませんが、それが行われたのは1つのケースであり、世界の終わりではありません。コントロールフォーカスを与えるために、入力ハンドラー(または何でも)がツリーを歩き、子を見つけるのではなく、どのコレクションの順序を変更するかを知っているデザインを好みます。


1
これは良い答えであり、おそらくそれによって生じたすべてのポイントを考慮し、それらがあなたの問題に当てはまるかどうかを確認する必要があります。そうは言っても、参照を単純な実装として開始し、物事が手に入らなくなった場合/リファクタリングした場合、それは世界の終わりではないと思います。
rperetti

答えは正しいです。ただし、子から親へのリンクが悪い考えである場合、オブジェクト指向プログラミングは実際のオブジェクトとは関係ありません。これを良いものにする方法はありませんか?
マノジR

これまでのところ、この回答をありがとう。元の質問にコンテキストを追加しました。
スラーカ

1
@ManojR-オブジェクト指向プログラミングは、実際のオブジェクトとは決して関連していませんでした。
Telastyn

あなたの編集は、WPF \ SilverlightのVisualTreeHelperについて考えさせてくれます。これにより、現在のコントロールと残りのUIシステムコントロールとの関係について照会できます。私は他のすべてをホストするルートコントロールも持っているので、このようなものを実装できると思います。ありがとう!!
スラーカ

0

子供が最も重要になりたいと判断するまでに、どのように実行が行われましたか?それは親を通してそこに行きましたか?はいの場合、親への参照をそのメソッドに送信できます。

例えば。すべてのノードが何らかのようなupdate()メソッドを持っている場合

void update() {
    doSomething()
    for(Node n:childs){
        //do something
        n.update();
    }
}

あなたはそれを変更することができます

void update(Node parent) {
    doSomething(parent)
    for(Node n:childs){
        //do something
        n.update(this);
    }
}

はい、これはそれを行う素晴らしい方法です。ただし、私の状況では、親のループによってクライアントロジックコードが開始されない可能性があります。
スラーカ

0

悪い考えだとは思わない。これを解決するには、各子にソート順の値を追加します。私は、Webページでオブジェクトを互いの上または後ろに表示するために使用される「z-index」のようなものを想定しています。

このようなコードをどのようにコーディングするかはわかりませんが、この概念は実行可能です。


ただし、このソリューションでは、問題は依然として存在します。これは、配列内の順序の概念をz-indexに置き換えるだけです。私はまだ子供から親へのコミュニケーションシステムを持っている必要があります。ありがとう:)
Thraka
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.