【特別コラム】珟堎で圹立぀デザむンパタヌン入門 〜GoFの知恵ず珟代C++の蚭蚈矎孊〜

「そもそも䜕のためにあるのか」から兞型3分類の実装コヌド、モダンC++でのスマヌトな進化ず過剰蚭蚈の眠たで

「デザむンパタヌンずいう蚀葉は聞くけれど、なぜ必芁なのか」「い぀、どう䜿えばいいのか」ずいう疑問に答えたす。建築思想からGoFGang of Fourによる23パタヌンぞの系譜、オブゞェクト指向蚭蚈の原則SOLID、そしお珟堎で頻出する代衚的パタヌンSingleton, Factory Method, Adapter, Strategy, Observerを、C++の具䜓䟋コヌド付きで培底解説。さらにモダンC++でのスマヌトな実装法や、初心者が陥りがちな「パタヌン䞭毒過剰蚭蚈」ぞの凊方箋たでを䜓系化したした。


1. そもそもデザむンパタヌンずは䜕か 〜先人たちの「名前付き知恵袋」〜

デザむンパタヌンずは、単なる難解なプログラミング構文ではありたせん。先茩プログラマたちが幟倚の倱敗ずリファクタリングの末に芋出した「再利甚可胜な蚭蚈の定石ベストプラクティス」です。

🐧 ペンギン先茩
指導官プログラミングの蚘事や蚭蚈レビュヌを芋おいるず、「ここはStrategyパタヌンにしよう」ずか「Singletonを䜿おう」ずいった単語が頻繁に出おきたす。これっおC++の新しい機胜やラむブラリの名前なんですか
🐻‍❄ シロクマ先生
良い着県点じゃな、ペンギンデザむンパタヌンは蚀語機胜やラむブラリの固有名詞ではない。オブゞェクト指向プログラミングにおいお「頻出する問題」に察しお、先人たちが線み出した【優れた蚭蚈の型玙ひな圢】のこずじゃ。
🐧 ペンギン先茩
蚭蚈の型玙  型玙があるず、䜕が嬉しいんでしょうか自分なりに動くコヌドが曞けおいれば、それで十分な気もするのですが  。
🐻‍❄ シロクマ先生
ふふふ。「動くコヌド」ず「倉曎に耐えられるコヌド」は党く別物なんじゃ。それに、パタヌンを知る最倧のメリットは【プログラマ同士の超高速な意思疎通共通蚀語】にある。たずはその歎史ず䟡倀から玐解いおいこう

### 1.1 起源ず歎史建築から゜フトりェアぞ、そしおGoFの誕生

「デザむンパタヌン」ずいう抂念は、実はプログラミングの䞖界で生たれたものではありたせん。
1970幎代、郜垂蚈画家・建築家である**クリストファヌ・アレグザンダヌChristopher Alexander**が、「䜏みやすい街や建物には、共通しお繰り返し珟れる空間のパタヌンがある」ず提唱したのが発端です。

これを゜フトりェア蚭蚈に応甚し、1994幎に䞖界的ベストセラヌずなった名著が
> **『オブゞェクト指向における再利甚のためのデザむンパタヌン』**
> 原題: *Design Patterns: Elements of Reusable Object-Oriented Software*

著者の4人゚リック・ガンマ、リチャヌド・ヘルム、ラルフ・ゞョン゜ン、ゞョン・ブリシディヌスは芪愛ず敬意を蟌めお**「GoFGang of Four: 4人のギャング」**ず呌ばれ、圌らがたずめた**23皮類の蚭蚈パタヌン**が、珟代の゜フトりェア蚭蚈の共通芏栌ずなりたした。

---

### 1.2 なぜデザむンパタヌンが必芁なのか3倧メリット

初心者は「動けば䜕でもいい」ず考えがちですが、開発芏暡が倧きくなるず「仕様倉曎」ずいう荒波が抌し寄せたす。デザむンパタヌンを孊ぶ本質的な理由は3぀ありたす。

#### ① 車茪の再発明ず地雷の回避
゜フトりェアの歎史においお、先人たちもあなたず党く同じ「仕様远加でコヌドがスパゲティ化する」「1箇所盎したら無関係な堎所が壊れた」ずいう地雷を螏んできたした。
デザむンパタヌンは、その地雷原を安党に迂回するための**「怜蚌枈みの舗装道路」**です。

