2009-05-22 9 views
3

私のプログラミングでは何かが表示され続けていますが、2つのことはある視点からは同じですが、別のものとは異なります。列車で結ばれた鉄道駅のグラフを作ったとすると、VertexとRailStationのクラスは時々同じで、時にはそうではありません。対応の適切なオブジェクト指向モデリング

だから、私は非常に多くの鉄道駅や列車を表し、グラフを持っている想像してみてください。次に、このグラフを別のオブジェクトに渡して、いくつかの頂点を削除し、対応する鉄道駅を消滅させます。

私は、彼らがいないなら、頂点の鉄道駅「プロパティ」を作成する必要はありません。また、問題は対称的です。レールステーションを消去すると、対応する頂点が消えてしまいます。モデル化または対応するための適切なOO方法は何か。私はいくつかのサポート方法やクラスを書いていくことで、もう少しマイルを稼ぎたいと思っています。

私が思うに、私は現在、Smalltalkのプログラミング言語を使用していますが、問題は本当にスモールトーク固有ではありません。 Smalltalkではコールスタックを調べるようなクールなやり方ができます。これはこの文脈で役に立つかもしれません。

更新: まあ、RailStationsはVerticesではありません!彼らは?

[OK]を、答えを求めて、私たちは、実際のコードを考えてみましょう。子供を持つ人をモデルにしてみましょう。それは一番簡単なことですよね?子供たちは両親も知っていなければならないので、二重にリンクされたツリーのようなものです。子どもから親を解散させることをより容易にするために、私は、親と子の間の関係を親子関係のモデルとして関係としてモデル化する。

だから、私は親>>のremoveChildを実現することができます。おそらく、だからこれ

removeChild: aChild 
    (parent relationshipWith: aChild) disband. 

のように、親は関係なく、子供たちのコレクションを持っています。しかし、各関係は子供にに対応します。関係に子を削除する必要があります

parent children removeAllSuchThat: [:e | e age < 12] 

:今、私はこのようなことをしたいです。

ここで、関係と子供はある意味で対応しています。では、私は今何をしますか?私は間違ってはいけない、私は完全に私が関係クラスを導入せずに問題を解決できることを知っている。しかし実際には、両親と子供は実際に関係を共有しているので、それをモデル化して、それを使ってダブルリンクの解散を減らすのはなぜですか?あなたの問題のドメインで

+0

RailstationsはVerticesではありませんか?あなたの質問では、頂点とrailStationsがオブジェクト指向で異なるエンティティであることを意味するものは何もありません。違いは、VerticesはRailStationsの視覚的な表現にすぎないということです。そうですか? – zidane

答えて

3

は、頂点の種類のステーションではありませんか?その場合は、StationをVertexから派生させてみませんか?

は「あなたの問題領域に」というフレーズの使用を注意してください。あなたの問題は、グラフに表示される鉄道駅としての使用に関するものです。だから、そのドメインでは、ステーションは頂点です。それが別の問題ドメインであった場合、鉄道駅構想のデータベースなど、そうでないかもしれません。最近の言語のほとんどは、異なるドメインの同じ名前を持つ異なる種類のエンティティを持つことができるように、名前空間の考え方をサポートしています。

はあなたの親/子の問題に関しては、もう一度、あなたはあまりにも一般的なされています。私が数学的表現とサブ式をモデル化していた場合、私が親を削除すると、すべてのサブ式を削除したり、削除したりしたいと思うでしょう。OTOH、私は英国人の法的責任関係をモデル化していましたが、責任が解消されたとき(離婚の理由など)、私はその関係を削除したいだけで、それ自体の独立した存在。

+0

さて、子供のものは、いくつかの文脈では対応し、他のものではそうではありません。それが私の主張であり、なぜ私は単に継承を使用することを控えるのですか?識別するかどうかは、コンテキストに依存します。コンテキストを提供するモデリングはありませんか?私が対応の文脈の中にいるなら、どのようにその対応関係をモデル化するのですか?私が持っていた1つのアイデアは、RailstationsとVerticesのペアを含む特別な種類のコレクションを特定し、RailstationsまたはVerticesに切り替えることができます。したがって、RailStationを削除すると、頂点も削除されます。 – nes1983

+0

そしてもちろん、子供を取り除くことによって、私はそれを親から取り除くことを意味します。システム外ではありません。 – nes1983

+0

私が答えたところでは、2つの異なる問題領域に対して1つのソリューションを作成しようとしています。整数、文字列、リストなどの非常に基本的な型を除いて、これはめったに良い考えではありません。 –

