多重継承は、エンティティシステムが行うすべての問題を解決しませんか?


10

問題はかなり自明です。多重継承は、エンティティシステムも解決するすべての問題を解決しないのですか?

「多重継承」という言葉を思い出したところ、古典的な継承が課していた多くの膨満の問題が解決されたようです。


1
多重継承はエンティティシステムに似ていますが、同じではありません。たとえば、複数の継承エンティティは、実行時にコンポーネントを追加および削除できません。すべての言語が多重継承をサポートしているわけでもありません。構成は、エンティティ/コンポーネントと同じカテゴリにあると考えることもできます。
MichaelHouse

2
クラスがすっきりしているので、好きな方法でシームレスに継承できる場合は、すでにコンポーネントである可能性もあります。コンポーネントはまた、実行時に構成/集約を可能にします

さて、その複雑でエラーが発生しにくいので、なぜそれを好むのですか?
API-Beast

2
親クラスから過剰なインターフェイスを継承することは、単一の継承と複数の継承ではなく、継承メカニズムの不適切な使用の症状であるため、MIは実際には「膨張」の問題にも対処していません。同じ「膨張」は、問題に対する合成指向のアプローチでも実現できます。

@MrBeastは、より複雑/よりエラーが発生しやすい、より複雑/エラーが発生しやすい、または「なぜそれを好まないのですか?」
3Dave

回答:


10

いいえ、多重継承はエンティティシステムと同じ問題をすべて解決するわけではありません。エンティティシステムと多重継承は2つの非常に異なるものです。多重継承の有無にかかわらずエンティティシステムを構築でき、同様に、エンティティシステムを構築せずに多重継承を利用できます。

伝統的に、コンポーネントに焦点を合わせたエンティティシステムは、重い形式の継承から何らかの形で離れて、代わりに構成を目的するために開発されました。この格言に関する他の場所、たとえば、プログラマーSEまたはSO自体に関する十分な文献と議論があり、なぜ作曲を好むのいうより大きな問題は、ゲーム開発にとって一種の主題外です。しかし、要するに、それは改善された可変性と保守性に向いている傾向があるアプローチです。


2

ジョシュの答えは素晴らしいですが、私は追加したいと思います:

エンティティ/コンポーネントの最も優れた機能の1つは、ゲーム内のすべての「もの」を作成および管理するデータ駆動型の方法です。私が見てきたことから、コンポーネントタイプとシステムのライブラリを作成したら、最小限のコード変更でほぼすべてを構築できます。(注:最小!= 0

動作の観点からゲームを定義し、実行時にスクリプトやデータベースなどからそれらをロードして初期化中に、動作をその場で変更できるようにすることで、新しい可能性の世界全体が開かれます。あなたの影があなたが期待するところに着かない理由を見たいですか?カメラ/ POVコンポーネントをライトに追加します。

エンティティ/コンポーネントを使用すると、ブロックを作成している限り、何でも構築できます。

また、多重継承は単一継承と同じ問題を引き起こします。階層に属性または動作を追加すると、それが伝播します。深い階層を作成している限り、不必要な重みを付けたり、コードを複製したり、競合を解決したりする状況に遭遇します。ゲームをデータとして想像すると、そのほとんどは回避できます。

私はここ数週間でこれをいじり始めたばかりですが、物事がどれほど単純になったかに感銘を受けました。それは特効薬ではありません-ラムダをコンポーネントにアタッチすることが問題を解決するための最もクリーンで最も便利な方法であるいくつかのケースに出くわしましたが、それを呼び出すことができれば、それはかなり素晴らしいパターンです。

少し関連する注意点として、データ中心のアプリケーション(Webサイトなど)の大きく退屈なメンテナンスジェネレーターの1つは、階層オブジェクトをリレーショナルデータベースにマッピングしています。私たちはたくさんの気の利いたソリューションを持っていますが、それらは結局、階層を平坦化するように設計されたすべてのハックです。アプリケーションの目的に合わせてモデルを構築する代わりに、効果的な階層と論理的なリレーショナル表現の間で妥協する必要があります。私はアプリの1つでかなり大きな階層をエンティティ/コンポーネントシステムとして再構築するという考えをいじっています-階層を破棄し、残りの実装のデータベースをゴールドスタンダードにします-そしてそれは有望です。

パフォーマンスの問題に対処できる動的コード生成/コードキャッシュなどの機能を統合すると、OOPの再利用可能なコードの目標をはるかに優れた方法で実現できる、高速で柔軟な論理アーキテクチャが完成します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.