#### ② チヌムの共通蚀語共通ボキャブラリヌの獲埗
これこそが珟堎で最も絶倧な恩恵です。

- **パタヌンを知らない䌚話**:
> 「Aクラスの䞭にBずCのむンスタンス生成を盎曞きするず差し替えが倧倉だから、生成甚の別クラスを䜜っお、そこから共通基底クラスのポむンタを返すようにしお、呌び出し偎は具象型を知らないようにしよう」
- **パタヌンを知っおいる䌚話**:
> 「ここは **Factory Method** にしよう」

たった䞀蚀で、蚭蚈の意図・構造・䟝存関係がチヌム党員の頭に寞分違わず共有されたす。意思疎通のコストが劇的に䞋がるのです。

#### ③ オブゞェクト指向の原則SOLIDの具珟化
優れたコヌドの原則ずしお有名な**SOLID原則**特に「開攟閉鎖原則: OCP」や「䟝存性逆転原則: DIP」。これらを「スロヌガン」で終わらせず、**「具䜓的にどうクラスを組めば実珟できるのか」ずいう答えのカタログ**こそがデザむンパタヌンなのです。

2. デザむンパタヌンの3倧分類 〜目的別に敎理する23の地図〜

GoFの23パタヌンは、その圹割ず目的によっお「生成Creational」「構造Structural」「振る舞いBehavioral」の3぀の倧グルヌプに䜓系化されおいたす。

🐧 ペンギン先茩
23個も指導官、新米の僕が23個党郚を今すぐ暗蚘しなきゃいけないんでしょうか 名前を芋るだけでめたいが 
🐻‍❄ シロクマ先生
安心せい23個すべおを暗蚘する必芁はたったくない。ベテラン゚ンゞニアでも日垞的に䜿うのはそのうちの5〜7個皋床じゃ。倧事なのは「䞞暗蚘」ではなく「3぀の圹割分類」の感芚を掎むこずじゃよ

### デザむンパタヌン 3倧分類の鳥瞰図

| 分類 | 目的䜕を解決するか | 代衚的なGoFパタヌン |
| :--- | :--- | :--- |
| **生成に関するパタヌン**<br>*(Creational)* | オブゞェクトの**「むンスタンス化new」**を柔軟にし、具象クラスずの結合床を䞋げる | **Singleton**, **Factory Method**, Abstract Factory, Builder, Prototype |
| **構造に関するパタヌン**<br>*(Structural)* | クラスやオブゞェクトを組み合わせお、**柔軟で倧きな構造**をすっきりず組み立おる | **Adapter**, **Composite**, Decorator, Facade, Proxy, Bridge, Flyweight |
| **振る舞いに関するパタヌン**<br>*(Behavioral)* | オブゞェクト同士の**「連携・メッセヌゞ䌝達・圹割分担」**を敎理し、倉曎を局所化する | **Strategy**, **Observer**, **State**, Command, Template Method, Iterator, Visitor |

---

### 各分類の盎感的むメヌゞ

```
【生成系 (Creational)】
「どう生み出すか」
盎接 new するのをやめ、生成方法を隠蔜したり、唯䞀の存圚を保蚌する。
䟋: モンスタヌ生成工堎、蚭定デヌタの唯䞀むンスタンス

【構造系 (Structural)】
「どう繋ぎ合わせるか」
圢の合わないむンタヌフェヌスを倉換したり、郚品を束ねお1぀のように芋せる。
䟋: 叀いラむブラリの倉換プラグ、フォルダずファむルの階局管理

【振る舞い系 (Behavioral)】
「どう動かし合うか」
アルゎリズムを郚品化しお差し替えたり、状態倉化を仲間に䞀斉通知する。
䟋: AIの行動パタヌンの差し替え、むベント通知リスナヌ
```

3. 珟堎で頻出する兞型的パタヌンずC++コヌド実践

実務・ゲヌム開発で「これだけは絶察に抌さえおおくべき」ず蚀える超重芁パタヌンを、C++の具䜓的コヌドずずもにマスタヌしたしょう。


### ① 【生成系】Meyers' Singletonシングルトン

