オブジェクト指向プログラミングでデータ指向設計を適用する方法は?[閉まっている]


17

データ指向設計(DOD)に関する多くの記事を読んで理解していますが、DODを念頭に置いてオブジェクト指向プログラミング(OOP)システムを設計することはできません。この2つを混ぜるにはどうすればよいですか?目的は、DODを舞台裏で使用しながら、素晴らしいOOPインターフェースを持つことです。

私もこれを見ましたが、あまり助けにはなりませんでした:https : //stackoverflow.com/questions/3872354/how-to-apply-dop-and-keep-a-nice-user-interface


3
あなたはこの質問があり、何かをはるかに具体的な(とゲーム関連)を投稿する必要がはるかに一般的すぎ。
DeadMG

あなたは正しいですが、ゲームプログラミング以外の他の分野で議論されているのを見たことはありません。
ポンバル

4
@DeadMG:ゲーム開発に由来するプラクティスを指す場合を除いて、ゲーム開発以外で使用されるデータ指向設計という用語を見たことはありません。データ駆動型の設計を考えている場合、それは同じことではありません。

回答:


16

おそらく、Noel Llopisのブログは、オブジェクト指向プログラミングとデータ指向設計の組み合わせに最適な説明だと思います。彼はDOD用語の創始者の1人であり、強力なC ++プログラマーであり、彼のスタイルとC ++のOO機能の活用方法について多くのことを書いています。

ノエルによると、それらを組み合わせるための重要な要素を呼び出すとしたら:

  • PODおよび非メンバー、非フレンド機能を可能な限り使用します。非メンバー、非フレンド関数は、カプセル化改善し、データ、データを保持するため、データ指向の重要な部分です。
  • オブジェクトに「一時的な」状態を保存しないでください。一時的な状態はデータを詰まらせます。何かをキャッシュする必要がある場合(パフォーマンスなど)、それは新しいクラスに属し、2つのタイプをリンクする非メンバー非フレンド関数であり、is-a関係やhas-a関係ではありません。
  • 状態Aまたは状態Bになる可能性のあるオブジェクトは避けてください。2つのオブジェクト(一方はA、もう一方はB)を切り替えることをお勧めします。
  • ポリモーフィズムを避け、仮想機能を避け、テンプレートを避け、データが実際の同一性ではなく構文的に見えるようにするものを避けてください。

DODプロパガンダのもう1つの大きな名前は、InsomniacのMike Actonですが、彼が書いたものを読んで、私は彼が本当にpro-OO(またはデータ指向である限りはanti-OO)ではないと言います。


答えてくれてありがとう、しかしあなたが言っていることは、私がそれでオブジェクト指向を使うことができる方法ではなく、DODを使うためにすべきことです。(:D)私はノエルさんのブログ、マイク・アクトンの暴言を読んで、DICEの他の中の出版物、私は中に混入OOと、DODをだけではない使用方法を理解しています。
ポンバル

2
OOは何だと思いますか?たとえば、NoelのコードOOの大部分を呼び出します。たとえば、クラスとインスタンスがまだあり、型ベースのディスパッチがあり、継承がある可能性があります(これを許可するためにC ++ 0xのPODの定義が変更されました)。運用ではなく、データから始まる問題をモデル化しています。

たとえば、オブジェクトの状態と同様に、ポリモーフィズムはOOPの重要な部分です。データ指向の設計では、継承を使用して、アニメート可能、対話可能、移動可能などのゲームエンティティプロパティを提供する必要があります。それはすべて、物理学やアニメーションなど、必要なエンティティのみを各コンポーネントに提供する賢いデータマネージャーに依存しています。
ダニジャー

@sharethis:あなたの反対を理解するなら、サブタイプ多型がオブジェクト指向の重要な特徴であるということです。それをサポートせずにオブジェクト指向であると主張する言語は奇妙ですが、それはゲームがオブジェクト指向スタイルでプログラムされている場合でも、ゲームをプログラミングする際に遭遇する種類の問題に対する第一の手段であることを意味しません。また、DODは特定の種類のポリモーフィズム(名義サブタイピング)を回避することですが、他のもの(C ++、ADLによるアドホックポリモーフィズム、または値表現に関する保証による構造的ポリモーフィズム)を奨励することも主張します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.