C++ããã°ã©ãã®ããã®UMLèšèšæžå
¥é
ãã³ãŒããšèšèšå³ã®çžäºå€æãå®å
šãã¹ã¿ãŒã
ãã³ãŒãã¯æžãããèšèšæžãæžããªãããUMLã®ç¢å°ã®æå³ãåãããªãããšãããšã³ãžãã¢ãžãã¯ã©ã¹å³ã»ã·ãŒã±ã³ã¹å³ã»ã¹ããŒããã·ã³å³ã®èªã¿æžããšãC++ã³ãŒããšã®å³å¯ãªå¯Ÿå¿èŠåã培åºè§£èª¬ããŸãã
1.1 ãªãããã°ã©ãã«UMLèšèšæžãå¿
èŠãªã®ãïŒ
ãåãã³ãŒããæ£çŸ©ãªãã ãããèšèšæžãªããŠç¡é§ã§ã¯ïŒããšæããããããŸããããããããããžã§ã¯ãã倧ãããªã£ããšããèšèšå³ãæããªãããŒã ã¯å¿
ã厩å£ããŸãã
ð§ ãã³ã®ã³å
茩
æå°å®ïŒçŸå Žã§ãUMLã®ã¯ã©ã¹å³æžããŠã¬ãã¥ãŒåºããŠãã£ãŠèšããããã§ãããC++ã®ã³ãŒãããæžããã°èšèšå³ãªããŠãããªãããããªãã§ããïŒ äºåºŠæéã«æãã¡ãããŸãâŠïŒ
ð»ââïž ã·ãã¯ãå
ç
ãµãã£ãµãã£ãµãïŒçããçãããã³ã®ã³ïŒå®¶ã建ãŠã倧工ããå³é¢ãªãã§ãšããããæ±ãç«ãŠãŠã¿ããããšèšã£ãã誰ãäœããããïŒ ã³ãŒãã¯ã1æã®å£ã®ã¬ã³ã¬ããUMLã¯ãå®¶å
šäœã®å»ºç¯éåçããªã®ããïŒ
### UMLïŒUnified Modeling LanguageïŒããããã3倧䟡å€
1. **ã³ãŒãã®æ£®ã«å
¥ãåã«ãé³¥ç°å³ïŒãã¯ãèŠç¹ïŒããå
±æã§ãã**:
äœåè¡ããããœãŒã¹ã³ãŒãã1è¡ãã€èªãã§ã¯ã©ã¹å士ã®é¢ä¿æ§ãææ¡ããã®ã¯è³ã®ã¡ã¢ãªã浪費ããŸãã1æã®UMLå³ãããã°ã5ç§ã§ã誰ãèª°ãææããŠãããããå
šå¡ã«äŒãããŸãã
2. **ææ»ãïŒä»æ§å€æŽã»èšèšç Žç¶»ïŒã®ã³ã¹ããæ¿æžããã**:
ã³ãŒããæžãçµããŠããããããã®èšèšã ãšåŸªç°åç
§ã§è§£æŸã§ããªãããå€éç¶æ¿ã§ç Žç¶»ããããšæ°ã¥ããšãä¿®æ£ã«äœæ¥ãããããŸããèšèšå³ã®æ®µéãªãããã¯ã€ãããŒãã®ç·ã1æ¬åŒãçŽãã ãã§è§£æ±ºããŸãã
3. **ããŒã ã»ãã¹ã¿ãŒã»çºæ³šå
ãšã®å
±éèšèªã«ãªã**:
C++ã®çްããææ³ïŒãã³ãã¬ãŒãã®ç¹æ®åããã€ã³ã¿ã®ãã£ã¹ãïŒãç¥ããªããã¹ã¿ãŒããããŒãžã£ãŒã§ããUMLã®ã¯ã©ã¹å³ãç¶æ
é·ç§»å³ãªãã·ã¹ãã ã®æ¯ãèããæ£ç¢ºã«çè§£ã§ããŸãã
1.2 ã¯ã©ã¹å³ã®åºæ¬èšå·ãšC++ã¢ã¯ã»ã¹æå®åã®å®å
šå¯Ÿå¿
UMLã¯ã©ã¹å³ã¯ãäžçå
±éã®ã3段ããã¯ã¹ãã§æãããŸããèšå·ã®ã«ãŒã«ããèŠããã°ãäžåŠçã§ãèªããããã«ãªããŸãã
::uml-class-box::
### ã¢ã¯ã»ã¹ä¿®é£ŸåãšUMLèšå·ã®å®å
šå¯Ÿå¿è¡š
| UMLèšå· | æå³ | C++ã®ã¢ã¯ã»ã¹æå®å | çŸå Žã§ã®äœ¿ããæ¹ |
| :---: | :--- | :--- | :--- |
| **`+`** | **public** (å
¬é) | `public:` | 誰ã§ãåŒã¹ãçªå£ãæäœã¡ãœãããå€éšå
¬éã€ã³ã¿ãŒãã§ãŒã¹ã |
| **`-`** | **private** (é èœ) | `private:` | ãã®ã¯ã©ã¹å
ã ããã¡ã³ã倿°ã¯ååãã¹ãŠããïŒã«ãã»ã«åïŒã |
| **`#`** | **protected** (ä¿è·) | `protected:` | èªåãšæŽŸçã¯ã©ã¹ã ããç¶æ¿é¢ä¿ã§ã®ã¿å
±æãããããŒã¿ã |
| **`~`** | **package** (åããã±ãŒãž) | ïŒC++ã«ã¯çŽæ¥ã®å¯Ÿå¿ç©ãªãïŒ | C++ã§ã¯ `friend` æå®ãåäžç¡ååå空éã«çžåœã |
#### å衚èšã®é åºã®éãïŒC++ãšéãªã®ã§æ³šæïŒïŒ
- C++: `int m_hp;` / `void takeDamage(int amount);`
- UML: `m_hp: int` / `takeDamage(amount: int): void`
â»UMLã§ã¯ãååãå
ãåãåŸïŒã³ãã³åºåãïŒãã§èšè¿°ããŸããPascalãRustãTypeScriptãšåãã¹ã¿ã€ã«ã§ãã
1.3 é¢ä¿æ§ãèŠæãã5倧ç¢å°ãã®äœ¿ãåã
UMLã§æãéèŠãªã®ããç¢å°ã®åœ¢ãã§ããç¢å°ã®çš®é¡ã«ãã£ãŠãC++ã³ãŒãã§ã®ã¡ã¢ãªæææš©ãã©ã€ããµã€ã¯ã«ãå
šãç°ãªããŸãã
ð§ ãã³ã®ã³å
茩
ãããâŠïŒãé»è±åœ¢ïŒã³ã³ããžã·ã§ã³ïŒããšãçœè±åœ¢ïŒéçŽïŒãã®éãã£ãŠãC++ã® `unique_ptr`ïŒåç¬ææïŒãš `shared_ptr`ïŒå
±æææïŒã«ãã®ãŸãŸçŽçµããŠãããã§ããïŒ
ð»ââïž ã·ãã¯ãå
ç
ãããªãããïŒèšèšæžã§é»è±åœ¢ãæãããŠããã®ã«ãC++åŽã§çãã€ã³ã¿ã§éã«æŸçœ®ããŠè§£æŸãå¿ããããèšèšéåã®ã¡ã¢ãªãªãŒã¯ãã«ãªããèšèšå³ãšã³ãŒãã¯è¡šè£äžäœãªã®ããïŒ
::uml-arrow-guide::
### 1. æ±åã»ç¶æ¿ïŒGeneralizationïŒ: `âââââ`
- **ç¢å°**: **çœæãã®äžè§ããã ïŒ å®ç·**
- **C++ã³ãŒã**: `class Boss : public Enemy { ... };`
- **æå³**: ãBoss 㯠Enemy ã®äžçš®ã§ããïŒis-aé¢ä¿ïŒããåºåºã¯ã©ã¹ã®åã§æŽŸçã¯ã©ã¹ã倿
çã«æ±ããŸãã
---
### 2. å®çŸïŒRealizationïŒ: `â- - - -`
- **ç¢å°**: **çœæãã®äžè§ããã ïŒ ç Žç·**
- **C++ã³ãŒã**: çŽç²ä»®æ³é¢æ°ïŒ`= 0;`ïŒã®ã¿ãæã€ã€ã³ã¿ãŒãã§ãŒã¹ã¯ã©ã¹ã®ç¶æ¿ã
- **æå³**: å¥çŽïŒã€ã³ã¿ãŒãã§ãŒã¹ïŒã«å®ããããæ¯ãèããå
·äœçã«å®è£
ããããšã
---
### 3. ã³ã³ããžã·ã§ã³ïŒCompositionïŒ: `âââââ>`
- **ç¢å°**: **é»å¡ãã®è±åœ¢ ïŒ å®ç·**
- **C++ã³ãŒã**:
- `Weapon m_weapon;`ïŒå®äœã¡ã³ãïŒ
- `std::unique_ptr<Weapon> m_weapon;`ïŒåç¬ææã¹ããŒããã€ã³ã¿ïŒ
- **æå³**: **ã匷åºãªææïŒéé£ãé¢ä¿ïŒã**ã芪ïŒPlayerïŒãæ»ã¬ãšãåïŒWeaponïŒã確å®ã«åæã«æ¶æ»
ããŸããå
šäœãšéšåãåœéãå
±ã«ããŸãã
---
### 4. éçŽïŒAggregationïŒ: `âââââ>`
- **ç¢å°**: **çœæãã®è±åœ¢ ïŒ å®ç·**
- **C++ã³ãŒã**:
- `std::shared_ptr<SoundData> m_sound;`
- **æå³**: **ãå
±æææã**ãèŠªãæ»ãã§ããåã¯ä»ã®èª°ãã䜿ã£ãŠããéãçãç¶ããŸãã
---
### 5. é¢é£ïŒAssociationïŒ: `âââââ>`
- **ç¢å°**: **éããç¢å° ïŒ å®ç·**
- **C++ã³ãŒã**:
- `Enemy* m_target;`ïŒçãã€ã³ã¿ã«ããåç
§ïŒ
- `const Map& m_map;`ïŒåç
§ã«ãã芳å¯ïŒ
- **æå³**: **ãåãªãåç
§ã»å©çšã**ãçžæã®å¯¿åœã«ã¯äžå責任ãæã¡ãŸãããçžæãå
ã«æ»ã¬ãšãã³ã°ãªã³ã°ãã€ã³ã¿ã®å±éºããããŸãã
1.4 ã·ãŒã±ã³ã¹å³ã§åçãªãæé軞ã®åŒã³åºãããå¯èŠåãã
ã¯ã©ã¹å³ã¯ãéçãªæ§é ïŒéªšæ ŒïŒãã衚ããŸããããå®è¡æã«èª°ã誰ãåŒã¶ã®ãïŒæéè»žã®æµãïŒãã¯è¡šçŸã§ããŸãããããã§ç»å Žããã®ãã·ãŒã±ã³ã¹å³ã§ãã
### ã·ãŒã±ã³ã¹å³ã®æ§æèŠçŽ
::uml-sequence-sample::
- **ã©ã€ãã©ã€ã³ïŒç¹ç·ã®çžŠç·ïŒ**: ãã®ãªããžã§ã¯ããçåããŠããæé軞ã
- **å®è¡å¯èœåºéïŒã¢ã¯ãã£ããŒã·ã§ã³ããŒïŒ**: ãã®ãªããžã§ã¯ããåŠçãå®è¡äžã®æéïŒé·æ¹åœ¢ã®ããŒïŒã
- **å®ç·ç¢å°ïŒ`ââ>`ïŒ**: åæé¢æ°åŒã³åºãïŒåŒã°ããåŽãçµãããŸã§åŒã³åºãå
ã¯åŸ
ã€ïŒã
- **ç Žç·ç¢å°ïŒ`- - ->`ïŒ**: åŠçå®äºåŸã®æ»ãå€ïŒreturnïŒã
ã²ãŒã ã®1ãã¬ãŒã æŽæ°åŠçïŒ`Input` -> `Player::update` -> `Collision::check` -> `Render`ïŒãã·ãŒã±ã³ã¹å³ã§æããšã**ãåŠçã®é åºäŸåïŒãªãåœããå€å®ã®åã«ç§»åãããªããã°ãªããªãã®ãïŒã**ãäžç®çç¶ã«ãªããŸãã
1.5 ã¹ããŒããã·ã³å³ã§ãç¶æ
ã®ççŸããæ²æ»
ãã
ãããŒãºäžã«åŒŸãåããŠããŸãããã²ãŒã ãªãŒããŒãªã®ã«èªæ©ãããŒå
¥åã«åå¿ãããããããªãã°ãæ ¹çµ¶ããããã®æåŒ·èšèšå³ã§ãã
### ç¶æ
é·ç§»å³ïŒState Machine DiagramïŒã®3倧èŠçŽ
::uml-state-sample::
1. **ç¶æ
ïŒStateïŒ**: äžžè§ã®åè§åœ¢ã§è¡šãïŒäŸ: `Title`, `Playing`, `Pause`, `GameOver`ïŒã
2. **ã€ãã³ãïŒEvent / é·ç§»ããªã¬ãŒïŒ**: ç¢å°ã®äžã®ã©ãã«ãäœãèµ·ãããç¶æ
ãå€ãããïŒããŒå
¥åãæéçµéãè¡çªïŒã
3. **ã¬ãŒãæ¡ä»¶ïŒGuard `[æ¡ä»¶åŒ]`ïŒ**: ãã®ã€ãã³ããèµ·ããŠãããã®æ¡ä»¶ãæºãããªããšé·ç§»ããªãã¬ãŒãïŒäŸ: `[hp <= 0]`ïŒã
4. **ã¢ã¯ã·ã§ã³ïŒAction `/åŠç`ïŒ**: é·ç§»ã®ç¬éã«å®è¡ããåŠçïŒäŸ: `/playGameOverBgm()`ïŒã
第5ç« ã§åŠãã **GoFã®Stateãã¿ãŒã³** ã¯ããã®ã¹ããŒããã·ã³å³ã®ãåç¶æ
ãããã®ãŸãŸ1ã€ã®C++ã¯ã©ã¹ã«èœãšã蟌ãã ãã®ã§ããèšèšå³ãæããã°ãã³ãŒãã¯èªåçã«æ±ºãŸããŸãã
1.6 å®è·µæŒç¿ïŒèšèšæž â C++ã³ãŒãã®çžäºå€æ
å®åã§æã圹ç«ã€ãèšèšæžããã³ãŒããèµ·ããããã³ãŒãããèšèšæžãæããæèããã»ã¹ã宿ŒããŸãã
### ãã¿ãŒã³AïŒèšèšæžããã³ãŒããèµ·ããïŒForward EngineeringïŒ
èšèšæžã« `Game 1 ââââ * Enemy` ãšãããEnemyã `+ virtual void move() = 0;` ãšå®çŸ©ãããŠããå ŽåïŒ
```cpp
// èšèšæžéãã®C++å®è£
class Enemy {
public:
virtual ~Enemy() {}
virtual void move() = 0; // çŽç²ä»®æ³é¢æ°
};
class Game {
private:
// ãââââ *ãã¯Gameãè€æ°ã®Enemyãå®å
šææããŠããããšã衚ã
std::vector<std::unique_ptr<Enemy>> m_enemies;
};
```
### ãã¿ãŒã³BïŒã³ãŒãããèšèšæžãæãïŒReverse EngineeringïŒ
æ¢åã³ãŒãã« `void setTarget(Enemy* target);` ãšãã£ããïŒ
- çãã€ã³ã¿ã§åãåã£ãŠãã ïŒ æææš©ã¯ç§»è²ãããªãã
- ã¯ã©ã¹å³ã§ã¯ **ãé¢é£ïŒ`ââ>`ïŒã** ã®ç·ãåŒããå€é床㯠`0..1`ïŒã¿ãŒã²ãããªãããŸãã¯1äœïŒãšæããŸãã
ð¡ ãã®ã»ã¯ã·ã§ã³ã®éèŠãã€ã³ã
- UMLã¯C++ã¡ã¢ãªã¢ãã«ã®åãçµµ: ã³ã³ããžã·ã§ã³ã¯å®äœ/unique_ptrãéçŽã¯shared_ptrãé¢é£ã¯çãã€ã³ã¿ãèšå·ã®æå³ãç¥ãã°ãèšèšæžã¯ãã®ãŸãŸå
ç¢ãªC++ã³ãŒãã«ãªããŸãã
ð ç解床ãã§ãã¯ã¯ã€ãº
Q1. UMLã¯ã©ã¹å³ã®å±æ§è¡šèšã§ `- m_health: int` ãšæžãããŠããå ŽåãC++ã³ãŒãã§ã®æ£ããå®è£
ã¯ã©ããïŒ
- 1. public: int m_health;
- 2. private: int m_health;
- 3. protected: int m_health;
- 4. inline int m_health = -1;
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒprivate: int m_health;
UMLã«ããããã€ãã¹èšå·ïŒ`-`ïŒã¯ private ã¢ã¯ã»ã¹ã衚ããå€éšããã®æ¹ãããé²ãã«ãã»ã«åãããã¡ã³ã倿°ã«å¯Ÿå¿ããŸãã
Q2. ã¯ã©ã¹Aããã¯ã©ã¹Bã«åãã£ãŠãé»å¡ãã®è±åœ¢ïŒâââ>ïŒãã®ç¢å°ãåŒãããŠããïŒã³ã³ããžã·ã§ã³ïŒå Žåãæ£ãã説æã¯ã©ããïŒ
- 1. A ãš B ã¯ãäºãã®ååšãç¥ããªãççµåã§ãã
- 2. A 㯠B ãåŒ·ãææããŠãããA ãç Žæ£ããããš B ãèªåçã«ç Žæ£ãããïŒå¯¿åœãé£åããïŒ
- 3. B ã A ã®åºåºã¯ã©ã¹ã§ãããA 㯠B ãç¶æ¿ããŠãã
- 4. A 㯠B ã®é¢æ°ããã«ãã¹ã¬ããã§éåæåŒã³åºããã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒA 㯠B ãåŒ·ãææããŠãããA ãç Žæ£ããããš B ãèªåçã«ç Žæ£ãããïŒå¯¿åœãé£åããïŒ
é»å¡ãã®è±åœ¢ïŒã³ã³ããžã·ã§ã³ïŒã¯ãåŒ·ãææãã衚ãã芪ã®å¯¿åœãå°œãããšãåãéé£ãã§ç Žæ£ãããŸããC++ã§ã¯å®äœã¡ã³ãã std::unique_ptr ã«å¯Ÿå¿ããŸãã
Q3. C++ã®åºåºã¯ã©ã¹ `Enemy` ãæŽŸçã¯ã©ã¹ `NormalEnemy` ãç¶æ¿ïŒ`class NormalEnemy : public Enemy`ïŒããŠããé¢ä¿ãUMLã§è¡šãæ£ããç¢å°ã¯ã©ããïŒ
- 1. é»å¡ãã®è±åœ¢ãããã®å®ç·ïŒâââ>ïŒ
- 2. éããç¢å°ã®ç Žç·ïŒ- - ->ïŒ
- 3. çœæãã®äžè§ãããã®å®ç·ïŒââââïŒ
- 4. çœæãã®è±åœ¢ãããã®å®ç·ïŒâââ>ïŒ
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒçœæãã®äžè§ãããã®å®ç·ïŒââââïŒ
UMLã«ãããŠç¶æ¿ïŒæ±å: GeneralizationïŒã¯ãçœæãã®äžè§ç¢å°ïŒââââïŒãã§è¡šããŸããæŽŸçã¯ã©ã¹ããåºåºã¯ã©ã¹ã«åãã£ãŠç¢å°ãåŒããŸãã
Q4. ã·ãŒã±ã³ã¹å³ã«ãããŠãåçŽã«äŒžã³ãç¹ç·ïŒã©ã€ãã©ã€ã³ïŒã衚ããŠãããã®ã¯ã©ããïŒ
- 1. ãã®ãªããžã§ã¯ããå æããŠããã¡ã¢ãªãµã€ãº
- 2. ãã®ãªããžã§ã¯ããååšïŒçåïŒããŠããæé軞
- 3. ããã°ã©ã ã®ã³ã³ãã€ã«æé
- 4. ãããã¯ãŒã¯ã®åž¯åå¹
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒãã®ãªããžã§ã¯ããååšïŒçåïŒããŠããæé軞
ã·ãŒã±ã³ã¹å³ã®ã©ã€ãã©ã€ã³ïŒç¹ç·ã®çžŠç·ïŒã¯ããã®ãªããžã§ã¯ããçæãããŠããç Žæ£ããããŸã§ã®ãæé軞ãã衚ããŠããŸãã
ð»ââïž ã·ãã¯ãC++ã©ã ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ã·ã¹ãã
ãã©ãŠã¶ã§JavaScriptãæå¹ã«ãããšããã©ãŠã¶å
ã€ã³ããŒããŒã²ãŒã ãšãã¥ã¬ãŒã¿ãã¡ã¢ãªãããå¯èŠåãUMLã¯ã©ã¹å³ã察話å解説ãç解床ã¯ã€ãºãèµ·åããŸãã
ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ãéå§ãã â