#### 目的ず䜿いどころ
- **目的**: プログラム党䜓で**「絶察に1぀だけしか存圚しないむンスタンス」**を保蚌し、どこからでもアクセスできるようにする。
- **䜿いどころ**: 蚭定ファむル管理ConfigManager、オヌディオ゚ンゞンSoundManager、ログ蚘録Loggerなど。

#### C++におけるベストプラクティスMeyers' Singleton
か぀おのC++03では、スレッドセヌフにするために耇雑な二重チェックロッキングDouble-Checked Lockingを曞く必芁がありたした。しかし**C++11以降では、「関数の静的ロヌカル倉数の初期化はスレッドセヌフである」ずいう蚀語仕様Magic Staticが定められたした**。
これを利甚したのが、名著『Effective C++』の著者スコット・メむダヌズが提唱した**「Meyers' Singleton」**です。

```cpp
#include <iostream>
#include <string>

class SoundManager {
public:
// コピヌず代入を明瀺的に犁止唯䞀性の担保
SoundManager(const SoundManager&) = delete;
SoundManager& operator=(const SoundManager&) = delete;
SoundManager(SoundManager&&) = delete;
SoundManager& operator=(SoundManager&&) = delete;

// 唯䞀のむンスタンスを取埗する静的関数
static SoundManager& getInstance() {
// C++11芏栌により、初回呌び出し時にスレッドセヌフに1床だけ初期化される
static SoundManager instance;
return instance;
}

void playBgm(const std::string& trackName) {
std::cout << "♪ BGM再生䞭: " << trackName << std::endl;
}

private:
// コンストラクタを private にしお倖郚からの盎接生成を犁止
SoundManager() {
std::cout << ">> SoundManager 初期化完了" << std::endl;
}
~SoundManager() = default;
};

// 䜿い方
int main() {
// どこからでも同じむンスタンスにアクセスできる
SoundManager::getInstance().playBgm("battle_theme.ogg");
SoundManager::getInstance().playBgm("victory_fanfare.ogg");
return 0;
}
```

---

### ② 【生成系】Factory Methodファクトリメ゜ッド

#### 目的ず䜿いどころ
- **目的**: 呌び出し元が具象クラス名`new Goblin()`, `new Dragon()`を盎接蚘述するのを避け、**生成ロゞックを分離・隠蔜**する。
- **䜿いどころ**: マップ䞊の敵キャラクタヌの動的出珟、ファむル拡匵子に応じた画像ロヌダヌの遞択。

```cpp
#include <iostream>
#include <memory>
#include <string>

// 共通むンタヌフェヌス
class Monster {
public:
virtual ~Monster() = default;
virtual void attack() = 0;
};

class Slime : public Monster {
public:
void attack() override { std::cout << "スラむムが䜓圓たりしおきた匱" << std::endl; }
};

class Dragon : public Monster {
public:
void attack() override { std::cout << "ドラゎンが灌熱の炎を吐いた匷" << std::endl; }
};

// ファクトリ生成クラス
class MonsterFactory {
public:
// C++11以降は生ポむンタではなく std::unique_ptr を返すのが鉄則
static std::unique_ptr<Monster> createMonster(const std::string& type) {
if (type == "slime") {
return std::make_unique<Slime>();
} else if (type == "dragon") {
return std::make_unique<Dragon>();
}
return nullptr;
}
};

// 䜿い方呌び出し偎は具䜓的な Slime や Dragon の型定矩を知る必芁がない
int main() {
auto m1 = MonsterFactory::createMonster("slime");
if (m1) m1->attack();

auto m2 = MonsterFactory::createMonster("dragon");
if (m2) m2->attack();

return 0;
}
```

---

### ③ 【構造系】Adapterアダプタ

#### 目的ず䜿いどころ
- **目的**: 「䞭身の機胜は䜿いたいが、むンタヌフェヌス関数名や匕数が合わない」既存のクラスを、**倉換プラグを噛たせお目的のむンタヌフェヌスに適合**させる。
- **䜿いどころ**: レガシヌな叀い自瀟コヌドや、倖郚サヌドパヌティ補ラむブラリを自瀟システムの蚭蚈に合わせお組み蟌みたいずき。

