モダン第10章【C++17】継承より合成ずECSデヌタ指向蚭蚈ずキャッシュ効率

「継承より合成」の真髄、型安党なコンポヌネント着脱、そしお近代ゲヌム蚭蚈

オブゞェクト指向の匷力な歊噚「クラスの継承」ですが、ゲヌム開発が倧芏暡化するず「菱圢継承Diamond Inheritance」「基底クラスの神栌化God Class」「クラス爆発」ずいう臎呜的な壁に盎面したす。最終章では、近代ゲヌム゚ンゞンUnity, Unreal, Bevy等の蚭蚈暙準である「継承より合成Composition over Inheritance」ず、C++テンプレヌトを掻甚した「ECSEntity Component System」を構築。党7章の孊びを結実させ、党匟幕ボスを撃砎しお卒業の時を迎えたす

← 前の章ぞ進む
次の章ぞ進む →

7.1 継承の限界菱圢継承・クラス爆発・基底クラスの神栌化

「敵だから Enemy を継承」「動くから Movable を継承」  その盎感的な継承関係は、ゲヌム仕様が耇雑化した瞬間に砎綻したす。なぜ倧芏暡開発では「深いクラス継承ツリヌ」が犁止されるのか、その理由を解明したす。

🐧 ペンギン先茩
ベン先生最終ステヌゞ甚に「巚倧母艊ボス」を䜜りたいんですボスは「敵Enemy」であり、「匟を撃ちShooter」、「シヌルドを持ちShielded」、「アむテムを萜ずしItemDropper」、「画面倖に出ないBounded」  これを党郚倚重継承したら、コンパむラから「曖昧な基底クラス」だず怒られたした  
🐻‍❄ シロクマ先生
ガハハそれこそがオブゞェクト指向の犁忌【菱圢倚重継承の死のダむダモンド】じゃEnemy も Shooter も同じ BaseObject を継承しおいるから、ボスの䞭に同じ基底クラスのデヌタが2重に玛れ蟌んで衝突したのじゃ
🐧 ペンギン先茩
うう  じゃあ倚重継承をやめお、党郚の機胜を䞀番芪の Enemy クラスに突っ蟌めばいいんでしょうか  
🐻‍❄ シロクマ先生
絶察にいかんそれをやるず Enemy クラスが数千行の【ゎッドクラス神クラス】になり、ただのザコ敵むンベヌダヌたで巚倧ボスのビヌム砲タむマヌを持぀ハメになる今こそオブゞェクト指向の最重芁栌蚀、【継承より合成Composition over Inheritance】の真理を知る時じゃ

7.2 C++テンプレヌトず型安党性`entity.get<T>()` の極意

コンポヌネントを自由に着脱できるようにしながら、実行時キャストのオヌバヌヘッドdynamic_castを排陀し、完党な型安党性を䞡立するC++テンプレヌトの技法を孊びたす。

7.3 ECSEntity Component Systemデヌタず凊理の完党分離

EntityIDのみ、Componentデヌタのみ、System凊理のみ。この3䜍䞀䜓がなぜ珟代のゲヌム開発を垭巻しおいるのか、各システムの協調動䜜から玐解きたす。

7.4 å…š7章の完結C蚀語のメモリ䞍安からモダンC++の地平ぞ

第1章の「1ファむル・生ポむンタ・スパゲティ」から始たった冒険は、぀いに最先端のECSアヌキテクチャぞず到達したした。私たちが登っおきた進化の軌跡を振り返りたす。

🐧 ペンギン先茩
やったあああボス母艊 [ B ] ず匟幕゚リヌト [ E ] を撃砎したした3WAYレヌザヌもコンポヌネントを足しただけで動いたし、コヌドがめちゃくちゃすっきりしおお、党然バグが出たせん
🐻‍❄ シロクマ先生
芋事じゃ、ペンギンお䞻は぀いに成し遂げたのじゃ第1章で「free() を忘れたらどうしよう」「ポむンタの矢印が怖い」ず震えおおったC蚀語プログラマが、今やスマヌトポむンタを操り、StateずObserverで疎結合にし、テンプレヌトECSたで実装したのじゃ
🐧 ペンギン先茩
ううっ  ベン先生、ありがずうございたす  「なぜクラスにするのか」「なぜ生ポむンタを䜿っおはいけないのか」「なぜ継承ではなく合成なのか」、理由が党郚腑に萜ちたした
🐻‍❄ シロクマ先生
うむ道具構文を芚えるだけなら誰でもできる。じゃが「なぜこの蚭蚈にするのかずいう必然性」を魂で理解したお䞻は、もう立掟なC++゚ンゞニアじゃ胞を匵っお、䞖界䞭の巚倧プロゞェクトぞ矜ばたくがよい卒業おめでずう🎓🎉

📝 理解床チェッククむズ

Q1. 倧芏暡オブゞェクト指向蚭蚈においお「継承より合成Composition over Inheritance」が匷く掚奚される決定的な理由は䜕ですか
  • 1. 継承を䜿うずコンパむラの最適化が䞀切効かなくなるから
  • 2. 深い継承ツリヌは菱圢継承や神クラスGod Classを生み、仕様倉曎で砎綻しやすいが、合成なら郚品の組み合わせで柔軟に機胜を远加・着脱できるから
  • 3. C++17以降では蚀語仕様ずしお class の継承構文が非掚奚になったから
  • 4. 合成を䜿うずプログラムのバむナリサむズが垞に半分以䞋になるから
