質問

特定のオブジェクトを別のオブジェクトの中に構築する理由はたくさんあることはわかっています。一部の学派は、プログラムを特定の方法で構築する理由を明確にしています。「データ駆動設計」または「ドメイン駆動設計」。私はまだ OOP の初心者であり、あるオブジェクトが別のオブジェクトに含まれなければならない理由を理解するのが難しいことがよくあります。時々、素晴らしいと思えるオブジェクトを手に入れたとき、「よし、次はそうしなければならない」と気づくところまで来ます。 置く これはどこか?」 この背後にある推論は、ファイルをハードディスクのどこに置くかを決めるのと似ていますか?

これについては、いくつかの指針があります。

  • それが物理世界の関係をモデル化する場合。
  • コンポーザーがオブジェクトの構築に必要なデータを持っている場合。
  • 合成されたオブジェクトが作曲者の言うことを聞く場合。

この決断を下すとき、何を求めますか?

役に立ちましたか?

解決

そうですね、これに私を助けてくれた非常に単純な概念の 1 つは、単に「has a」と「is a」という概念です。包含されるオブジェクトは、包含するオブジェクトが持つ何かなのか、それとも包含するオブジェクトそのものなのか、自問してみてください。それが収容オブジェクトにあるものであれば、収容が適切です。それ以外の場合は、継承を検討する必要があるかもしれません。

犬は動物であり、鼻があるので、次のようになります。

class Animal
{
}

class Dog : Animal
{
    Nose n;
}

これで正常に動作します。このアプローチの 1 つの「問題」は、鼻と犬を緊密に結合することです。そのため、オブジェクトではなくインターフェイス ポインターが含まれているなどの現象が発生したり、Google で「Dependency Injection」を検索したりすることがあります。しかし、よく言われるように、「has a」と「is a」は政府の仕事にとって十分近いものであることがよくあります。

早い段階でたくさんの例を試してみると、時間が経つにつれて自然になります。スパゲッティができてしまった場合は、ミートボールを投げて、もう一度試してみてください。:)

他のヒント

どのような代替案を検討していますか?封じ込めと継承について話しているのですか。hasA と isA に関する John Lockwood のコメントがこの問題に役立ちます。

それとも、おそらく、封じ込めと関連付けについて話しているのでしょうか?hasAにはさまざまなフレーバーがあります。たとえば、ある人は配偶者を持っているかもしれませんが、明らかに配偶者を含んでいません。配偶者の変更と鼻の変更には違いがあります。

考慮する関係の種類:

  • 一生:鼻のない人を作成することに意味はありますか?鼻は人なしで存在できますか?人は配偶者なしで存在することができますか?これらの質問に対する答えによって、Personal に対して行う操作の種類が決まります。おそらく setNose() メソッドは必要ありませんが、おそらく、wipeNose() メソッドが必要で、おそらくmarry(person) メソッドが必要です。

  • カーディナリティ:人には鼻が何本あるのでしょうか?車両には車輪と座席が何個ありますか?これに対する答えによってデータ構造の種類が決まるのでしょうか?ただの参考?リスト?ハッシュテーブル?

UML モデリング、特にクラス図について読むと役立つことがわかりました。これは、さまざまな種類の関係を有効に捉える方法に関する多くの経験を反映しています。

  

時々、私は自分自身を見つけます   素晴らしいと思われるオブジェクト、そして私   私が気付いてポイントを取得、   「さて、私はこれを配置する必要があります   どこか? "

上記の文章から、それはあなたがボトムアップから設計しようとしているように聞こえます。事の私は長年にわたって学んだことの一つは、トップダウン設計が進むべき道であるということです。それは、使用する必要がある場合、あなたが知っている後にのあなただけののクラスを記述する必要があります。そうでなければ、あなただけの「素晴らしいようだ」と、まったく役に立たない可能性のあるコードが含まれていることをクラスを作成することになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top