```cpp
#include <iostream>
#include <memory>

// 自瀟ゲヌム゚ンゞンが芁求する最新むンタヌフェヌス
class IModernAudio {
public:
virtual ~IModernAudio() = default;
virtual void playAudio(float volume) = 0;
};

// 導入したい倖郚の叀いレガシヌ音源ラむブラリ改倉䞍可
class LegacySoundLib {
public:
// 関数名も匕数0-100の敎数も自瀟芏栌ず合わない
void execute_sound_playback(int volumePercent) {
std::cout << "[Legacy Lib] 音声再生 Volume: " << volumePercent << "%" << std::endl;
}
};

// アダプタ䞡者の溝を埋める倉換プラグ
class AudioAdapter : public IModernAudio {
private:
LegacySoundLib m_legacyLib; // 委譲合成で保持
public:
void playAudio(float volume) override {
// float(0.0f - 1.0f) を int(0 - 100) に倉換しお仲介
int convertedVol = static_cast<int>(volume * 100.0f);
m_legacyLib.execute_sound_playback(convertedVol);
}
};

int main() {
// クラむアントコヌドは IModernAudio だけを芋お操䜜できる
std::unique_ptr<IModernAudio> audio = std::make_unique<AudioAdapter>();
audio->playAudio(0.85f); // 内郚で倉換されお叀いラむブラリが動く
return 0;
}
```

---

### ④ 【振る舞い系】Strategyストラテゞヌ

#### 目的ず䜿いどころ
- **目的**: アルゎリズム戊略・蚈算方法・AI思考などをクラスずしお郚品化し、**実行時に自由自圚に差し替え可胜**にする。
- **䜿いどころ**: キャラクタヌの移動・攻撃アルゎリズム、ゲヌムの難易床別AIルヌチン、決枈凊理方匏クレカ/PayPay/珟金の切り替え。

```cpp
#include <iostream>
#include <memory>

// 戊略むンタヌフェヌス
class AttackStrategy {
public:
virtual ~AttackStrategy() = default;
virtual void executeAttack() = 0;
};

// 具䜓的な戊略A: 近接剣撃
class SwordAttack : public AttackStrategy {
public:
void executeAttack() override { std::cout << "剣を激しく振り䞋ろした [近接物理]" << std::endl; }
};

// 具䜓的な戊略B: 遠距離魔法
class MagicAttack : public AttackStrategy {
public:
void executeAttack() override { std::cout << "巚倧な火球を撃ち攟った [遠距離魔法]" << std::endl; }
};

// 戊略を利甚するキャラクタヌ
class Player {
private:
std::unique_ptr<AttackStrategy> m_strategy;
public:
void setStrategy(std::unique_ptr<AttackStrategy> strategy) {
m_strategy = std::move(strategy);
}

void attack() {
if (m_strategy) {
m_strategy->executeAttack();
}
}
};

int main() {
Player player;

// 状況に応じお戊略を切り替える
player.setStrategy(std::make_unique<SwordAttack>());
player.attack(); // 剣攻撃

player.setStrategy(std::make_unique<MagicAttack>());
player.attack(); // 魔法攻撃に即座に倉化

return 0;
}
```

#### 💡 モダンC++での進化`std::function` によるクラスレスStrategy
モダンC++C++11以降では、わざわざ基底クラスや掟生クラスを䜜らなくおも、`std::function` ずラムダ匏を䜿うこずで**超軜量にStrategyパタヌンを実珟**できたす

```cpp
#include <iostream>
#include <functional>

class ModernPlayer {
public:
// 関数オブゞェクトずしお戊略を保持仮想関数のボむラヌプレヌトが䞍芁
using AttackFunc = std::function<void()>;

void setAttackAction(AttackFunc action) {
m_attackAction = action;
}

void attack() {
if (m_attackAction) m_attackAction();
}
private:
AttackFunc m_attackAction;
};

int main() {
ModernPlayer player;
// ラムダ匏でその堎で戊略を枡せる
player.setAttackAction([]() { std::cout << "匓矢で粟密射撃" << std::endl; });
player.attack();
return 0;
}
```

4. モダンC++での進化ず「パタヌン䞭毒過剰蚭蚈」の眠

デザむンパタヌンは匷力な歊噚ですが、䜿い方を誀るずコヌドベヌスを砎滅させる「毒」にもなりたす。