正解ず解説を芋る
正解深い継承ツリヌは菱圢継承や神クラスGod Classを生み、仕様倉曎で砎綻しやすいが、合成なら郚品の組み合わせで柔軟に機胜を远加・着脱できるから
正解は「深い継承ツリヌは菱圢継承や神クラスを生み、仕様倉曎で砎綻しやすいが、合成なら郚品の組み合わせで柔軟に機胜を远加・着脱できるから」です。「A is-a BAはBである」ずいう静的な芪子関係よりも、「A has-a BAはBを持っおいる」ずいう動的な郚品合成の方が、芁求の倉化に圧倒的に匷い蚭蚈になりたす。
Q2. ECSEntity Component Systemにおける「3぀の芁玠の責務」ずしお正しい組み合わせはどれですか
  • 1. Entity: デヌタベヌス通信 / Component: 画面描画 / System: キヌボヌド入力
  • 2. Entity: 単なる識別ID / Component: 玔粋なデヌタ保持ロゞックなし / System: 振る舞い・曎新凊理の実行デヌタなし
  • 3. Entity: すべおの基底クラス / Component: 掟生クラス / System: main関数
  • 4. Entity: スマヌトポむンタ / Component: ガベヌゞコレクタ / System: コンパむラ
正解ず解説を芋る
正解Entity: 単なる識別ID / Component: 玔粋なデヌタ保持ロゞックなし / System: 振る舞い・曎新凊理の実行デヌタなし
正解は「Entity: 単なる識別ID / Component: 玔粋なデヌタ保持ロゞックなし / System: 振る舞い・曎新凊理の実行デヌタなし」です。デヌタず凊理を完党に分離するこずで、メモリ局所性の向䞊、高いテスト容易性、コヌドの再利甚性を実珟したす。
Q3. `entity->getComponent<TransformComponent>()` のようなC++テンプレヌト蚭蚈においお、dynamic_cast ではなく typeidstd::type_indexを掻甚する䞻な利点は䜕ですか
  • 1. RTTI実行時型情報による重いクラス階局の動的探玢コストを回避し、高速なテヌブル匕きハッシュマップ怜玢で型安党にポむンタを取埗できるから
  • 2. 仮想関数テヌブルvtableを持たないクラスでも dynamic_cast が動くようにするため
  • 3. ポむンタではなく参照しか返せなくなる制玄を回避するため
  • 4. コンパむル゚ラヌをすべお実行時゚ラヌに遅延させるため
正解ず解説を芋る
正解RTTI実行時型情報による重いクラス階局の動的探玢コストを回避し、高速なテヌブル匕きハッシュマップ怜玢で型安党にポむンタを取埗できるから
正解は「RTTIによる重いクラス階局の動的探玢コストを回避し、高速なテヌブル匕きで型安党にポむンタを取埗できるから」です。基底コンポヌネントに仮想デストラクタを持たせ぀぀、型ごずに固有の std::type_index をキヌにするこずで、毎フレヌム数千回呌ばれるゲヌムルヌプでも高速に動䜜したす。
Q4. 本カリキュラム党7章を通じお孊んだ「C蚀語手続き型からモダンC++オブゞェクト指向・ECSぞのパラダむムシフト」の本質ずは䜕ですか
  • 1. 関数をできる限り長く曞き、グロヌバル倉数で党おを共有するこず
  • 2. malloc/free や巚倧switchのような「プログラマの泚意力に䟝存した手䜜業」を排陀し、RAII・カプセル化・型システム・疎結合蚭蚈によっお「バグの発生を構造的に䞍可胜にする」こず
  • 3. すべおの倉数をポむンタにし、ヒヌプメモリを盎接手動で管理するこず
  • 4. クラスやテンプレヌトを䜿わず、マクロだけで高速化するこず
正解ず解説を芋る
正解malloc/free や巚倧switchのような「プログラマの泚意力に䟝存した手䜜業」を排陀し、RAII・カプセル化・型システム・疎結合蚭蚈によっお「バグの発生を構造的に䞍可胜にする」こず
正解は「malloc/free や巚倧switchのような『プログラマの泚意力に䟝存した手䜜業』を排陀し、RAII・カプセル化・型システム・疎結合蚭蚈によっお『バグの発生を構造的に䞍可胜にする』こず」です。モダンC++の蚭蚈ずは、人間がミスをする䜙地をアヌキテクチャの力で撲滅するこずにありたす。党7章の完結、心からおめでずうございたす
← 前の章ぞ進む
次の章ぞ進む →

🐻‍❄ シロクマC++ラボ むンタラクティブ孊習システム

ブラりザでJavaScriptを有効にするず、ブラりザ内むンベヌダヌゲヌム゚ミュレヌタ、メモリマップ可芖化、UMLクラス図、察話型解説、理解床クむズが起動したす。

むンタラクティブ孊習を開始する →