あなたが指摘したように、親がすべての作業を行い、子を追跡している限り、子自体が親にアクセスする必要がある場合はめったにありません。ただし、クラシックgetParent
は、フレームワークを外部から使用する場合に最も役立ちます。
シナリオ
問題を引き起こす可能性のある単純な操作は次のとおりです。ウィジェットツリー全体のどこかにある2つの具象ウィジェットと、これら2つをスワップする必要があるユースケースがある場合、スワップはどのように機能しますか?
オプション1:子供に教える
子ウィジェットにを伝えますswap(withOtherChild)
。ただし、スワップには、親の子のデータ構造の更新が含まれます。あなたの子供はその親を知らないので、どのようにこれを達成しますか?
オプション2:両親に伝える
子の親にそれを削除して、もう一方を追加するように伝えます。ああ、同じ問題。子オブジェクトだけがあり、getParent
それらにはありません。
オプション3:グラント作業
最後のオプションとして、ウィジェットツリー全体をトラバースして、を持つ親とhasChild(x)
を持つ親を見つけ、hasChild(y)
オプション2にフォールバックできます。
解決
大きなウィジェットツリーを構築し、ツリー内のウィジェットの位置を移動する必要がある操作を実行する場合は、親を保持する必要があります。ウィジェットツリーが非常に小さいか、深さが非常に小さいがhasChild
アクセサーが高速である場合は、オプション3を使用できるため、親参照を省略できます。
一般的なデータ構造の参照
ここで計画しているのは、ツリーのデータ構造を構築することです。単純化を考えてみましょう。議論のために、すべてのウィジェットは子を1つだけ持つことができると仮定します。もちろん、結果はリストであり、あなたの質問は「シングルリンクリストとダブルリンクリストのどちらが必要ですか?」になります。
リストと同じように、明確な答えはありませんが、長所と短所だけがあります。シングルリンク(つまり、親参照がない)の明らかな長所は、a)実装が簡単で、b)メモリが少ないことです。ただし、短所は、a)構造をトラバースする必要があるために一部の操作が遅くなること、b)これらの操作に簡単にアクセスできないことは、データ構造を使用するのが面倒であること、c)より多くのメモリを使用することです。
一方、二重にリンクされたバリアント、つまり親参照を使用すると、これらの長所と短所がかなり逆になります。
ただし、GUIライブラリ/フレームワークに関しては、メモリ制限は通常、親ポインタを禁止する問題ではありません。それを除外し、それがライブラリ/フレームワークであること、したがって実装が難しく、使いやすいことが望ましい場合は、基本的に上記のシングルリンクアプローチの長所を除外します。
私はあなたのプロジェクトの特殊性を認識していませんので、上記の私の推論のいくつかはあなたの場合には当てはまらないかもしれないので、親の参照を維持するようにあなたに言わないようにしたいと思います。ただし、一般的には、上記の理由から、ウィジェットデータ構造の親参照は価値があると考えています。