🐧 ペンギン先茩
指導官  実は告癜がありたす。パタヌンを孊んで嬉しくなっお、たった10行で枈むプログラムにFactoryずSingletonずObserverを党郚組み蟌んだら、クラスが8個に増えお、自分でも䜕がどこで動いおいるのか分からなくなっおしたいたした  。
🐻‍❄ シロクマ先生
ガハハ誰もが䞀床は通る通過儀瀌じゃなそれを業界では【黄金のハンマヌ症候矀】や【パタヌン䞭毒Patternitis】ず呌ぶ。「手元に金槌があるず、目に入るすべおのものが釘に芋えお叩きたくなる」ずいう心理じゃ

### 4.1 パタヌン䞭毒ず「過剰蚭蚈Over-engineering」の恐怖

デザむンパタヌンを芚えたおの新人が最も陥りやすいのが**「過剰な抜象化」**です。

- 「将来、敵の皮類が100皮類に増えるかもしれないからFactoryを䜜っおおこう」
- 「将来、画面出力先がVRになるかもしれないからBridgeずAdapterを挟んでおこう」

その結果、**「実際には敵は2皮類しか出ず、VRにも察応しなかった」**ずいうオチになり、残ったのは**無駄に難解でステップ実行すらたたならない迷宮コヌド**です。

> **蚭蚈の鉄則: YAGNI原則You Aren't Gonna Need It**
> 「今必芁な最小限のシンプルさで䜜れ。将来必芁になったその時に、初めおリファクタリングしおパタヌンを適甚すればよい」

---

### 4.2 C++特有の萜ずし穎GoFパタヌンず実行時コストvtable・ヒヌプ

GoFのデザむンパタヌン原著1994幎は、䞻に**SmalltalkやJava**ずいった「すべおがオブゞェクト参照であり、ガベヌゞコレクション前提」の蚀語思想の圱響を匷く受けおいたす。

しかし、**C++は「れロオヌバヌヘッド原則」を信条ずするハむパフォヌマンス蚀語**です。C++でGoFパタヌンを額面通りに適甚するず、以䞋の代償を支払うこずになりたす。

1. **仮想関数テヌブルvtable間接参照のコスト**:
- すべおのパタヌンを基底クラスの `virtual` 関数で実装するず、CPUのむンラむン展開が阻害され、分岐予枬ミスやキャッシュミスを誘発したす。
2. **頻繁なヒヌプ割り圓お`new` / `make_unique`**:
- 小さなオブゞェクトをヒヌプ䞊にばら撒くず、メモリ断片化ずキャッシュ局所性の䜎䞋を招きたす。

#### 🚀 モダンC++流の解決アプロヌチ

| 䌝統的GoFのアプロヌチ | モダンC++C++17/20のアプロヌチ | メリット |
| :--- | :--- | :--- |
| **動的ポリモヌフィズム**<br>(`virtual` 関数 + 継承) | **静的ポリモヌフィズム**<br>(テンプレヌト, コンセプト, CRTP) | 仮想関数呌び出しコストれロ。コンパむル時むンラむン化で爆速 |
| **Strategy パタヌン**<br>(具象戊略クラスを倚数䜜成) | **`std::function` や ラムダ匏** | クラス定矩䞍芁。コヌドが短く芋通しが良い |
| **Visitor パタヌン**<br>(耇雑なダブルディスパッチ) | **`std::variant` + `std::visit`** | 継承関係のない安党な型安党パタヌンマッチング |
| **Singleton パタヌン**<br>(グロヌバル可芖性・単䞀むンスタンス) | **䟝存性泚入DI: 参照枡し** | テスタビリティが向䞊し、隠れた倧域結合を防げる |

5. たずめ良い蚭蚈者のためのチェックリスト

パタヌンは「暗蚘しお厇める呪文」ではなく、先人ず察話するための「道具箱」です。


### パタヌン適甚前のセルフチェックリスト

コヌドを曞くずき、以䞋の質問を自分に投げかけおみおください。

- [ ] **Q1. その抜象化は「今」必芁か**
- 単なる劄想の将来予枬YAGNI違反ではないか
- [ ] **Q2. 2〜3回の重耇が実際に発生したか**
- 最初からパタヌンを圓おはめるのではなく、たずはシンプルに曞き、重耇や仕様倉曎の痛みを感じた瞬間に適甚するのがベストRule of Three。
- [ ] **Q3. C++の性胜芁件を満たしおいるか**
- ゲヌムの毎フレヌム60FPSで呌ばれるタむトなルヌプ内で、䞍甚意に仮想関数やヒヌプ割り圓おを行っおいないか
- [ ] **Q4. チヌム党員がその意図を理解できるか**
- 自己満足のトリッキヌなコヌドになっおいないか

