ã€ã³ã¹ãã¬ãŒã·ã§ã³ã®æº
ãã®æçš¿ã¯ããžã¥ãã¢ããã°ã©ãåãã®ã¬ããŒãã«é¢ããAras Prantskevichusã«ããæè¿ã®å ¬éã®çµæãšããŠçãŸããŸããã æ°ããECSã¢ãŒããã¯ãã£ã«é©å¿ããæ¹æ³ã«ã€ããŠèª¬æããŸãã Arasã¯éåžžã®ãã¿ãŒã³ïŒ 以äžã®èª¬æ ïŒã«åŸããŸãïŒã²ã©ãOOPã³ãŒãã®äŸã瀺ãããªã¬ãŒã·ã§ãã«ã¢ãã«ãåªãã代æ¿ãœãªã¥ãŒã·ã§ã³ã§ããããšã瀺ããŸãïŒ ãã ã ããªã¬ãŒã·ã§ãã«ã¢ãã«ã§ã¯ãªããECSããšåŒã³ãŸã ïŒã Arasãæ¹å€ããããšã¯æ±ºããŠãããŸãããç§ã¯åœŒã®äœåã®å€§ãã¡ã³ã§ããã圌ã®åªãããã¬ãŒã³ããŒã·ã§ã³ã称è³ããŠããŸãïŒ ã€ã³ã¿ãŒãããããã®ECSã«é¢ããä»ã®äœçŸãã®æçš¿ã®ä»£ããã«åœŒã®ãã¬ãŒã³ããŒã·ã§ã³ãéžãã ã®ã¯ã圌ãäœåãªåªåãããŠããã¬ãŒã³ããŒã·ã§ã³ãšäžŠè¡ããŠç 究ã®ããã«gitãªããžããªãå ¬éããããã§ãã ããŸããŸãªã¢ãŒããã¯ãã£ãœãªã¥ãŒã·ã§ã³ã®éžæã®äŸãšããŠäœ¿çšãããå°ããªã·ã³ãã«ãªãã²ãŒã ããå«ãŸããŠããŸãã ãã®å°ããªãããžã§ã¯ãã«ãããç¹å®ã®çŽ æã«é¢ããã³ã¡ã³ãã瀺ãããšãã§ããŸãããããããšããArasïŒ
Arasã®ã¹ã©ã€ãã¯ã http ïŒ //aras-p.info/texts/files/2018Academy-ECS-DoD.pdfã§å ¥æã§ããŸã ãã³ãŒãã¯githubïŒ https : //github.com/aras-p/dod-playgroundã«ãããŸã ã
ãã®ã¬ããŒãããåŸãããECSã¢ãŒããã¯ãã£ãïŒãŸã ïŒïŒåæããã€ããã¯ãããŸããããæåãããäžæ£ãªOOPãã³ãŒãïŒè©°ã蟌ã¿ããªãã¯ã«äŒŒãŠããŸãïŒã«çŠç¹ãåœãŠãŸãã OODã®ååïŒãªããžã§ã¯ãæåèšèšããªããžã§ã¯ãæåèšèšïŒã®ãã¹ãŠã®éåãæ£ããä¿®æ£ãããå Žåãå®éã«ã©ã®ããã«èŠãããã瀺ããŸãã
ãã¿ãã¬ïŒãã¹ãŠã®OODéåãæé€ãããšãArasããECSãžã®å€æãšåæ§ã«ããã©ãŒãã³ã¹ãåäžããŸãããŸããECSããŒãžã§ã³ãããRAMãå°ãªããå¿ èŠãªã³ãŒãè¡ãå°ãªããªããŸãã
TL; DRïŒOOPãåžã蟌ãŸããŠECSãæ瞊ããããšçµè«ä»ããåã«ãäžæåæ¢ããŠOODã調ã¹ãŠïŒOOPãæ£ãã䜿çšããæ¹æ³ãç¥ãïŒããªã¬ãŒã·ã§ãã«ã¢ãã«ãç解ããïŒECSãæ£ããé©çšããæ¹æ³ãç¥ãïŒ
ç§ã¯ãã®ã¢ãã«ãå¥ã®çšèªãšããŠååšããã«å€ãããšã¯æããªãããïŒ ã¹ãã€ã©ãŒïŒããã¯åãªããªã¬ãŒã·ã§ãã«ã¢ãã«ã®ã¢ãããã¯ããŒãžã§ã³ã§ã ïŒããŸãããã©ãŒã©ã ã§ECSã«é¢ããå€ãã®è°è«ã«é·ãéåå ããŠããŸãã ECSãã¿ãŒã³ã宣äŒããã»ãŒãã¹ãŠã®æçš¿ããã¬ãŒã³ããŒã·ã§ã³ããŸãã¯èšäºã¯ã次ã®æ§é ã«åŸããŸãã
- ã²ã©ãOOPã³ãŒãã®äŸã瀺ããŸãããã®å®è£
ã«ã¯ãç¶æ¿ã®éå°ãªäœ¿çšã«ããã²ã©ãæ¬ é¥ããããŸãïŒã€ãŸãããã®å®è£
ã¯OODã®å€ãã®ååã«éåããŠããŸãïŒã
- æ§æãç¶æ¿ãããåªãããœãªã¥ãŒã·ã§ã³ã§ããããšã瀺ãããïŒãããŠãOODãå®éã«åãã¬ãã¹ã³ãæäŸããããšã¯èšããŸã§ããããŸããïŒã
- ãªã¬ãŒã·ã§ãã«ã¢ãã«ãã²ãŒã ã«æé©ã§ããããšã瀺ããŸãïŒãã ãããECSããšåŒã³ãŸãïŒã
ïŒAïŒããã¯ãè©°ã蟌ã¿ãã®ããªãã¯ã§ã...ãœãããšãŠã©ãŒã ïŒæªãã³ãŒããšè¯ãã³ãŒãïŒãæ¯èŒããŸã...ãããŠãããã¯æå³ããã«è¡ãããæ°ããã¢ãŒããã¯ãã£ãè¯ãããšã瀺ãå¿ èŠããªãå Žåã§ãäžå ¬å¹³ã§ãã ãããŠãããã«éèŠãªããšïŒ ïŒBïŒå¯äœçšããããŸã-ãã®ãããªã¢ãããŒãã¯ç¥èãæå¶ããèªè ãåäžçŽã«ããã£ãŠè¡ãããç 究ã«äžæ³šæã«åæ©ä»ããŠããŸããŸãã ãªã¬ãŒã·ã§ãã«ã¢ãã«ã¯ã1960幎代ã«åããŠäœæãããŸããã 70幎代ãš80幎代ãéããŠããã®ã¢ãã«ã¯å€§å¹ ã«æ¹åãããŸããã åå¿è ã«ã¯ã ãã®ããŒã¿ãã©ã®ã¯ã©ã¹ã«å ¥ãããã§ããïŒ ããªã©ã®è³ªåããããããŸã ããŸããããã«å¿çããŠãã çµéšãç©ãã ãã§å å¿ãç解ããã ã ããªã©ããããŸããªããšãããèšãããŸã ...å匷ããäžè¬çãªã±ãŒã¹ã§ã¯æ£åŒãªçããæšæž¬ãããŸããã ããã¯ã ããŒã¿ããŒã¹ã®æ£èŠåãšåŒã°ããŸã ã æ¢åã®ç 究ãç Žæ£ããECSããŸã£ããæ°ããææ°ã®ãœãªã¥ãŒã·ã§ã³ãšåŒã¶ããšã§ããã®ç¥èãåå¿è ããé ãããšãã§ããŸãã
ãªããžã§ã¯ãæåããã°ã©ãã³ã°ã®åºæ¬ã¯ããã以åã§ã¯ãªãã«ããŠããããªãåã«èšå®ãããŸããïŒ ãã®ã¹ã¿ã€ã«ã¯ã1950幎代ã®ç 究ã§æ¢ç©¶ããå§ããŸãã ïŒïŒ ãããããªããžã§ã¯ãæåãæµè¡ããå£ã³ãã§åºãŸããããã«æ¯é çãªããã°ã©ãã³ã°ãã©ãã€ã ã«ãªã£ãã®ã¯ã1990幎代ã®ããšã§ãã JavaãïŒ æšæºåããŒãžã§ã³ ïŒC ++ãå«ãå€ãã®æ°ããOOèšèªã®äººæ°ãççºçã«é«ãŸã£ãŠããŸãã ããããããã¯èªå€§å®£äŒã«ãããã®ã ã£ããããå±¥æŽæžã«æžãããã«èª°ãããã®æåãªæŠå¿µãç¥ãå¿ èŠããããŸããããå®éã«ã¯ã»ãã®å°æ°ããå ¥ã£ãŠããŸããã§ããã ãããã®æ°ããèšèªã¯ããªããžã§ã¯ãæåã®å€ãã®æ©èœããããŒã¯ãŒãã class ã virtual ã extends ã implementsãäœæããŸããããã®ããããªããžã§ã¯ãæåã2ã€ã®ç¬ç«ãããšã³ãã£ãã£ã«åå²ãããç¬èªã®ç掻ãéã£ãŠããŸãã
ãããã®ãªããžã§ã¯ãæåã®èšèªæ©èœã®äœ¿çšãã OOP ããšåŒã³ããªããžã§ã¯ãæåã®èšèš/ã¢ãŒããã¯ãã£æè¡ã®äœ¿çšãã OOD ããšåŒã³ãŸãã ãã¹ãŠãããã«OOPãåãäžããŸããã æè²æ©é¢ã«ã¯ãæ°ããOOPããã°ã©ããçŒãOOã³ãŒã¹ããããŸãããOODã®ç¥èã¯é ããŠããŸãã
OOPã®èšèªæ©èœã䜿çšããŠããããOODèšèšã®ååã«åŸã£ãŠããªãã³ãŒãã¯ãOOã³ãŒãã§ã¯ãªããšèããŠããŸã ã OOPã«å¯Ÿããã»ãšãã©ã®æ¹å€ã§ã¯ãããšãã°ã¬ããã³ãŒãã䜿çšããŠããŸãããããã¯å®éã«ã¯OOã³ãŒãã§ã¯ãããŸããã
OOPã³ãŒãã¯éåžžã«è©å€ãæªããç¹ã«OOPã³ãŒãã®ã»ãšãã©ã¯OODã®ååã«åŸã£ãŠããªãããããçã®ãOOã³ãŒãã§ã¯ãããŸããã
èæ¯
åè¿°ã®ããã«ã1990幎代ã¯ãOOã®æµè¡ãã®ããŒã¯ã«ãªãããã®æç¹ã§ãäžè¯OOPããããããææªã§ããã ãã®æç¹ã§OOPãåŠãã å ŽåããOOPã®4ã€ã®æ±ãã«ã€ããŠç¥ã£ãŠããå¯èœæ§ãé«ãã§ãããã
- æœè±¡å
- ã«ãã»ã«å
- å€å
- ç¶æ¿
ç§ã¯ãããã4ã€ã®æ±ã§ã¯ãªããã4ã€ã®OOPããŒã«ããšåŒã¶ããšã奜ã¿ãŸãã ãããã¯ãåé¡ã解決ããããã«äœ¿çšã§ããããŒã«ã§ã ã ãã ããããŒã«ãã©ã®ããã«æ©èœããããç¥ãã ãã§ã¯ååã§ã¯ãããŸããããã€äœ¿çšããããç¥ãå¿ èŠããããŸããæåž«ã«ãšã£ãŠãæ°ããããŒã«ã人ã ã«æããããšã¯ç¡è²¬ä»»ã§ãã 2000幎代åæã«ã¯ããããã®ããŒã«ã®ç©æ¥µçãªèª€çšãã€ãŸãOODæèã®äžçš®ã®ã第2ã®æ³¢ãã«å¯ŸããæµæããããŸããã ãã®çµæã SOLIDããŒã¢ããã¯ãåºçŸããŸãããããã«ãããã¢ãŒããã¯ãã£ã®é·æãè¿ éã«è©äŸ¡ã§ããŸãã ãã®ç¥æµã¯å®éã«ã¯90幎代ã«åºãŸã£ããããŸã 5ã€ã®åºæ¬ååãšããŠä¿®æ£ã§ããããã«ããã¯ãŒã«ãªé åèªããŸã åãåã£ãŠããªãããšã«æ³šæãã¹ãã§ã...
- å¯äžã®è²¬ä»»ã®åå ïŒ S責任ã®ååïŒã åã¯ã©ã¹ã«ã¯ãå€æŽã®çç±ã1ã€ã ãå«ããå¿ èŠããããŸãã ã¯ã©ã¹ãAãã«2ã€ã®è²¬ä»»ãããå Žåãã¯ã©ã¹ãBãããã³ãCããäœæããŠãããããåå¥ã«åŠçãããBãããã³ãCããããAããäœæããå¿ èŠããããŸãã
- éæŸæ§/ééæ§ã®åå ïŒ Oãã³/ééæ§ååïŒã ãœãããŠã§ã¢ã¯æéãšãšãã«å€åããŸãïŒ ã€ãŸãããã®ãµããŒãã¯éèŠã§ã ïŒã å®è£
ïŒ ã€ãŸããç¹å®ã®ã¯ã©ã¹ ïŒ ã§æãå€æŽãããå¯èœæ§ãé«ãéšåãé
眮ããå€æŽãããå¯èœæ§ãäœãéšåïŒ ããšãã°ãæœè±¡åºæ¬ã¯ã©ã¹ ïŒã«åºã¥ããŠã€ã³ã¿ãŒãã§ã€ã¹ãäœæããŠãã ããã
- ããŒãã©ã»ãªã¹ã³ãã®ä»£çšåç ïŒ Lã€ã¹ã³ã代çšåçïŒã ã€ã³ã¿ãŒãã§ãŒã¹ã®åå®è£ ã¯ããã®ã€ã³ã¿ãŒãã§ãŒã¹ã®èŠä»¶ã100ïŒ æºããå¿ èŠããããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ã§åäœããã¢ã«ãŽãªãºã ã¯ãã©ã®å®è£ ã§ãåäœããã¯ãã§ãã
- ã€ã³ã¿ãŒãã§ãŒã¹ã®åé¢ã®åçïŒ ã€ã³ã¿ãŒãã§ã€ã¹åé¢ã®åçïŒã ããšãã°ãã³ãŒãã®åéšåãã³ãŒãããŒã¹ã®æå°éããèªèãããŠãäžèŠãªäŸåé¢ä¿ãåé¿ããããã«ãã€ã³ã¿ãŒãã§ã€ã¹ãã§ããã ãå°ããããŸãã ãã®ãã³ãã¯ãC ++ã«ã圹ç«ã¡ãŸããC++ã§ã¯ãåŸããªããšã³ã³ãã€ã«æéãèšå€§ã«ãªããŸãã
- äŸåé¢ä¿ã®å転ã®åçïŒäŸåæ§å転ã®åçïŒã çŽæ¥éä¿¡ããïŒããã³çžäºã«äŸåããïŒ2ã€ã®ç¹å®ã®å®è£ ã®ä»£ããã«ãéåžžããããã®éä¿¡ã€ã³ã¿ãŒãã§ã€ã¹ã3çªç®ã®ã¯ã©ã¹ãšããŠåœ¢åŒåãããããã®éã®ã€ã³ã¿ãŒãã§ã€ã¹ãšããŠäœ¿çšããããšã§åé¢ã§ããŸãã ãããã®éã§äœ¿çšãããã¡ãœããã®åŒã³åºããå®çŸ©ããæœè±¡åºæ¬ã¯ã©ã¹ããŸãã¯ãããã®éã§è»¢éãããããŒã¿ãå®çŸ©ããPODæ§é ã§ãããããŸãã
- å¥ã®ååã¯é åèªSOLIDã«ã¯å«ãŸããŠããŸããããããã¯éåžžã«éèŠã§ãããšç¢ºä¿¡ããŠããŸãã ãç¶æ¿ãããæ§æãåªå ããã ïŒè€ååå©çšã®ååïŒã æ§æã¯ããã©ã«ãã§æ£ããéžæã§ã ã 絶察ã«å¿ èŠãªå Žåã«ã¯ãç¶æ¿ãæ®ãå¿ èŠããããŸãã
ãããã£ãŠãSOLID-CïŒ++ïŒãååŸããŸã
以äžã§ã¯ããããã®ååãåç §ããããããé åèªãšåŒã³ãŸã-SRPãOCPãLSPãISPãDIPãCRP ...
ããã«ããã€ãã®ã¡ã¢ïŒ
- OODã§ã¯ã ã€ã³ã¿ãŒãã§ã€ã¹ãšå®è£
ã®æŠå¿µãç¹å®ã®OOPããŒã¯ãŒãã«çµã³ä»ããããšã¯ã§ããŸããã C ++ã§ã¯ã æœè±¡åºåºã¯ã©ã¹ãšä»®æ³é¢æ°ã䜿çšããŠã€ã³ã¿ãŒãã§ã€ã¹ãäœæãã å®è£
ããããã®åºåºã¯ã©ã¹ããç¶æ¿ããããšããããããŸãããããã¯ã€ã³ã¿ãŒãã§ã€ã¹ã®ååãå®è£
ããç¹å®ã®æ¹æ³ã®1ã€ã«ãããŸããã C ++ã§ã¯ã PIMPL ã äžéæãã€ã³ã¿ãŒ ã ããã¯ã¿ã€ãã³ã° ãtypedefãªã©ã䜿çšããããšãã§ããŸããOODæ§é ãäœæããŠãCã«å®è£
ã§ããŸãããã®èšèªã«ã¯ãOOPèšèªããŒã¯ãŒãã¯ãŸã£ãããããŸããã ãããã£ãŠã ã€ã³ã¿ãŒãã§ã€ã¹ã«ã€ããŠè©±ããšããå¿
ãããä»®æ³æ©èœãæå³ããããã§ã¯ãããŸããã å®è£
ãé ãåçã«ã€ããŠè©±ããŠããã®ã§ãã ã€ã³ã¿ãŒãã§ãŒã¹ã¯ ããªã¢ãŒãã£ãã¯ã§ããå ŽåããããŸãããå€ãã®å Žåããã§ã¯ãããŸããïŒ å€æ
æ§ãæ£ãã䜿çšãããããšã¯ã»ãšãã©ãããŸããããã€ã³ã¿ãŒãã§ã€ã¹ã¯ãã¹ãŠã®ãœãããŠã§ã¢ã®åºæ¬æŠå¿µã§ãã
- äžèšã§æããã«ããããã«ãããã¯ã©ã¹ããå¥ã®ã¯ã©ã¹ã«éä¿¡ããããã®ããŒã¿ãåã«æ ŒçŽããPODæ§é ãäœæããå Žåããã®æ§é ã¯ã€ã³ã¿ãŒãã§ã€ã¹ãšããŠäœ¿çšãããŸã -ããã¯ããŒã¿ã®æ£åŒãªèª¬æã§ã ã
- ãããªãã¯éšåãšãã©ã€ããŒãéšåãæã€1ã€ã®å¥åã®ã¯ã©ã¹ãäœæããã ãã§ããå ±ééšåã«ãããã®ã¯ãã¹ãŠã€ã³ã¿ãŒãã§ãŒã¹ã§ããããã©ã€ããŒãéšåã«ãããã®ã¯ãã¹ãŠå®è£ ã§ãã
- äžèšã§æããã«ããããã«ãããã¯ã©ã¹ããå¥ã®ã¯ã©ã¹ã«éä¿¡ããããã®ããŒã¿ãåã«æ ŒçŽããPODæ§é ãäœæããå Žåããã®æ§é ã¯ã€ã³ã¿ãŒãã§ã€ã¹ãšããŠäœ¿çšãããŸã -ããã¯ããŒã¿ã®æ£åŒãªèª¬æã§ã ã
- ç¶æ¿ã«ã¯ãå®éã«ã¯ïŒå°ãªããšãïŒ2ã€ã®ã¿ã€ãããããŸããã€ã³ã¿ãŒãã§ã€ã¹ã®ç¶æ¿ãšå®è£
ã®ç¶æ¿ã§ãã
- C ++ã§ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã®ç¶æ¿ã«ã¯ãçŽç²ä»®æ³é¢æ°ãPIMPLãæ¡ä»¶ä»ãtypedefãå«ãæœè±¡åºæ¬ã¯ã©ã¹ãå«ãŸããŸãã Javaã§ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã®ç¶æ¿ã¯implementsããŒã¯ãŒãã§è¡šãããŸãã
- C ++ã§ã¯ãåºæ¬ã¯ã©ã¹ã«çŽç²ãªä»®æ³é¢æ°ä»¥å€ã®ãã®ãå«ãŸãããã³ã«ãå®è£ ã®ç¶æ¿ãçºçããŸãã Javaã§ã¯ãå®è£ ã®ç¶æ¿ã¯extendsããŒã¯ãŒãã䜿çšããŠè¡šãããŸãã
- OODã«ã¯ã€ã³ã¿ãŒãã§ã€ã¹ãç¶æ¿ããããã®å€ãã®ã«ãŒã«ããããŸãããéåžžãå®è£ ã®ç¶æ¿ã¯ãäžå£ã³ãŒãããšèŠãªã䟡å€ããããŸã ã
ãããŠæåŸã«ãã²ã©ãOOPãã¬ãŒãã³ã°ã®äŸãšããããå®éã®ç掻ã§æªãã³ãŒãïŒããã³OOPã®æªãè©å€ïŒã«ã©ã®ããã«ã€ãªãããã瀺ãå¿ èŠããããŸãã
- éå±€/ç¶æ¿ãæãããããšããããªãã¯åæ§ã®ã¿ã¹ã¯ãäžãããããããããŸããïŒ åŠçãšã¹ã¿ããã®ãã£ã¬ã¯ããªãå«ã倧åŠã®ã¢ããªã±ãŒã·ã§ã³ããããšä»®å®ããŸãã åºæ¬ã¯ã©ã¹PersonãäœæããŠãããPersonããç¶æ¿ããã¯ã©ã¹Studentãšã¯ã©ã¹Staffãäœæã§ããŸãã
ããããããããã ããã§ç§ã¯ããªããæ¢ããŸãã LSPååã®æé»ã®å«æã¯ã ã¯ã©ã¹éå±€ãšããããåŠçããã¢ã«ãŽãªãºã ãå ±ççã§ãããšããããšã§ãã ãããã¯ããã°ã©ã å šäœã®ååã§ãã OOPã¯æç¶ãåããã°ã©ãã³ã°ã®æ¡åŒµã§ãããäž»ã«ãããã®æé ã«é¢é£ä»ããããŠããŸãã åŠçãšã¹ã¿ããã§åäœããã¢ã«ãŽãªãºã ã®çš®é¡ïŒ ããã³ããªã¢ãŒãã£ãºã ã«ããç°¡çŽ åãããã¢ã«ãŽãªãºã ïŒãããããªãå Žåãã¯ã©ã¹éå±€ã®æ§é ã®äœæãéå§ããããšã¯å®å šã«ç¡è²¬ä»»ã§ãã æåã«ãã¢ã«ãŽãªãºã ãšããŒã¿ãç¥ãå¿ èŠããããŸãã - éå±€/ç¶æ¿ãæãããããšããããããåæ§ã®ã¿ã¹ã¯ãäžããããã§ãããïŒ å³åœ¢ã®ã¯ã©ã¹ããããšããŸãããã ãµãã¯ã©ã¹ãšããŠæ£æ¹åœ¢ãšé·æ¹åœ¢ããããŸãã æ£æ¹åœ¢ã¯é·æ¹åœ¢ããé·æ¹åœ¢ã¯æ£æ¹åœ¢ãïŒ
ããã¯å®éã«ã¯ãå®è£ ã®ç¶æ¿ãšã€ã³ã¿ãŒãã§ã€ã¹ã®ç¶æ¿ã®éãã瀺ãè¯ãäŸã§ãã
- å®è£
ã®ç¶æ¿ã¢ãããŒãã䜿çšããå ŽåãLSPãå®å
šã«ç¡èŠããå®çšçãªèŠ³ç¹ãããããŒã«ãšããŠç¶æ¿ã䜿çšããŠã³ãŒããåå©çšããå¯èœæ§ã«ã€ããŠèããŸãã
ãã®èŠ³ç¹ããã以äžã¯å®å šã«è«ççã§ãã
struct Square { int width; }; struct Rectangle : Square { int height; };
æ£æ¹åœ¢ã«ã¯å¹ ã®ã¿ããããé·æ¹åœ¢ã«ã¯å¹ +é«ãããããŸããã€ãŸããé«ãã³ã³ããŒãã³ãã§æ£æ¹åœ¢ãæ¡åŒµãããšãé·æ¹åœ¢ãåŸãããŸãã
- ãæ³åã®ãšãããOODã¯ãããè¡ãããšã¯ïŒ ãããã ïŒééã£ãŠãããšèšããŸãã ããã§ãã€ã³ã¿ãŒãã§ã€ã¹ã®æé»ã®ç¹æ§ã«ã€ããŠè°è«ã§ããã®ã§ããããããããšèšããŸããã
æ£æ¹åœ¢ã®é«ããšå¹ ã¯åžžã«åãã§ãããããæ£æ¹åœ¢ã®ã€ã³ã¿ãŒãã§ãŒã¹ããã¯ãé åããå¹ *å¹ ãã§ãããšä»®å®ããããšã¯çµ¶å¯Ÿã«æ£ããããšã§ãã
æ£æ¹åœ¢ããç¶æ¿ããå Žåãé·æ¹åœ¢ã®ã¯ã©ã¹ïŒLSPã«ããïŒã¯ãæ£æ¹åœ¢ã€ã³ã¿ãŒãã§ãŒã¹ã®èŠåã«åŸãå¿ èŠããããŸãã æ£æ¹åœ¢ã§æ£ããæ©èœããã¢ã«ãŽãªãºã ã¯ãé·æ¹åœ¢ã§ãæ£ããæ©èœããã¯ãã§ãã - å¥ã®ã¢ã«ãŽãªãºã ã䜿çšããŸãã
std::vector<Square*> shapes; int area = 0; for(auto s : shapes) area += s->width * s->width;
æ£æ¹åœ¢ã§ã¯æ£ããæ©èœãïŒé¢ç©ã®åèšãèšç®ïŒãé·æ¹åœ¢ã§ã¯æ©èœããŸããã
ãããã£ãŠãé·æ¹åœ¢ã¯LSPã®ååã«éåããŸãã
- ãæ³åã®ãšãããOODã¯ãããè¡ãããšã¯ïŒ ãããã ïŒééã£ãŠãããšèšããŸãã ããã§ãã€ã³ã¿ãŒãã§ã€ã¹ã®æé»ã®ç¹æ§ã«ã€ããŠè°è«ã§ããã®ã§ããããããããšèšããŸããã
- ã€ã³ã¿ãŒãã§ã€ã¹ç¶æ¿ã¢ãããŒãã䜿çšããå ŽåãSquareãRectangleãçžäºã«ç¶æ¿ããŸããã æ£æ¹åœ¢ãšé·æ¹åœ¢ã®ã€ã³ã¿ãŒãã§ãŒã¹ã¯å®éã«ã¯ç°ãªããäžæ¹ã¯ä»æ¹ã®ã¹ãŒããŒã»ããã§ã¯ãããŸããã
- ãããã£ãŠãOODã¯å®è£
ç¶æ¿ã®äœ¿çšãæšå¥šããŸããã äžèšã®ããã«ãã³ãŒããåå©çšãããå ŽåãOODã¯æ§æãæ£ããéžæã§ãããšèšããŸãïŒ
- ãããã£ãŠãC ++ã®å®è£
ã®ç¶æ¿ã®éå±€ã«å¯Ÿããäžèšã®ïŒæªãïŒã³ãŒãã®æ£ããããŒãžã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
struct Shape { virtual int area() const = 0; }; struct Square : public virtual Shape { virtual int area() const { return width * width; }; int width; }; struct Rectangle : private Square, public virtual Shape { virtual int area() const { return width * height; }; int height; };
- Javaã®ããããªãã¯ä»®æ³ãã¯ãå®è£
ããæå³ããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ãããšãã«äœ¿çšãããŸãã
- ããã©ã€ããŒããã§ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ãç¶æ¿ããã«åºæ¬ã¯ã©ã¹ãæ¡åŒµã§ããŸãããã®å Žåãåè§åœ¢ã¯åè§åœ¢ããç¶æ¿ãããŸãããåè§åœ¢ã§ã¯ãããŸãã ã
- Javaã®ããããªãã¯ä»®æ³ãã¯ãå®è£
ããæå³ããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ãããšãã«äœ¿çšãããŸãã
- ãã®ãããªã³ãŒããæžãããšã¯ãå§ãããŸããããå®è£ ã®ç¶æ¿ã䜿çšããå Žåã¯ããŸãã«ãããè¡ãå¿ èŠããããŸãïŒ
- ãããã£ãŠãC ++ã®å®è£
ã®ç¶æ¿ã®éå±€ã«å¯Ÿããäžèšã®ïŒæªãïŒã³ãŒãã®æ£ããããŒãžã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
- å®è£
ã®ç¶æ¿ã¢ãããŒãã䜿çšããå ŽåãLSPãå®å
šã«ç¡èŠããå®çšçãªèŠ³ç¹ãããããŒã«ãšããŠç¶æ¿ã䜿çšããŠã³ãŒããåå©çšããå¯èœæ§ã«ã€ããŠèããŸãã
TL; DR-OOPã¯ã©ã¹ã¯ç¶æ¿ãã©ã®ãããªãã®ããæããŠãããŸããã æ¬ èœããŠããOODã¯ã©ã¹ã¯ã99ïŒ ã®æé䜿çšããªãããã«æ瀺ããŠããã¯ãã§ãïŒ
ãšã³ãã£ãã£/ã³ã³ããŒãã³ãã®æŠå¿µ
åææ¡ä»¶ãåŠçããã®ã§ãArasãå§ãŸã£ãå Žæããããããå žåçãªOOPãã®åºçºç¹ã«ç§»ããŸãããã
ããããæå§ãã«ãã1ã€è¿œå ããŸããArasã¯ãã®ã³ãŒãããåŸæ¥ã®OOPããšåŒãã§ããŸããããã«å察ããããšæããŸãã ãã®ã³ãŒãã¯ãå®éã®OOPã®å žåçãªäŸã§ãããäžèšã®äŸã®ããã«ãOOã®ããããçš®é¡ã®åºæ¬ååã«éåããŠãããããåŸæ¥ã®ã³ãŒããšã¯èŠãªãããŸããã
圌ãECSã«åããŠæ§é ãäœãçŽãåã«ãæåã®ã³ãããããå§ããŸãã ãWindowsã§åã³åäœãããã3529f232510c95f53112bbfff87df6bbc6aa1fae
// ------------------------------------------------------------------------------------------------- // super simple "component system" class GameObject; class Component; typedef std::vector<Component*> ComponentVector; typedef std::vector<GameObject*> GameObjectVector; // Component base class. Knows about the parent game object, and has some virtual methods. class Component { public: Component() : m_GameObject(nullptr) {} virtual ~Component() {} virtual void Start() {} virtual void Update(double time, float deltaTime) {} const GameObject& GetGameObject() const { return *m_GameObject; } GameObject& GetGameObject() { return *m_GameObject; } void SetGameObject(GameObject& go) { m_GameObject = &go; } bool HasGameObject() const { return m_GameObject != nullptr; } private: GameObject* m_GameObject; }; // Game object class. Has an array of components. class GameObject { public: GameObject(const std::string&& name) : m_Name(name) { } ~GameObject() { // game object owns the components; destroy them when deleting the game object for (auto c : m_Components) delete c; } // get a component of type T, or null if it does not exist on this game object template<typename T> T* GetComponent() { for (auto i : m_Components) { T* c = dynamic_cast<T*>(i); if (c != nullptr) return c; } return nullptr; } // add a new component to this game object void AddComponent(Component* c) { assert(!c->HasGameObject()); c->SetGameObject(*this); m_Components.emplace_back(c); } void Start() { for (auto c : m_Components) c->Start(); } void Update(double time, float deltaTime) { for (auto c : m_Components) c->Update(time, deltaTime); } private: std::string m_Name; ComponentVector m_Components; }; // The "scene": array of game objects. static GameObjectVector s_Objects; // Finds all components of given type in the whole scene template<typename T> static ComponentVector FindAllComponentsOfType() { ComponentVector res; for (auto go : s_Objects) { T* c = go->GetComponent<T>(); if (c != nullptr) res.emplace_back(c); } return res; } // Find one component of given type in the scene (returns first found one) template<typename T> static T* FindOfType() { for (auto go : s_Objects) { T* c = go->GetComponent<T>(); if (c != nullptr) return c; } return nullptr; }
ã¯ããããã«100è¡ã®ã³ãŒããç解ããã®ã¯é£ããã®ã§ãå°ããã€å§ããŸãããã90幎代ã®ã²ãŒã ã§ã¯ãã³ãŒãã®åå©çšã®åé¡ããã¹ãŠè§£æ±ºããããã«ç¶æ¿ã䜿çšããããšãäžè¬çã§ããã ãšã³ãã£ãã£ãæ¡åŒµå¯èœãªãã£ã©ã¯ã¿ãŒãæ¡åŒµå¯èœãªãã¬ãŒã€ãŒãã¢ã³ã¹ã¿ãŒãªã©ããããŸãã...ããã¯ãåè¿°ã®å®è£ ã®ç¶æ¿ã§ãïŒ ããã§ãŒã¯ã®ããã³ãŒãã ïŒãããããå§ããã®ãæ£ããããã§ãããçµæãšããŠæè»æ§ã®ãªãã³ãŒãããŒã¹ã OODã«ã¯ãäžèšã®ãç¶æ¿ã«å¯Ÿããæ§æãã®ååãããããã§ãã ãã®ããã2000幎代ã«ã¯ããç¶æ¿ã«å¯Ÿããæ§æãã®ååãäžè¬çã«ãªããã²ãŒã éçºè ã¯åæ§ã®ã³ãŒããèšè¿°ãå§ããŸããã
ãã®ã³ãŒãã¯äœãããŸããïŒ ãããªã
èŠããã«ã ãã®ã³ãŒãã¯ãèšèªã®æ¢åã®æ©èœãåå®è£ ããŸã-æ§æã¯ãèšèªã®æ©èœãšããŠã§ã¯ãªããå®è¡æã©ã€ãã©ãªãšããŠã§ãã ã³ãŒããå®éã«C ++ãšãã®ã¡ã¿èšèªãå®è¡ããä»®æ³ãã·ã³ïŒVMïŒã®äžã«æ°ããã¡ã¿èšèªãäœæãããã®ããã«æ³åã§ããŸãã Arasãã¢ã²ãŒã ã§ã¯ããã®ã³ãŒãã¯å¿ èŠãããŸããïŒ ããã«å®å šã«åé€ããŸãïŒ ïŒãããŠãã²ãŒã ã®ããã©ãŒãã³ã¹ãçŽ10åäœäžãããã ãã§ãã
ãããã圌ã¯å®éã«äœãããŠããŸããïŒ ããã¯ã E ntity / C omponent systemãïŒ äœããã®çç±ã§ã E ntity / C omponent systemããšåŒã°ããããšããããŸã ïŒã®æŠå¿µã§ãããã E ntity C omponent S ystem "ïŒ" entity-component-system "ïŒïŒ æãããªçç±ã«ããããEntity C omponent S ystem systemsããšåŒã°ããããšã¯ãããŸãã ãïŒãECãã®ããã€ãã®ååã圢åŒåããŸã ã
- ã²ãŒã ã¯ãããšã³ãã£ãã£ãïŒããšã³ãã£ãã£ãïŒïŒ ãã®äŸã§ã¯ GameObjects ãšåŒã°ãã ïŒã®æ©èœãæããªãããšããæ§ç¯ãããŸãããã®æ©èœã¯ãã³ã³ããŒãã³ããïŒãã³ã³ããŒãã³ããïŒã§æ§æãããŸãã
- GameObjects ã¯ããµãŒãã¹ãã±ãŒã¿ãŒããã¿ãŒã³ãå®è£ ããŸã -åã³ã³ããŒãã³ãã¯ã¿ã€ãããšã«ç §äŒãããŸãã
- ã³ã³ããŒãã³ãã¯ãã©ã®GameObjectãå±ããŠããããç¥ã£ãŠããŸã-芪GameObjectãç
§äŒããããšã§ãåãã¬ãã«ã«ããã³ã³ããŒãã³ããèŠã€ããããšãã§ããŸãã
- ã³ã³ããžã·ã§ã³ã®æ·±ãã¯1ã¬ãã«ã®ã¿ã§ãïŒ ã³ã³ããŒãã³ãã«ç¬èªã®åã³ã³ããŒãã³ããå«ããããšã¯ã§ããŸãããGameObjectã«ã¯åGameObjectsãå«ããããšã¯ã§ããŸãã ïŒã
- GameObjectã¯ãåã¿ã€ãã®ã³ã³ããŒãã³ãã1ã€ã ãæã€ããšãã§ããŸãïŒ äžéšã®ãã¬ãŒã ã¯ãŒã¯ã§ã¯ããã¯å¿
é èŠä»¶ã§ãããä»ã®ã³ã³ããŒãã³ãã§ã¯ããã§ã¯ãããŸãã ïŒã
- åã³ã³ããŒãã³ãã¯ïŒããããïŒæéã®çµéãšãšãã«äžç¹å®ã®æ¹æ³ã§å€åãããããã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯ãä»®æ³ç¡å¹æŽæ°ããå«ãŸããŸãã
- GameObjectã¯ããã¹ãŠã®GameObjectïŒããã³ãã¹ãŠã®ã³ã³ããŒãã³ãïŒã§ã¯ãšãªãå®è¡ã§ããã·ãŒã³ã«å±ããŸãã
åæ§ã®æŠå¿µã¯2000幎代ã«éåžžã«äººæ°ãããããã®å¶éã«ãããããããåœæãä»æ¥ãç¡æ°ã®ã²ãŒã ãäœæããã®ã«ååãªæè»æ§ãããããšãå€æããŸããã
ãã ããããã¯å¿ é ã§ã¯ãããŸããã ããªãã®ããã°ã©ãã³ã°èšèªã¯ãèšèªã®æ©èœãšããŠãã§ã«æ§æããµããŒãããŠããŸã-è¥å€§åããæŠå¿µã«ã¢ã¯ã»ã¹ããå¿ èŠã¯ãããŸãã...ãªããããã®æŠå¿µãååšããã®ã§ããïŒ æ£çŽã«èšããšã å®è¡æã«åçãªæ§æãå®è¡ã§ããŸã ã ã³ãŒãã§GameObjectã¿ã€ããããŒãå®çŸ©ãã代ããã«ãããŒã¿ãã¡ã€ã«ããããããããŒãã§ããŸãã ã²ãŒã /ã¬ãã«ãã¶ã€ããŒãç¬èªã®ã¿ã€ãã®ãªããžã§ã¯ããäœæã§ããã®ã§ãããã¯éåžžã«äŸ¿å©ã§ã...ããããã»ãšãã©ã®ã²ãŒã ãããžã§ã¯ãã§ã¯ããã¶ã€ããŒã¯éåžžã«å°ãªããæåéãããã°ã©ããŒå šäœãããã®ã§ãããã¯éèŠãªæ©äŒã§ãããšäž»åŒµããŸãã ããã«æªãããšã«ãããã¯å®è¡æã«ã³ã³ããžã·ã§ã³ãå®è£ ã§ããå¯äžã®æ¹æ³ã§ã¯ãããŸããïŒ ããšãã°ãUnityã¯ãã¹ã¯ãªããèšèªããšããŠCïŒã䜿çšããä»ã®å€ãã®ã²ãŒã ã¯ãã®ä»£æ¿æ段ã䜿çšããŸããããšãã°ãLua-ãã¶ã€ããŒã«ãšã£ãŠäŸ¿å©ãªããŒã«ã¯ããã®ãããªè¥å€§åããæŠå¿µãå¿ èŠãšããã«æ°ããã²ãŒã ãªããžã§ã¯ããå®çŸ©ããããã®CïŒ/ Luaã³ãŒããçæã§ããŸãïŒ æ¬¡ã®æçš¿ã§ãã®ãæ©èœããå床远å ããããã©ãŒãã³ã¹ã10åäœäžããªãããã«ããŸã...
OODã«åŸã£ãŠãã®ã³ãŒããè©äŸ¡ããŠã¿ãŸãããã
- GameObject :: GetComponentã¯dynamic_castã䜿çšããŸãã ã»ãšãã©ã®äººã¯ãdynamic_castã¯ããã§ãŒã¯ã®ããã³ãŒããã§ãããã©ããã«ãã°ãããããšã瀺ã倧ããªãã³ãã ãšèšãã§ãããã ç§ã¯ãããèšãã§ããã-ããã¯ããªããLSPã«éåãã蚌æ ã§ã-ããªãã¯ããŒã¹ã€ã³ã¿ãŒãã§ã€ã¹ã§åäœããäœããã®çš®é¡ã®ã¢ã«ãŽãªãºã ãæã£ãŠããŸãããç°ãªãå®è£
ã®è©³çŽ°ãç¥ãå¿
èŠããããŸãã ãã®ç¹å®ã®çç±ã«ãããã³ãŒãã®èããããŸãã
- GameObjectã¯ãããµãŒãã¹ãã±ãŒã¿ãŒããã³ãã¬ãŒããå®è£
ããŠãããšæ³åããã°ãååãšããŠæªãã¯ãããŸããããOODã®èŠ³ç¹ããæ¹å€ãããå
ã«é²ããšããã®ãã³ãã¬ãŒãã¯ãããžã§ã¯ãã®éšåéã®æé»çãªæ¥ç¶ãäœæããïŒ ãŠã£ãããã£ã¢ãžã®ãªã³ã¯ãªãã§ç§ã¯ã³ã³ãã¥ãŒã¿ãŒãµã€ãšã³ã¹ã®ç¥èãæã£ãŠããŸã ïŒãæé»ã®ã³ãã¥ãã±ãŒã·ã§ã³ãã£ãã«ã¯ã¢ã³ããã¿ãŒã³ã§ãããæ瀺çãªã³ãã¥ãã±ãŒã·ã§ã³ãã£ãã«ã奜ãã¯ãã§ãã åãè°è«ã¯ãã²ãŒã ã§æã
䜿çšãããè¥å€§åãããã€ãã³ãã®ã³ã³ã»ãããã«ãåœãŠã¯ãŸããŸã...
- ã€ã³ã¿ãŒãã§ãŒã¹ïŒ ä»®æ³ãã€ãã®æŽæ°ïŒæéïŒ ïŒãåºããããããã³ã³ããŒãã³ããSRPã«éåããŠãããšè¿°ã¹ãããšæããŸãã ã²ãŒã éçºã§ã®ãä»®æ³ç¡å¹ã¢ããããŒããã®äœ¿çšã¯ããããšããã«ãããŸãããã¢ã³ããã¿ãŒã³ã§ãããšãèšããŸãã åªãããœãããŠã§ã¢ã¯ãå¶åŸ¡ãããŒãšããŒã¿ãããŒã«ã€ããŠç°¡åã«èããããšãã§ããã¯ãã§ãã ã²ãŒã ãã¬ã€ã³ãŒãã®åèŠçŽ ã ãä»®æ³ãã€ãã¢ããããŒããã³ãŒã«ã®èåŸã«é
眮ãããšãå¶åŸ¡ã¹ããªãŒã ãšããŒã¿ã¹ããªãŒã ãå®å
šã«é£èªåãããŸãã ç§èŠã é·è·é¢ å¹æãšãåŒã°ããç®ã«èŠããªãå¯äœçšã¯ ããã°ã®æãäžè¬çãªåå ã®äžéšã§ããããä»®æ³ãã€ãæŽæ°ãã¯ã»ãšãã©ãã¹ãŠãç®ã«èŠããªãå¯äœçšã§ããããšãä¿èšŒããŸãã
- Componentã¯ã©ã¹ã®ç®çã¯æ§æãæå¹ã«ããããšã§ããã CRPã®éåã§ããç¶æ¿ãéããŠãããè¡ããŸãã
- ãã®äŸã®å¯äžã®è¯ãé¢ã¯ãSRPãšISPã®ååã«æºæ ããããã«ã²ãŒã ã³ãŒããéå°ã§ããããšã§ããããã¯ãã³ãŒãã®åå©çšã«æé©ãªãã»ãšãã©è²¬ä»»ã®ãªãå€ãã®åçŽãªã³ã³ããŒãã³ãã«åå²ãããŸãã
ãããã圌ã¯DIPã®ç¶æãããŸãåŸæã§ã¯ãããŸãããå€ãã®ã³ã³ããŒãã³ãã¯ãäºãã®çŽæ¥çãªç¥èãæã£ãŠããŸãã
ãããã£ãŠãäžèšã®ãã¹ãŠã®ã³ãŒãã¯å®éã«åé€ã§ããŸãã ãã®æ§é å šäœã GameObjectïŒä»ã®ãã¬ãŒã ã¯ãŒã¯ã§ã¯ãšã³ãã£ãã£ãšãåŒã°ããŸãïŒãåé€ããã³ã³ããŒãã³ããåé€ããFindOfTypeãåé€ããŸãã ããã¯ãOODã®ååã«éåããã²ãŒã ã®é床ãèããäœäžããã圹ã«ç«ããªãVMã®äžéšã§ãã
ãã¬ãŒã ã¯ãŒã¯ãªãã®æ§æïŒã€ãŸããããã°ã©ãã³ã°èšèªèªäœã®æ©èœã䜿çšïŒ
ã³ã³ããžã·ã§ã³ãã¬ãŒã ã¯ãŒã¯ãåé€ããComponentåºæ¬ã¯ã©ã¹ããªãå ŽåãGameObjectsã¯ã©ã®ããã«ã³ã³ããžã·ã§ã³ã䜿çšããã³ã³ããŒãã³ãã§æ§æãããŸããïŒ ã¿ã€ãã«ã瀺ãããã«ããã®è¥å€§åããVMãäœæãããã®äžã«å¥åŠãªã¡ã¿èšèªã§GameObjectsãäœæãã代ããã«ãã²ãŒã ããã°ã©ããŒã§ããããããæåéãç§ãã¡ã®ä»äºã§ãããããC ++ã§ããããäœæããŸããã
ãšã³ãã£ãã£/ã³ã³ããŒãã³ããã¬ãŒã ã¯ãŒã¯ãåé€ããã³ãããã¯æ¬¡ã®ãšããã§ãïŒ https : //github.com/hodgman/dod-playground/commit/f42290d0217d700dea2ed002f2f3b1dc45e8c27c
ãœãŒã¹ã³ãŒãã®å ã®ããŒãžã§ã³ã¯æ¬¡ã®ãšããã§ãïŒ https : //github.com/hodgman/dod-playground/blob/3529f232510c95f53112bbfff87df6bbc6aa1fae/source/game.cpp
ãœãŒã¹ã³ãŒãã®ä¿®æ£çã¯æ¬¡ã®ãšããã§ããhttps ïŒ //github.com/hodgman/dod-playground/blob/f42290d0217d700dea2ed002f2f3b1dc45e8c27c/source/game.cpp
å€æŽç¹ã«ã€ããŠç°¡åã«èª¬æããŸãã
- åã³ã³ããŒãã³ãã¿ã€ããããïŒpublic Componentããåé€ããŸããã
- åã¿ã€ãã®ã³ã³ããŒãã³ãã«ã³ã³ã¹ãã©ã¯ã¿ãŒãè¿œå ããŸããã
- OODã¯äž»ã«ã¯ã©ã¹ã®ç¶æ ãã«ãã»ã«åããããšãç®çãšããŠããŸããããããã®ã¯ã©ã¹ã¯éåžžã«å°ãã/ã·ã³ãã«ãªã®ã§ãé ãå¿ èŠã¯ãããŸãããã€ã³ã¿ãŒãã§ã€ã¹ã¯ããŒã¿ã®èª¬æã§ãã ãã ããã«ãã»ã«åãäž»ãªæ±ã§ããäž»ãªçç±ã®1ã€ã¯ã ã¯ã©ã¹ã®äžå€åŒã®äžå®ã®çå®ãä¿èšŒã§ããããšã§ã...ãŸãã¯äžå€åŒãå£ããŠããå Žåã¯ãã«ãã»ã«åãããå®è£ ã³ãŒãã調ã¹ãŠãšã©ãŒãèŠã€ããã ãã§ãã ãã®ã³ãŒãäŸã§ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒãè¿œå ããŠåçŽãªäžå€åŒãå®è£ ãã䟡å€ããããŸãããã¹ãŠã®å€ãåæåããå¿ èŠããããŸãã
- ããŸãã«ãäžè¬çãªãæŽæ°ãã¡ãœããã®ååãå€æŽããŠããããã®ååãå®éã®åäœãåæ ããããã«ããŸããMoveComponentã®UpdatePositionãšãAvoidComponentã®ResolveCollisionsã§ãã
- ãã³ãã¬ãŒã/ãã¬ããã«äŒŒãããŒãã³ãŒãããã3ã€ã®ã³ãŒããããã¯ïŒç¹å®ã®ã¿ã€ãã®ã³ã³ããŒãã³ããå«ãGameObjectãäœæããã³ãŒãïŒãåé€ãã3ã€ã®C ++ã¯ã©ã¹ã«çœ®ãæããŸããã
- ã¢ã³ããã¿ãŒã³ãä»®æ³ãã€ãã¢ããããŒãããåé€ããŸããã
- ããµãŒãã¹ãã±ãŒã¿ãŒããã³ãã¬ãŒããä»ããŠçžäºã«æ€çŽ¢ããã³ã³ããŒãã³ãã®ä»£ããã«ãã²ãŒã ã¯æ§ç¯äžã«ã³ã³ããŒãã³ããæ瀺çã«çµã³ä»ããŸãã
ãªããžã§ã¯ã
ãããã£ãŠããã®ãä»®æ³ãã·ã³ãã³ãŒãã®ä»£ããã«ïŒ
// create regular objects that move for (auto i = 0; i < kObjectCount; ++i) { GameObject* go = new GameObject("object"); // position it within world bounds PositionComponent* pos = new PositionComponent(); pos->x = RandomFloat(bounds->xMin, bounds->xMax); pos->y = RandomFloat(bounds->yMin, bounds->yMax); go->AddComponent(pos); // setup a sprite for it (random sprite index from first 5), and initial white color SpriteComponent* sprite = new SpriteComponent(); sprite->colorR = 1.0f; sprite->colorG = 1.0f; sprite->colorB = 1.0f; sprite->spriteIndex = rand() % 5; sprite->scale = 1.0f; go->AddComponent(sprite); // make it move MoveComponent* move = new MoveComponent(0.5f, 0.7f); go->AddComponent(move); // make it avoid the bubble things AvoidComponent* avoid = new AvoidComponent(); go->AddComponent(avoid); s_Objects.emplace_back(go); }
ããã§éåžžã®C ++ã³ãŒããã§ããŸããã
struct RegularObject { PositionComponent pos; SpriteComponent sprite; MoveComponent move; AvoidComponent avoid; RegularObject(const WorldBoundsComponent& bounds) : move(0.5f, 0.7f) // position it within world bounds , pos(RandomFloat(bounds.xMin, bounds.xMax), RandomFloat(bounds.yMin, bounds.yMax)) // setup a sprite for it (random sprite index from first 5), and initial white color , sprite(1.0f, 1.0f, 1.0f, rand() % 5, 1.0f) { } }; ... // create regular objects that move regularObject.reserve(kObjectCount); for (auto i = 0; i < kObjectCount; ++i) regularObject.emplace_back(bounds);
ã¢ã«ãŽãªãºã
å¥ã®å€§ããªå€æŽãã¢ã«ãŽãªãºã ã«å ããããŸããã æåã«ãã€ã³ã¿ãŒãã§ã€ã¹ãšã¢ã«ãŽãªãºã ã¯å ±çããŠæ©èœããäºãã®æ§é ã«åœ±é¿ãäžããã¹ãã ãšèšã£ãã®ãèŠããŠããŸããïŒ ãã®ãããã¢ã³ããã¿ãŒã³ã ä»®æ³ãã€ãã¢ããããŒã ããããã§æµã«ãªããŸããã åæã³ãŒãã«ã¯ãããã ãã§æ§æãããã¡ã€ã³ã«ãŒãã¢ã«ãŽãªãºã ãå«ãŸããŠããŸãã
// go through all objects for (auto go : s_Objects) { // Update all their components go->Update(time, deltaTime);
ããªãã¯ãããçŸããã·ã³ãã«ã§ããããšã«å察ããããšãã§ããŸãããç§èŠã¯ããã¯éåžžã«ãéåžžã«æªãã§ãã ããã«ãããã²ãŒã å ã®å¶åŸ¡ ãããŒãšããŒã¿ãããŒã®äž¡æ¹ãå®å šã«é£èªåãããŸãã ãœãããŠã§ã¢ãç解ã§ããããã«ãããå ŽåããµããŒããããå Žåãæ°ãããã®ãè¿œå ããæé©åããè€æ°ã®ããã»ããµã³ã¢ã§å¹ççã«å®è¡ãããå Žåã¯ãå¶åŸ¡ãããŒãšããŒã¿ãããŒã®äž¡æ¹ãç解ããå¿ èŠããããŸãã ãããã£ãŠããä»®æ³ç¡å¹æŽæ°ããå®è¡ããå¿ èŠããããŸãã
代ããã«ãããæ瀺çãªã¡ã€ã³ã«ãŒããäœæããŸãããããã«ãããå¶åŸ¡ãããŒã®ç解ãå€§å¹ ã«ç°¡çŽ åãããŸã ïŒãã®äžã®ããŒã¿ãããŒã¯äŸç¶ãšããŠé£èªåãããŠããŸããã次ã®ã³ãããã§ä¿®æ£ããŸã ïŒã
// Update all positions for (auto& go : s_game->regularObject) { UpdatePosition(deltaTime, go, s_game->bounds.wb); } for (auto& go : s_game->avoidThis) { UpdatePosition(deltaTime, go, s_game->bounds.wb); } // Resolve all collisions for (auto& go : s_game->regularObject) { ResolveCollisions(deltaTime, go, s_game->avoidThis); }
ãã®ã¹ã¿ã€ã«ã®æ¬ ç¹ã¯ãã²ãŒã ã«è¿œå ãããæ°ããã¿ã€ãã®ãªããžã§ã¯ãããšã«ãã¡ã€ã³ã«ãŒãã«è€æ°ã®è¡ãè¿œå ããå¿ èŠãããããšã§ãã ãã®ã·ãªãŒãºã®åŸç¶ã®æçš¿ã§ããã«æ»ããŸãã
æ§èœ
å€æ°ã®å€§ããªOODéåããããæ§é ãéžæãããšãã«ããã€ãã®æªã決å®ãäžãããæé©åã®æ©äŒããããããããŸããããããã«ã€ããŠã¯ã·ãªãŒãºã®æ¬¡ã®æçš¿ã§èª¬æããŸãã ãã ãããã®æ®µéã§ã¯ãã§ã«ããä¿®æ£OODããå«ãããŒãžã§ã³ããã¬ãŒã³ããŒã·ã§ã³ã®æåŸããæçµçãªãECSãã³ãŒããšã»ãŒå®å šã«äžèŽãŸãã¯åã£ãŠããããšãæããã§ã...ãããŠãç§ãã¡ãããããšã¯ãæªãæ¬äŒŒOOPã³ãŒããååŸãããããååã«æºæ ãããããšã ãã§ããOOPïŒããã³100è¡ã®ã³ãŒããåé€ïŒïŒ
次ã®ã¹ããã
ããã§ã¯ãæ®ãã®OODåé¡ã®è§£æ±ºãäžå€ãªããžã§ã¯ãïŒ é¢æ°åã¹ã¿ã€ã«ã§ã®ããã°ã©ãã³ã° ïŒãããã³ããŒã¿ãããŒãã¡ãã»ãŒãžã®åãæž¡ããOODã³ãŒããžã®DODããžãã¯ã®é©çšã«é¢ããè°è«ã«ããããå©ç¹ãªã©ãããåºç¯ãªåé¡ãæ€èšããŸããé¢é£ããç¥æµãOODã³ãŒãã«é©çšãããããã®ã¯ã©ã¹ã®ããšã³ãã£ãã£ããåé€ããã¯ãªãŒã³ãªã³ã³ããŒãã³ãã®ã¿ã䜿çšããã³ã³ããŒãã³ãã®æ¥ç¶ã«ç°ãªãã¹ã¿ã€ã«ã䜿çšããŸãïŒãã€ã³ã¿ãŒãš çŸå®ã®äžçããïŒã³ã³ããã®ã³ã³ããŒãã³ããéã¶ã®è²¬ä»»ã¯ãECS-æ¹èšçã¯ãããè¯ãæé©åã ãã§ãªãããããªãæé©åã®ããã«ã¯ã ãã®ãããªãã«ãã¹ã¬ãã/ SIMDïŒãšããŠå ±åã¢ã©ã¹ïŒã«èšèŒãããŠããŸããã é åºã¯å¿ ãããããã§ã¯ãªããããããç§ã¯äžèšã®ãã¹ãŠãèæ ®ããããšã¯ãããŸãã...
å ç®
èšäºãžã®ãªã³ã¯ã¯ã²ãŒã éçºè ã®ãµãŒã¯ã«ãè¶ ããŠåºãã£ãŠãããããã ECS ããè¿œå ããŸãïŒ ãã®ãŠã£ãããã£ã¢ã®èšäºã¯æªãã§ãããECãšECSã®æŠå¿µãçµã¿åãããŠãããããã¯åãã§ã¯ãããŸãã... ïŒ-ããã¯ã³ãã¥ããã£å ã§åŸªç°ããåœã®ãã³ãã¬ãŒãã§ãã²ãŒã éçºè ã å®éãããã¯ããšã³ãã£ãã£ãã圢ã®ãªããªããžã§ã¯ããæå®ããåãªãIDã§ããããã³ã³ããŒãã³ãããIDãåç §ããç¹å®ã®ããŒãã«ã®è¡ã§ããããã·ã¹ãã ããã³ã³ããŒãã³ããå€æŽã§ããæç¶ãåã³ãŒãã§ãããªã¬ãŒã·ã§ãã«ã¢ãã«ã®ããŒãžã§ã³ã§ãã ãã®ããã³ãã¬ãŒããã¯ãç¶æ¿ã®éå°äœ¿çšã®åé¡ã«å¯Ÿãã解決çãšããŠåžžã«äœçœ®ä»ããããŠããŸããããç¶æ¿ã®éå°äœ¿çšãå®éã«OOPã®æšå¥šäºé ã«éåããããšã¯èšåãããŠããŸããã ãããã£ãŠãç§ã®inãã ããã¯ããœãããŠã§ã¢ãèšè¿°ãããå¯äžã®çã®æ¹æ³ãã§ã¯ãããŸããã ãã®æçš¿ã¯ã人ã ãå®éã«æ¢åã®èšèšååã«ã€ããŠåŠã¶ããšã確å®ã«ããããã«èšèšãããŠããŸãã