問題はかなり自明です。多重継承は、エンティティシステムも解決するすべての問題を解決しないのですか?
「多重継承」という言葉を思い出したところ、古典的な継承が課していた多くの膨満の問題が解決されたようです。
問題はかなり自明です。多重継承は、エンティティシステムも解決するすべての問題を解決しないのですか?
「多重継承」という言葉を思い出したところ、古典的な継承が課していた多くの膨満の問題が解決されたようです。
回答:
いいえ、多重継承はエンティティシステムと同じ問題をすべて解決するわけではありません。エンティティシステムと多重継承は2つの非常に異なるものです。多重継承の有無にかかわらずエンティティシステムを構築でき、同様に、エンティティシステムを構築せずに多重継承を利用できます。
伝統的に、コンポーネントに焦点を合わせたエンティティシステムは、重い形式の継承から何らかの形で離れて、代わりに構成を目的とするために開発されました。この格言に関する他の場所、たとえば、プログラマーSEまたはSO自体に関する十分な文献と議論があり、なぜ作曲を好むのかというより大きな問題は、ゲーム開発にとって一種の主題外です。しかし、要するに、それは改善された可変性と保守性に向いている傾向があるアプローチです。
ジョシュの答えは素晴らしいですが、私は追加したいと思います:
エンティティ/コンポーネントの最も優れた機能の1つは、ゲーム内のすべての「もの」を作成および管理するデータ駆動型の方法です。私が見てきたことから、コンポーネントタイプとシステムのライブラリを作成したら、最小限のコード変更でほぼすべてを構築できます。(注:最小!= 0)
動作の観点からゲームを定義し、実行時にスクリプトやデータベースなどからそれらをロードして初期化中に、動作をその場で変更できるようにすることで、新しい可能性の世界全体が開かれます。あなたの影があなたが期待するところに着かない理由を見たいですか?カメラ/ POVコンポーネントをライトに追加します。
エンティティ/コンポーネントを使用すると、ブロックを作成している限り、何でも構築できます。
また、多重継承は単一継承と同じ問題を引き起こします。階層に属性または動作を追加すると、それが伝播します。深い階層を作成している限り、不必要な重みを付けたり、コードを複製したり、競合を解決したりする状況に遭遇します。ゲームをデータとして想像すると、そのほとんどは回避できます。
私はここ数週間でこれをいじり始めたばかりですが、物事がどれほど単純になったかに感銘を受けました。それは特効薬ではありません-ラムダをコンポーネントにアタッチすることが問題を解決するための最もクリーンで最も便利な方法であるいくつかのケースに出くわしましたが、それを呼び出すことができれば、それはかなり素晴らしいパターンです。
少し関連する注意点として、データ中心のアプリケーション(Webサイトなど)の大きく退屈なメンテナンスジェネレーターの1つは、階層オブジェクトをリレーショナルデータベースにマッピングしています。私たちはたくさんの気の利いたソリューションを持っていますが、それらは結局、階層を平坦化するように設計されたすべてのハックです。アプリケーションの目的に合わせてモデルを構築する代わりに、効果的な階層と論理的なリレーショナル表現の間で妥協する必要があります。私はアプリの1つでかなり大きな階層をエンティティ/コンポーネントシステムとして再構築するという考えをいじっています-階層を破棄し、残りの実装のデータベースをゴールドスタンダードにします-そしてそれは有望です。
パフォーマンスの問題に対処できる動的コード生成/コードキャッシュなどの機能を統合すると、OOPの再利用可能なコードの目標をはるかに優れた方法で実現できる、高速で柔軟な論理アーキテクチャが完成します。