### シロクマ指導官の金蚀
> 「デザむンパタヌンを知っおいる者は、蚭蚈のボキャブラリヌが豊富である。
> だが**真に優れた蚭蚈者ずは、『パタヌンを䜿わずに枈むなら、どこたでもシンプルに曞く』こずができる者**である。」
💡 このセクションの重芁ポむント
  • パタヌンの本質は「共通蚀語」: 蚭蚈の意図を䞀蚀でチヌムに䌝え、車茪の再発明ず地雷を回避するための先人の知恵袋。
  • å…žåž‹3倧分類を抌さえる: 生成系Singleton, Factory、構造系Adapter、振る舞い系Strategy, Observerの圹割の違いを理解する。
  • モダンC++で賢く䜿う: 仮想関数の濫甚に泚意し、std::function やテンプレヌト、ラムダ匏を組み合わせたれロオヌバヌヘッドな適甚を意識する。
  • パタヌン䞭毒過剰蚭蚈に泚意: YAGNI原則を胞に、たずはシンプルに曞き、必芁性が生じたタむミングでリファクタリングする。

📝 理解床チェッククむズ

Q1. GoFデザむンパタヌンの3倧分類生成・構造・振る舞いのうち、「振る舞いに関するパタヌンBehavioral」に分類されるものはどれですか
  • 1. Singleton パタヌン
  • 2. Strategy パタヌン
  • 3. Adapter パタヌン
  • 4. Factory Method パタヌン
正解ず解説を芋る
正解Strategy パタヌン
Strategy や Observer はオブゞェクト間のアルゎリズムや責任の委譲、むベント通知などの動的な協調関係を定矩する「振る舞いBehavioral」パタヌンです。Singleton や Factory は生成系、Adapter は構造系に分類されたす。
Q2. C++11以降で「スレッドセヌフな Singleton」を最も安党か぀シンプルに実装する手法Meyers' Singletonずしお正しいものはどれですか
  • 1. グロヌバル倉数ずしおむンスタンスを事前定矩しおおく
  • 2. getInstance() 関数内のロヌカル静的倉数static MyClass instance;ずしお定矩し、その参照を返す
  • 3. std::mutex を䜿っお手動で二重チェックロッキングDCLPを組む
  • 4. ヒヌプ䞊に new しおポむンタを volatile 修食する
正解ず解説を芋る
正解getInstance() 関数内のロヌカル静的倉数static MyClass instance;ずしお定矩し、その参照を返す
C++11の蚀語仕様においお「関数のロヌカル静的倉数の初期化はスレッドセヌフである」ず明蚘されたため、関数内の `static T instance;` を返すだけでミュヌテックスの明瀺的ロックなしに完党安党なシングルトンが実珟したす。
Q3. デザむンパタヌンを適甚する際、初心者が陥りがちな「パタヌン䞭毒過剰蚭蚈」を防ぐための適切な指針はどれですか
  • 1. すべおのクラスに必ずGoFのいずれかのパタヌンを1぀以䞊適甚する
  • 2. 「い぀か䜿うかもしれない」ずいう将来予枬で䜜らずYAGNI原則、たずはシンプルに曞き、重耇や倉曎の痛みが発生した段階でリファクタリングずしお適甚する
  • 3. すべおの関数呌び出しを仮想関数テヌブル経由にする
  • 4. デザむンパタヌンの䜿甚をプロゞェクト党䜓で䞀切犁止する
正解ず解説を芋る
正解「い぀か䜿うかもしれない」ずいう将来予枬で䜜らずYAGNI原則、たずはシンプルに曞き、重耇や倉曎の痛みが発生した段階でリファクタリングずしお適甚する
デザむンパタヌンは目的ではなく手段です。最初から過床に抜象化するず可読性ず実行速床が䜎䞋したす。YAGNIYou Aren't Gonna Need Itを意識し、3回重耇した時Rule of Threeや仕様倉曎が生じたタむミングで適甚するのがベストプラクティスです。

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

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

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