2

RailStationがVertexから継承する(is-a relationship)ように思えます。継承についてはsmalltalk tutorialを参照してください。そうすれば、RailStationsのグラフがあれば、頂点のグラフを使って(一般的に)扱うオブジェクトは自然に正しく処理されます。

このアプローチがうまくいかない場合は、より具体的に(実際のコードを使用することをお勧めします)。

2

問題の説明から、ステーションと頂点の1対1対応があり、ステーションを削除すると対応する頂点が自動的に削除されます(逆も同様です)。また、「列車で結ばれた鉄道駅のグラフ」を構築することについても言及しました。このグラフでは、駅が頂点であり、列車がエッジであるグラフが明らかです。

ステーションはどのようにしてではない頂点ですか?ステーションが頂点以外に存在しない場合や、ステーション以外の頂点が存在しない場合は、それらを2つの別個のリンクされたエンティティとして維持するとどのようなメリットがありますか?

私があなたの状況を理解しているように、station-isa-vertexとinheritanceはそれをモデル化する方法です。

+0

さて、レールステーションの事はほんの一例です。私は何度も相手にやって来て、それをどう扱うべきか分かりませんし、鉄道では安価な方法を提供していますが、それはいつも安くてかわいいと感じています。シーサイドコンポーネントのグラフを作成すると、完全なシーサイド階層を変更するかどうかはわかりません。私が本当に欲しいのは、いくつかの文脈で物事をつなぎ合わせ、それを別の文脈で分けておくことです。 – nes1983

+0

その場合、rs/ssコンストラクタで作成され、デストラクタによって破棄される、集約/委任のための仕事 - 鉄道/海辺の頂点 - のように聞こえます。そのシナリオで頂点を手作業で破壊しないように覚えておく必要があります。所有者に所有者に通知するOwnedVertexサブクラスを作成しないかぎり、rs/ssが自己破棄できるようにしてください。 –

1

Relationshipオブジェクトを使用することをお勧めします。

私はここで適切な質問は "それを使用する必要がありますか?"と思います。

おそらく、親クラスと子クラスは同じPersonスーパークラスを拡張しているため、共通の属性(たとえば年齢)があります。

私の考えでは、次のことが分かります。親オブジェクトと子オブジェクトは互いに知っている必要があるため、両方のクラスは同じリレーションシップへのリンクを維持する必要があります。 Relationshipオブジェクトは、1つの親と特定の数の子との間に1対多の関係を保持し、各Personオブジェクトへの参照を保持します。

このようにして、Relationshpオブジェクト内に解散ロジック全体を実装することができます。多少なりとも洗練されたものになります。 Relationshipオブジェクトを照会すると、家族のメンバーが何かを行うための要件に合っているかどうかを知ることができます。関係者は、すべてのメンバーを知り、参照を破るように求めてから、破壊する準備ができているか、一部のメンバーに家族を離れて、Relationshipオブジェクトを保持するよう依頼するので、関係を安全に解体(破壊)することができます生きている。

しかし、それだけではありません。関係は、実際にはHierarchicalRelationshipとPeerRelationship(またはFriendRelationship)によって拡張されたスーパークラスでなければなりません。

この特殊化により、親と子が完全に横断的に他の階層間をリンクすることができます。

これは、RelationshipオブジェクトがPersonオブジェクト(またはVertexオブジェクト)の束全体をスケーラブルで構造化された方法でクエリして整理するためのキーであるため、最終的なデータ・ドメインが使用可能になりますグループを解散したり、グループ間の特定の道(または鉄道)を歩きたいと思っても、あなたはどんな意味でも好きです。

大量のメタフォアのために申し訳ありません。

+0

実際、私は思考の方法に非常に同意します、それは私の心の上にあった多くをクリアします。私はまだそれを行う方法をまだ正確には分かっていませんが、はい、私は質問に対する意味を見ています(実際には、これが私が最初の質問にどのようになったかです)。 – nes1983

+0

Ok Niko、もう助けが必要かどうか教えてください。 Smalltalkについては分かりませんが、代わりにObjective-CとC++があります。おそらく、OOの概念を言語に直接関わることなく表現することもできます。 –

1

は、私たちはあなたの要素を追加または削除するとき反対側の端を更新Collectionの専門サブクラスを使うhttp://www.squeaksource.com/Fame.html

を参照して、名声を見てみましょう。また、プラグマでクラスに注釈を付けると、リレーションに注釈を付けることができます。これらのプラグマは、すべての種類のすばらしいものを行うためにFameフレームワークによって使用されます。

関連する問題