私のプログラミングには何かが現れ続けています. 同様に、列車で接続された鉄道駅のグラフを作成すると想像してください。クラス Vertex と RailStation は同じ場合もあれば、そうでない場合もあります。
では、鉄道駅と列車を非常によく表しているグラフがあるとします。次に、このグラフを別のオブジェクトに渡し、いくつかの頂点を削除してから、対応する鉄道駅を削除します。
鉄道駅を頂点の「プロパティ」にしたくありません。そうではありません。また、問題は対称的です。鉄道駅を消去すると、対応する頂点が消えてしまいます。モデル化または通信の適切な OO の方法は何ですか。最終的に全体的な使用法が単純で簡単であれば、いくつかのサポート メソッドまたはクラスを作成することによって、さらに数マイル進んでいきます。
私は現在 Smalltalk プログラミング言語を使用していますが、質問は実際には smalltalk 固有のものではないと思います。Smalltalk では、コール スタックを調べるなどのクールなトリックを実行できるため、このコンテキストで役立つ可能性があります。
更新: まあ、RailStations は頂点ではありません! 彼らは?
わかりました、答えで要求されているように、実際のコードを考えてみましょう。子供がいる人をモデルにしましょう。それが一番簡単ですよね?子供も親を知っている必要があるため、二重にリンクされたツリーのようになっています。子から親を簡単に分離できるようにするために、親と子の間のリンクを、親と子のプロパティを持つリレーションシップとしてモデル化します。
だから、私はparent>>removeChildを実装することができました:おそらくこのように
removeChild: aChild
(parent relationshipWith: aChild) disband.
したがって、親には、子ではなく関係のコレクションがあります。しかし、それぞれの関係は子供に対応しています。今、私はこのようなことをしたい:
parent children removeAllSuchThat: [:e | e age < 12]
関係と子供を削除する必要があります。
ここでは、人間関係と子供はある意味で対応しています。それで、私は今何をしますか?誤解しないでください。Relationship クラスを導入しなくても問題を解決できることは十分承知しています。しかし、確かに、親と子は実際に関係を共有しているので、それをモデル化し、それを使用して、二重リンクを無理なく解消するのに役立ててみませんか?