ã西æŽã¹ãã²ããã£ã倧奜ããã¹ãã²ããã£ã³ãŒããå«ãããã¹ãã²ããã£ã³ãŒããã¯ãèªç¥ç芳ç¹ãšçŸç芳ç¹ã®äž¡æ¹ããèžãæãã«ãªã¹ã§ãããœãããŠã§ã¢ãèšè¿°ããããã®çæ³çãªè¡šçŸã§ãã ãã®èšäºã§ã¯ãã¹ãã²ããã£ã³ãŒããç Žå£ããããã®3ç¹èšç»ã«ã€ããŠèª¬æããŸãã
- ã¹ãã²ããã£ã³ãŒããããã»ã©çŸå³ãããªãçç±ã«ã€ããŠèª¬æããŸãã
- ã³ãŒããå®éã«è¡ãããšã®æ°ããå€èгã玹ä»ããŸãã
- éçºè
ãããŒã¹ãã®ããŒã«ãè§£ãã®ã«åœ¹ç«ã€Frame Machine NotationïŒFMNïŒã«ã€ããŠè°è«ããŠããŸãã
ç§ãã¡ã¯çã誰ãã®ã³ãŒããèªãã®ãã©ãã»ã©é£ãããç¥ã£ãŠããŸãã ããã¯ãã¿ã¹ã¯èªäœãè€éã§ããããã³ãŒãã®æ§é ããåµé çããããããã§ãã å€ãã®å Žåãããã2ã€ã®åé¡ã¯å¯æ¥ã«é¢é£ããŠããŸãã
課é¡ã¯è€éãªã¿ã¹ã¯ã§ãããéåžžã驿°çãªçºèŠä»¥å€ã¯ããããåçŽåã§ããŸããã ãã ãããœãããŠã§ã¢æ§é èªäœãäžå¿
èŠãªè€éãã远å ããããšãããããã®åé¡ã¯è§£æ±ºãã
䟡å€ããããŸãã
ã¹ãã²ããã£ã³ãŒãã®ãã¯ãè€éãªæ¡ä»¶ä»ãããžãã¯ã«ãããŸãã ãããŠãå€ãã®ããªãããŒãªif-then-elseã³ã³ã¹ãã©ã¯ãããªããšäººçãæ³åããã®ã¯é£ãããããããŸãããããã®èšäºã§ã¯ããè¯ã解決çã瀺ããŸãã
ã¹ãã²ããã£ã³ãŒãã䜿çšããŠç¶æ³ã説æããã«ã¯ããŸããããæå¹ã«ããå¿
èŠããããŸãã
ã¯ãªã¹ããŒãã¹ã¿ããã§ïŒ
ã¢ã«ãã³ãïŒæçãå§ããŸãããã
æé»ã®ç¶æ
ãã¹ã¿ãäœãã«ã¯ãå¿
ããæ¹¯ãå¿
èŠã§ãã ãã ããã¹ãã²ããã£ã³ãŒããå«ããã®ãããªäžèŠåââçŽãªèŠçŽ ã§ãããéåžžã«æ··ä¹±ããå¯èœæ§ããããŸãã
以äžã«ç°¡åãªäŸã瀺ããŸãã
(temp < 32)
ãã®ãã§ãã¯ã¯æ¬åœã«äœãããŸããïŒ æããã«ãæ°å€ã®è¡ã2ã€ã®éšåã«åå²ããŠã
ãŸããããããã®éšåã¯
ã©ãããæå³ã§ããïŒ ããªãã¯è«ççãªä»®å®ãç«ãŠãããšãã§ãããšæããŸãããåé¡ã¯ã³ãŒããå®éã«ããã
æç€ºçã«å ±åããªãããšã§ãã
åœŒå¥³ãæ°ŽãåºãŸã£ãŠãããã©ããã圌女ã確èªããŠããããšãæ¬åœã«ç¢ºèªããã
[ããããã ã¬ãŒã³ïŒè¯æ°ã¹ã±ãŒã«ã«ãããšãæ°Žã¯+32床ã§åçµããŸã] ãè«ççã«ã¯falseã®æ»ãå€ãæå³ããŸããïŒ
if (temp < 32) {
ãã§ãã¯ã§ã¯æ°å€ã2ã€ã®ã°ã«ãŒãã«åããŸããããå®éã«ã¯3ã€ã®è«çç¶æ
ããããŸã-åºäœãæ¶²äœãæ°äœïŒåºäœãæ¶²äœãã¬ã¹ïŒã§ãïŒ
ã€ãŸããæ¬¡ã®æ°å€è¡ïŒ
次ã®ããã«æ¡ä»¶ãã§ãã¯ã§åºåãããŠããŸãã
if (temp < 32) {
} else {
}
ã¹ãã²ããã£ã³ãŒãã®æ§è³ªãçè§£ããããã«éåžžã«éèŠã§ãããããäœãèµ·ãã£ããã«æ³šç®ããŠãã ããã ããŒã«ãã§ãã¯ã¯ãæ°å€ç©ºéã2ã€ã®éšåã«åå²ããŸããããã·ã¹ãã ãïŒSOLIDãLIQUIDãGASïŒããã®å®éã®è«çæ§é ãšããŠåé¡ããŸããã§ããã 代ããã«ããã§ãã¯ã¯ã¹ããŒã¹ãïŒSOLIDããã®ä»ãã¹ãŠïŒã«åå²ããŸããã
åæ§ã®ãã§ãã¯ã次ã«ç€ºããŸãã
if (temp > 212) {
èŠèŠçã«ã¯ã次ã®ããã«ãªããŸãã
if (temp > 212) {
} else {
}
以äžã«æ³šæããŠãã ããã
- å¯èœãªç¶æ
ã®å®å
šãªã»ããã¯ã©ãã«ã宣èšãããŠããŸãã
- æ¡ä»¶æ§é ã®ã©ãã«ããæ€èšŒå¯èœãªè«çç¶æ
ãŸãã¯å®£èšãããç¶æ
ã®ã°ã«ãŒãããªã
- äžéšã®ç¶æ
ã¯ãæ¡ä»¶ä»ãããžãã¯ãšåå²ã®æ§é ã«ãã£ãŠéæ¥çã«ã°ã«ãŒãåãããŸã
ãã®ãããªã³ãŒãã¯è匱ã§ãããéåžžã«äžè¬çã§ããããµããŒãã«åé¡ãåŒãèµ·ããã»ã©å€§ããã¯ãããŸããã ç¶æ³ãæªåãããŸãããã
ãšã«ããããªãã®ã³ãŒãã奜ãã§ã¯ãªãã£ãäžèšã®ã³ãŒãã¯ãç©è³ªã®3ã€ã®ç¶æ
-åºäœãæ¶²äœãã¬ã¹ã®ååšãæå³ããŸãã ããããç§åŠããŒã¿ã«ãããšãå®éã«ã¯ãã©ãºãïŒPLASMAïŒãå«ãŸãã
4ã€ã®èŠ³æž¬å¯èœãªç¶æ
ããããŸãïŒå®éãä»ã«ãå€ããããŸãããããã§ååã§ãïŒã 誰ããã©ãºãããããŒã¹ããæºåããŠããŸãããããã®ã³ãŒããGithubã§å
¬éãããé«ãšãã«ã®ãŒç©çåŠãç ç©¶ããŠãã倧åŠé¢çã«ãã£ãŠåå²ãããå Žåããã®ç¶æ
ãç¶æããå¿
èŠããããŸãã
ãã ãããã©ãºãã远å ããå Žåãäžèšã®ã³ãŒãã¯åçŽã«æ¬¡ã®ããšãè¡ããŸãã
if (temp < 32) {
å€ãã³ãŒãã¯ãå€ãã®ãã©ãºãç¶æ
ã«è¿œå ããããšãelseãã©ã³ãã§ç Žæããå¯èœæ§ããããŸãã æ®å¿µãªãããã³ãŒãæ§é ã«ã¯ãæ°ããç¶æ
ã®ååšãå ±åãããã倿Žã«åœ±é¿ãäžããããããã®ã¯äœããããŸããã ããã«ããã°ã¯ç®ç«ããªãå¯èœæ§ãé«ãã§ããã€ãŸãããã°ãèŠã€ããããšãæãå°é£ã§ãã ã¹ãã²ããã£ã®äžã®è«ã«ã¯ããŒãšã ãèšã£ãŠãã ããã
èŠããã«ãåé¡ã¯ããã§ããããŒã«ãã§ãã¯ã¯ç¶æ
ã
鿥çã«æ±ºå®ããããã«äœ¿çšãããŸãã å€ãã®å Žåãè«çç¶æ
ã¯å®£èšãããŠããããã³ãŒãã«è¡šç€ºãããŸããã äžã§èŠãããã«ãã·ã¹ãã ãæ°ããè«çç¶æ
ã远å ãããšãæ¢åã®ã³ãŒããå£ããå ŽåããããŸãã ãããåé¿ããã«ã¯ã
éçºè
ã¯åã
ã®æ¡ä»¶ãã§ãã¯ãšãã©ã³ãã
忀æ»ããŠãã³ãŒããã¹ã
ãã¹ãŠã®è«çç¶æ
ã«å¯ŸããŠæå¹ã§ããããšã確èªããå¿
èŠããããŸãã ããã¯ã倧ããªã³ãŒããã©ã°ã¡ã³ããããè€éã«ãªãã«ã€ããŠå£åããäž»ãªçç±ã§ãã
æ¡ä»¶ä»ãããŒã¿ãã§ãã¯ãå®å
šã«åé€ããæ¹æ³ã¯ãããŸããããããããæå°åããææ³ã¯ã³ãŒãã®è€éãã軜æžããŸãã
ããã§ãæ°Žéã®
éåžžã«åçŽãªã¢ãã«ãäœæããã¯ã©ã¹ã®å
žåçãªãªããžã§ã¯ãæåã®å®è£
ãèŠãŠã¿ãŸãããã ã¯ã©ã¹ã¯æ°Žã®ç¶æ
ã®å€åã管çããŸãã ãã®åé¡ã®å€å
žçãªè§£æ±ºçã®åé¡ãç ç©¶ããåŸã
FrameãšåŒã°ããæ°ããè¡šèšæ³ã«ã€ããŠè°è«ããçºèŠããå°é£ã«ã©ã®ããã«å¯ŸåŠã§ãããã瀺ããŸãã
ãŸãæ°Žãæ²žéš°ãããŠ......
ç§åŠã¯ã枩床ãå€åãããšãã«ç©è³ªãã§ãããã¹ãŠã®å¯èœãªé·ç§»ã«ååãä»ããŸããã
ãã®ã¯ã©ã¹ã¯éåžžã«åçŽã§ãïŒç¹ã«æçšã§ã¯ãããŸããïŒã ç¶æ
éã®é·ç§»ã®èª²é¡ã«çããç®çã®ã¿ãŒã²ããç¶æ
ã«é©ãããŸã§æž©åºŠã倿ŽããŸãã
ïŒæ³šïŒç§ã¯ãã®æ¬äŒŒã³ãŒããæžããŸãããããªãèªèº«ã®å±éºãšãªã¹ã¯ã§ã®ã¿ããªãã®ä»äºã§ããã䜿çšããŠãã ãããïŒ
class WaterSample { temp:int Water(temp:int) { this.temp = temp }
æåã®äŸãšæ¯èŒããŠããã®ã³ãŒãã«ã¯ç¹å®ã®æ¹åç¹ããããŸãã ãŸããããŒãã³ãŒãããããããžãã¯ãçªå·ïŒ32ã212ïŒã¯ãç¶æ
枩床å¢çã®å®æ°ïŒWATER_SOLID_TEMPãWATER_GAS_TEMPïŒã«çœ®ãæããããŸãã ãã®å€æŽã«ããã鿥çã§ã¯ãããŸãããç¶æ
ãããæç¢ºã«ãªãå§ããŸãã
ãŸãããã®ã³ãŒãã¯ãæäœã«äžé©åãªç¶æ
ã«ããã¡ãœããã®åŒã³åºããå¶éãããé²åŸ¡çããã°ã©ãã³ã°ããã§ãã¯ãå°å
¥ããŠããŸãã ããšãã°ãæ°Žãæ¶²äœã§ãªãå Žåãæ°Žã¯åçµã§ããŸãããããã¯ïŒèªç¶ã®ïŒæ³ã«éåããŸãã ãã ãããŠã©ããããã°æ¡ä»¶ã远å ãããšãã³ãŒãã®ç®çã®çè§£ãè€éã«ãªããŸãã äŸïŒ
ãã®æ¡ä»¶ä»ããã§ãã¯ã¯æ¬¡ã®ããšãè¡ããŸãã
temp
GASéçæž©åºŠããäœããã©ããã確èªããŸãtemp
ãåºäœéçæž©åºŠãè¶
ããŠãããã©ããã確èªããŸã- ãããã®ãã§ãã¯ã®ãããããçã§ãªãå Žåããšã©ãŒãè¿ããŸã
ãã®ããžãã¯ã¯çŽããããã§ãã 第äžã«ãæ¶²äœç¶æ
ã«ãããã©ããã¯ãç©è³ªãåºäœãŸãã¯æ°äœã§ã¯
ãªããã®ã«ãã£ãŠæ±ºå®ãããŸãã
(temp < WATER_GAS_TEMP && temp > WATER_SOLID_TEMP)
次ã«ãã³ãŒãã¯æ°Žãæ¶²äœãã©ããã確èªããŠããšã©ãŒãè¿ãå¿
èŠããããã©ããã調ã¹ãŸãã
!(temp < WATER_GAS_TEMP && temp > WATER_SOLID_TEMP)
ãã®ç¶æ
ã®äºéåŠå®ãåããŠçè§£ããã®ã¯ç°¡åã§ã¯ãããŸããã åŒã®è€éãããããã«æžããåçŽåãæ¬¡ã«ç€ºããŸãã
bool isLiquidWater = (temp < WATER_GAS_TEMP && temp > WATER_SOLID_TEMP) if (!isLiquidWater) throw new IllegalStateError()
isLiquidWaterç¶æ
ã¯
æç€ºçã§ããããããã®ã³ãŒãã¯çè§£ããããã§ãã
çŸåšãåé¡ã解決ããæåã®æ¹æ³ãšããŠã
æç€ºçãªç¶æ
ãä¿®æ£ããææ³ãæ€èšããŠããŸãã ãã®ã¢ãããŒãã§ã¯ãã·ã¹ãã ã®è«çç¶æ
ããœãããŠã§ã¢ã®ç©çæ§é ã«ãªããã³ãŒããæ¹åãããŠçè§£ã容æã«ãªããŸãã
ãã¬ãŒã ãã·ã³è¡šèš
ãã¬ãŒã ãã·ã³è¡šèšæ³ïŒFMNïŒã¯ãããŸããŸãªã¿ã€ãã®
ãã·ã³ãå®çŸ©ããã³å®è£
ããããã®ã«ããŽãªã«ã«ãæ¹æ³è«ãããã³ã·ã³ãã«ãªã¢ãããŒããå®çŸ©ãããã¡ã€ã³åºæèšèªïŒDSLïŒã§ãã ç°¡åã«ããããã«ããã¬ãŒã ãªãŒãããã³ãåã«ããã·ã³ããšåŒã³ãŸãããã®è¡šèšæ³ã¯ãããŸããŸãªã¿ã€ãïŒã¹ããŒããã·ã³ãã¹ãã¢ãªãŒãããã³ãããã³ãªãŒãããã³ã®æäžã®é²åâãã¥ãŒãªã³ã°ãã·ã³ïŒã®çè«çåºæºãå®çŸ©ã§ããããã§ãã ããŸããŸãªã¿ã€ãã®ãã·ã³ãšãã®ã¢ããªã±ãŒã·ã§ã³ã«ã€ããŠç¥ãã«ã¯ã
Wikipediaã®ããŒãžã調ã¹ãããšããå§ãããŸãã
ãªãŒãããã³çè«ã¯è峿·±ããããããŸãããïŒéåžžã«çããã声æïŒããã®èšäºã§ã¯ãã·ã¹ãã ã®æ§ç¯ãšã³ãŒãã®èšè¿°ã®ããã®ãããã®åŒ·åãªæŠå¿µã®å®çšåã«çŠç¹ãåœãŠãŸãã
ãã®åé¡ã解決ããããã«ãFrameã¯3ã€ã®çµ±åã¬ãã«ã§æ©èœããæšæºåãããè¡šèšæ³ãå°å
¥ããŸãã
- ãšã¬ã¬ã³ãã§ç°¡æœãªæ§æã§ãã¬ãŒã ã³ã³ãããŒã©ãŒãå®çŸ©ããããã®ããã¹ãDSL
- Frameããã³ã³ãããŒã©ãŒããšåŒã¶ãã·ã³ã®åœ¢ã§ãªããžã§ã¯ãæåã¯ã©ã¹ãå®è£
ããããã®äžé£ã®åç
§ã³ãŒãã£ã³ã°ãã¿ãŒã³
- FMNã䜿çšããŠã°ã©ãã£ã«ã«ã«è¡šçŸããã®ãé£ããè€éãªæäœã衚çŸããèŠèŠè¡šèš - ãã¬ãŒã èŠèŠè¡šèšïŒFVNïŒ
ãã®èšäºã§ã¯ãæåã®2ã€ã®ãã€ã³ããFMNãšåç
§ãã¿ãŒã³ãæ€èšããFVNã®è°è«ã¯ä»åŸã®èšäºã®ããã«æ®ããŸãã
ãã¬ãŒã ã¯ãããã€ãã®éèŠãªåŽé¢ãæã€è¡šèšæ³ã§ãã
- FMNã«ã¯ããªãŒãããã³ã®æŠå¿µã«é¢é£ãã第1ã¬ãã«ã®ãªããžã§ã¯ãããããŸããããªããžã§ã¯ãæåèšèªã§ã¯äœ¿çšã§ããŸããã
- FMN仿§ã§ã¯ãFMN衚èšã®å®è£
æ¹æ³ãç€ºãæšæºã³ãŒããæ¬äŒŒã³ãŒãã§å®çŸ©ããŠããŸãã
- FMNã¯ãŸããªããªããžã§ã¯ãæåèšèªã§ã³ã³ãã€ã«ïŒäœæ¥äžïŒã§ããããã«ãªããŸã
泚ïŒãªãã¡ã¬ã³ã¹å®è£
ã¯ãFMN衚èšã®çµ¶å¯Ÿç䟡æ§ãšããªããžã§ã¯ãæåèšèªã§å®è£
ããããã®ç°¡åãªæ¹æ³ã瀺ãããã«äœ¿çšãããŸãã ä»»æã®æ¹æ³ãéžæã§ããŸãã
ããã§ãFrameã®2ã€ã®æãéèŠãªç¬¬1ã¬ãã«ã®ãªããžã§ã¯ãã
Frame Eventsãš
Frame Controllersã玹ä»ããŸãã
ãã¬ãŒã ã€ãã³ã
FrameEventsã¯ãFMN衚èšã®åçŽãã®äžå¯æ¬ ãªéšåã§ãã FrameEventã¯ãå°ãªããšã次ã®ã¡ã³ããŒå€æ°ãæã€æ§é äœãŸãã¯ã¯ã©ã¹ãšããŠå®è£
ãããŸãã
- ã¡ãã»ãŒãžID
- èŸæžãŸãã¯ãã©ã¡ãŒã¿ãŒãªã¹ã
- ãªããžã§ã¯ããè¿ã
FrameEventã¯ã©ã¹ã®æ¬äŒŒã³ãŒãã¯æ¬¡ã®ãšããã§ãã
class FrameEvent { var _msg:String var _params:Object var _return:Object FrameEvent(msg:String, params:Object = null) { _msg = msg _params = params } }
ãã¬ãŒã 衚èšã§ã¯ãFrameEventãªããžã§ã¯ããèå¥ãã
@èšå·ã䜿çšããŸãã å¿
èŠãªåFrameEvent屿§ã«ã¯ãããã«ã¢ã¯ã»ã¹ããããã®ç¹å¥ãªããŒã¯ã³ããããŸãã
@|message| : - _msg @[param1] : [] @^ : _return
å€ãã®å ŽåãFrameEventã®åäœãæå®ããå¿
èŠã¯ãããŸããã ã»ãšãã©ã®ã³ã³ããã¹ãã¯äžåºŠã«1ã€ã®FrameEventã®ã¿ã§æ©èœããããã屿§ã»ã¬ã¯ã¿ãŒã®ã¿ã䜿çšããããã«è¡šèšã確å®ã«ç°¡çŽ åã§ããŸãã ãããã£ãŠãã¢ã¯ã»ã¹ãç°¡çŽ åã§ããŸãã
|buttonClick|
ãã®ãããªè¡šèšã¯ãæåã¯å¥åŠã«æãããããããŸããããã€ãã³ãã®ãã®ãããªåçŽãªæ§æãFMNã³ãŒãã®çè§£ã倧å¹
ã«ç°¡çŽ åããæ¹æ³ãããã«ããããŸãã
ãã¬ãŒã ã³ã³ãããŒã©ãŒ
ãã¬ãŒã ã³ã³ãããŒã©ã¯ããªããžã§ã¯ãæåã¯ã©ã¹ã§ããããã¬ãŒã ãã·ã³ãå®è£
ããããã«æç¢ºã«å®çŸ©ãããæ¹æ³ã§é åºä»ããããŠããŸãã ã³ã³ãããŒã©ã¿ã€ãã¯ã
ïŒãã¬ãã£ãã¯ã¹ã§èå¥ãããŸãã
#MyController
ããã¯ã次ã®ãªããžã§ã¯ãæåã®æ¬äŒŒã³ãŒããšåçã§ãã
class MyController {}
æããã«ããã®ã¯ã©ã¹ã¯ç¹ã«æçšã§ã¯ãããŸããã 圌ãäœãã§ããããã«ãã³ã³ãããŒã©ãŒã¯ã€ãã³ãã«å¿çããããã«å°ãªããšã1ã€ã®ç¶æ
ãå¿
èŠãšããŸãã
ã³ã³ãããŒã©ã¯ãããŸããŸãªã¿ã€ãã®ãããã¯ãå«ãããã«æ§é åãããŠããŸãããããã¯ã¯ããããã¯ã¿ã€ãã®ååãå²ãããã·ã¥ã§èå¥ãããŸãã
#MyController<br> -block 1- -block 2- -block 3-
ã³ã³ãããŒã©ãŒã«ã¯ãåãããã¯ã®ã€ã³ã¹ã¿ã³ã¹ã1ã€ã ãå«ããããšãã§ãããããã¯ã¿ã€ãã«ã¯ç¹å®ã®ã¿ã€ãã®ãµãã³ã³ããŒãã³ãã®ã¿ãå«ããããšãã§ããŸãã ãã®èšäºã§ã¯ãç¶æ
ã®ã¿ãå«ãããšãã§ãã
-machine-ãããã¯ã®ã¿ã調ã¹ãŸãã ç¶æ
ã¯ã
$ãã¬ãã£ãã¯ã¹ããŒã¯ã³ã«ãã£ãŠèå¥ãããŸãã
ããã§ã¯ã1ã€ã®ç¶æ
ã®ã¿ãæã€ãã·ã³ãå«ãã³ã³ãããŒã©ãŒã®FMNã衚瀺ãããŸãã
#MyController
äžèšã®FMNã³ãŒãã®å®è£
ã¯æ¬¡ã®ãšããã§ãã
class MyController {
ãã·ã³ãããã¯ã®å®è£
ã¯ã次ã®èŠçŽ ã§æ§æãããŸãã
- _state倿°ãçŸåšã®ç¶æ
ã®é¢æ°ãåç
§ããŸãã ã³ã³ãããŒã©ã®æåã®ç¶æ
颿°ã§åæåãããŸãã
- 1ã€ä»¥äžã®ç¶æ
ã¡ãœãã
ãã¬ãŒã ç¶æ
ã¡ãœããã¯ã次ã®ã·ã°ããã£ãæã€é¢æ°ãšããŠå®çŸ©ãããŸãã
func MyState(e:FrameEvent);
ãã·ã³ãããã¯ã®å®è£
ã®ãããã®åºæ¬ãå®çŸ©ããåŸãFrameEventãªããžã§ã¯ãããã·ã³ãšã©ã®çšåºŠçžäºäœçšãããã確èªã§ããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹ãŠããã
ãã·ã³ã®åäœãå¶åŸ¡ããFrameEventsã®çžäºäœçšã¯ããã¬ãŒã è¡šèšæ³ã®ã·ã³ãã«ããšãã¯ãŒã®æ¬è³ªã§ãã ãã ããFrameEventãã©ãããæ¥ãã®ããšãã質åã«ã¯ãŸã çããŠããŸãããã©ã®ããã«ããŠã³ã³ãããŒã©ãŒã«ã¢ã¯ã»ã¹ããŠå¶åŸ¡ããã®ã§ããããã 1ã€ã®ãªãã·ã§ã³ïŒå€éšã¯ã©ã€ã¢ã³ãèªäœãFrameEventsãäœæããã³åæåãã_stateã¡ã³ããŒå€æ°ãæãã¡ãœãããçŽæ¥åŒã³åºãããšãã§ããŸãã
myController._state(new FrameEvent("buttonClick"))
ããè¯ãä»£æ¿æ¹æ³ã¯ã_stateã¡ã³ããŒå€æ°ãžã®çŽæ¥åŒã³åºããã©ããããå
±éã€ã³ã¿ãŒãã§ãŒã¹ãäœæããããšã§ãã
myController.sendEvent(new FrameEvent("buttonClick"))
ãã ãããªããžã§ã¯ãæåãœãããŠã§ã¢ãäœæããéåžžã®æ¹æ³ã«å¯Ÿå¿ããæãæéã®ããããªãæ¹æ³ã¯ãã¯ã©ã€ã¢ã³ãã«ä»£ãã£ãŠã€ãã³ããå
éšãã·ã³ã«éä¿¡ããäžè¬çãªæ¹æ³ãäœæããããšã§ãã
class MyController { func buttonClick() { FrameEvent e = new FrameEvent("buttonClick") _state(e) return e._return } }
Frameã¯ãåŒã³åºããFrameEventsã®å
±éã€ã³ã¿ãŒãã§ã€ã¹ã«å€æããã¡ãœãããå«ã
ã€ã³ã¿ãŒãã§ã€ã¹ãããã¯ã®æ§æãå®çŸ©ããŸãã
#MyController -interface- buttonClick ...
interface
ãããã¯ã«ã¯ä»ã«ãå€ãã®æ©èœããããŸããããã®äŸã§ã¯ããã®ä»çµã¿ã®æŠèŠã説æããŸãã ã·ãªãŒãºã®ä»¥äžã®èšäºã§ããã«èª¬æããŸãã
ããã§ã¯ããã¬ãŒã ãªãŒãããã³ã®æäœãåŒãç¶ãåŠç¿ããŸãããã
ã€ãã³ããã³ãã©ãŒ
è»ãå®çŸ©ããæ¹æ³ã瀺ããŸãããããŸã äœã
ãè¡ãããã®è¡šèšæ³ããã
ãŸãã ã ã€ãã³ããåŠçããã«ã¯ã1ïŒåŠçããå¿
èŠã®ããã€ãã³ããéžæã§ããããšã2ïŒå®è¡äžã®åäœã«ãããæ·»ä»ããããšãå¿
èŠã§ãã
ã€ãã³ããåŠçããããã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãæäŸããã·ã³ãã«ãªãã¬ãŒã ã³ã³ãããŒã©ãŒã次ã«ç€ºããŸãã
#MyController
äžèšã®ããã«ã
_msg
ã€ãã³ãã®
_msg
屿§ã«ã¢ã¯ã»ã¹ãã
_msg
ã«ãFMN衚èšã¯åçŽç·ã®è§ãã£ãã䜿çšããŸãã
|messageName|
FMNã¯ãreturnã¹ããŒãã¡ã³ããè¡šãææ°ããŒã¯ã³ã䜿çšããŸãã äžèšã®ã³ã³ãããŒã©ãŒã¯æ¬¡ã®ããã«å®è£
ãããŸãã
class MyController {
ããã§ã¯ãFMN衚èšãçè§£ãããããã³ãŒãã£ã³ã°ããããå®è£
ãã¿ãŒã³ã«ã©ãã»ã©æç¢ºã«å¯Ÿå¿ããŠãããã確èªããŸãã
ã€ãã³ããã³ã³ãããŒã©ãŒããã·ã³ãã¹ããŒããã€ãã³ããã³ãã©ãŒã®ãããã®åºæ¬çãªåŽé¢ãèšå®ãããããããã®å©ããåããŠå®éã®åé¡ã®è§£æ±ºã«é²ãããšãã§ããŸãã
ã·ã³ã°ã«ãã©ãŒã«ã¹ãã·ã³
äžèšã§ã¯ãããªã圹ã«ç«ããªãã¹ããŒãã¬ã¹ã³ã³ãããŒã©ãŒãèŠãŸããã
#MyController
æçšæ§ã®ããŒããã§ãŒã³ã®1ã€äžã®æ®µéã¯ãåäžã®ç¶æ
ãæã€ã¯ã©ã¹ã§ããããã¯ã圹ã«ç«ããªããã®ã®ãåã«éå±ã§ãã ããããå°ãªããšã圌ã¯å°ãªããšã
äœããããŠ
ãã ã
æåã«ãïŒæé»ã®ïŒç¶æ
ã1ã€ã ãã®ã¯ã©ã¹ãã©ã®ããã«å®è£
ãããããèŠãŠã¿ãŸãããã
class Mono { String status() { return "OFF" } }
ããã§ã¯ç¶æ
ã¯å®£èšãããŠããããæç€ºãããŠããŸããããã³ãŒããäœããå®è¡ããå Žåãã·ã¹ãã ã¯ã皌åäžãç¶æ
ã«ãããšä»®å®ããŸãããã
ãŸããéèŠãªã¢ã€ãã¢ã玹ä»ããŸããã€ã³ã¿ãŒãã§ã€ã¹åŒã³åºãã¯ããªããžã§ã¯ãã«ã€ãã³ããéä¿¡ããããšã«äŒŒãŠãããšèŠãªãããŸãã ãããã£ãŠãäžèšã®ã³ãŒãã¯ãã€ãã³ããéä¿¡ããæ¹æ³ãšèŠãªãããšãã§ããŸã| status | åžžã«$ Workingç¶æ
ã®Monoã¯ã©ã¹ã
ãã®ç¶æ³ã¯ãã€ãã³ããã€ã³ãã£ã³ã°ããŒãã«ã䜿çšããŠèŠèŠåã§ããŸãã
次ã«ãåãæ©èœã瀺ããåããã€ã³ãã£ã³ã°ããŒãã«ã«äžèŽããFMNãèŠãŠã¿ãŸãããã
#Mono -machine- $Working |status| ^("OFF")
å®è£
ã¯æ¬¡ã®ããã«ãªããŸãã
class Mono {
returnã¹ããŒãã¡ã³ãã«æ°ããè¡šèšæ³ãå°å
¥ãããŠããããšãããããŸããããã¯ãåŒãè©äŸ¡ããçµæãã€ã³ã¿ãŒãã§ã€ã¹ã«è¿ãããšãæå³ããŸãã
^(return_expr)
ãã®æŒç®åã¯åçã§ã
@^ = return_expr
ãŸãã¯åã«
^ = return_expr
ãããã®æŒç®åã¯ãã¹ãŠæ©èœçã«åçã§ãããã©ãã§ã䜿çšã§ããŸããã
^(return_expr)
ã¯æã衚çŸåããããŸãã
ã¹ããŒãã®é»æºãå
¥ããŸã
ãããŸã§ã«ãç¶æ
ã0ã®ã³ã³ãããŒã©ãŒãšç¶æ
ã1ã®ã³ã³ãããŒã©ãŒãèŠãŠããŸããã ãããã¯ãŸã ããŸãæçšã§ã¯ãããŸããããç§ãã¡ã¯ãã§ã«è峿·±ãäœãã®å±æ©ã«onããŠããŸãã
ãã¹ã¿ã調çããã«ã¯ããŸãã¹ããŒãã®é»æºãå
¥ããå¿
èŠããããŸãã 以äžã¯ãåäžã®ããŒã«å€æ°ãæã€åçŽãªSwitchã¯ã©ã¹ã§ãã
class Switch { boolean _isOn; func status() { if (_isOn) { return "ON"; } else { return "OFF"; } } }
ããã¯äžèŠããŠæããã§ã¯ãããŸããããäžèšã®ã³ãŒãã¯æ¬¡ã®ã€ãã³ããã€ã³ãã£ã³ã°ã®ããŒãã«ãå®è£
ããŠããŸãã
æ¯èŒã®ããã«ãåãåäœã®FMNãæ¬¡ã«ç€ºããŸãã
#Switch1 -machine- $Off |status| ^("OFF") $On |status| ^("ON")
ããã§ãFrame衚èšãã³ãŒãã®ç®çã«ã©ã®ããã«äžèŽããããããããŸããã€ãŸããã³ã³ãããŒã©ãŒã®äœçœ®ã«åºã¥ããŠãã€ãã³ãïŒã¡ãœããåŒã³åºãïŒãåäœã«ã¢ã¿ããããŸãã ããã«ãå®è£
æ§é ã¯ãã€ã³ãã£ã³ã°ããŒãã«ã«ã察å¿ããŠããŸãã
class Switch1 {
ãã®è¡šã«ãããããŸããŸãªç¶æ
ã®ã³ã³ãããŒã©ãŒã®ç®çããã°ããçè§£ã§ããŸãã ãã¬ãŒã è¡šèšæ§é ãšå®è£
ãã¿ãŒã³ã®äž¡æ¹ã«åæ§ã®å©ç¹ããããŸãã
ãã ããã¹ã€ããã«ã¯é¡èãªæ©èœäžã®åé¡ããããŸãã ç¶æ
$ Offã§åæåãããŸãããç¶æ
$ Onã«åãæ¿ããããšã¯ã§ããŸããïŒ ãããè¡ãã«ã¯ã
ç¶æ
倿޿Œç®åãå
¥åããå¿
èŠããããŸãã
ç¶æ
ã倿Ž
ç¶æ
倿Žã¹ããŒãã¡ã³ãã¯æ¬¡ã®ãšããã§ãã
->> $NewState
ããã§ããã®æŒç®åã䜿çšããŠ$ Offãš$ Onãåãæ¿ããããšãã§ããŸãã
#Switch2 -machine- $Off |toggle| ->> $On ^ |status| ^("OFF") $On |toggle| ->> $Off ^ |status| ^("ON")
察å¿ããã€ãã³ããã€ã³ãã£ã³ã°ããŒãã«ã¯æ¬¡ã®ãšããã§ãã
æ°ããã€ãã³ã|ãã°ã«| 2ã€ã®ç¶æ
ãåçŽã«ç¹°ãè¿ã倿Žãããªã¬ãŒãããŸãã ç¶æ
倿޿äœã¯ã©ã®ããã«å®è£
ã§ããŸããïŒ
ã©ããç°¡åã§ãã Switch2ã®å®è£
ã¯æ¬¡ã®ãšããã§ãã
class Switch2 {
Switch2ã§æåŸã®æ¹åãè¡ãããšã§ãç¶æ
ãåãæ¿ããããšãã§ããã ãã§ãªããç¶æ
ãæç€ºçã«èšå®ããããšãã§ããŸãã
#Switch3 -machine- $Off |turnOn| ->> $On ^ |toggle| ->> $On ^ |status| ^("OFF") $On |turnOff| ->> $Off ^ |toggle| ->> $Off ^ |status| ^("ON")
| toggle |ã€ãã³ããšã¯ç°ãªããif | turnOn | Switch3ããã§ã«ãªã³ã«ãªã£ãŠãããšãããŸãã¯| offOff |æ¢ã«ãªãã«ãªã£ãŠãããšãã«éä¿¡ãããã¡ãã»ãŒãžã¯ç¡èŠãããäœãèµ·ãããŸããã
ãã®ããããªæ¹åã«ãããã¯ã©ã€ã¢ã³ãã¯ã¹ã€ããã®ç¶æ
ãæç€ºçã«ç€ºãããšãã§ããŸãã class Switch3 {
ã¹ã€ããã®é²åã®æåŸã®ã¹ãããã¯ãFMNã³ã³ãããŒã©ãŒã®ç®çãçè§£ããããšãããã«ç°¡åãã瀺ããŠããŸããé¢é£ããã³ãŒãã¯ããã¬ãŒã ã¡ã«ããºã ã䜿çšããŠå®è£
ããããšãããã«ç°¡åãã瀺ããŠããŸããSwitchãã·ã³ãäœæããããç«ãã€ããŠèª¿çãéå§ã§ããŸãïŒé³Žãå
·å
ãªãŒãããã³ã®éèŠãªåŽé¢ã¯ã埮åŠã§ã¯ãããŸããããã·ã³ã®çŸåšã®ç¶æ
ã¯ãç¶æ³ïŒããšãã°ã黿ºãå
¥ããïŒãŸãã¯ããŒã¿ãŸãã¯ç°å¢ã®äœããã®åæã®çµæã§ãããšããããšã§ãããã·ã³ãç®çã®ç¶æ
ã«åãæ¿ãããšããããæç€ºãããŸããè»ã®ç¥èããªããŠãç¶æ³ã¯å€ãããªããšããããšã§ãããã ãããã®ä»®å®ã¯åžžã«æ£ãããšã¯éããŸãããç¶æ³ã«ãã£ãŠã¯ãçŸåšã®è«çç¶æ
ã倿ããããã«ããŒã¿ã®æ€èšŒïŒãŸãã¯ãã»ã³ã·ã³ã°ãïŒãå¿
èŠã§ãã- åæåŸ©å
ç¶æ
-ãã·ã³ãäžå®ã®ç¶æ
ãã埩å
ããããšã
- å€éšç¶æ
-ãã·ã³ã®äœæã埩å
ããŸãã¯æäœæã«ç°å¢ã«ååšãããå®éã®ç¶æ³ããå®çŸ©ããŸã
- æ®çºæ§å
éšç¶æ
-å®è¡äžã®ãã·ã³ã«ãã£ãŠç®¡çãããå
éšããŒã¿ã®äžéšããã·ã³ã®å¶åŸ¡å€ã§å€æŽã§ããå Žå
ãããã®ãã¹ãŠã®å Žåãç¶æ³ã倿ããããã«å¿ããŠãã·ã³ã®ç¶æ
ãèšå®ããã«ã¯ãããŒã¿ãç°å¢ããŸãã¯ãã®äž¡æ¹ãããããŒããããå¿
èŠããããŸããçæ³çã«ã¯ããã®ããŒã«è«çã¯ãæ£ããè«çç¶æ
ãå®çŸ©ããåäžã®é¢æ°ã§å®è£
ã§ããŸãããã®ãã¿ãŒã³ããµããŒãããããã«ããã¬ãŒã 衚èšã«ã¯ããŠãããŒã¹ããããŒãããŠçŸåšã®ç¶æ³ã倿ããç¹å¥ãªã¿ã€ãã®æ©èœããããŸãããã®ãããªé¢æ°ã¯ãç¶æ
ãžã®ãªã³ã¯ãè¿ãã¡ãœããã®ååã®åã®$ãã¬ãã£ãã¯ã¹ã§ç€ºãããŸãïŒ $probeForState()
ç§ãã¡ã®ç¶æ³ã§ã¯ããã®ã¡ãœããã¯æ¬¡ã®ããã«å®è£
ã§ããŸãã func probeForState():FrameState { if (temp < 32) return Solid if (temp < 212) return Liquid return Gas }
ã芧ã®ãšããããã®ã¡ãœããã¯æ£ããè«çç¶æ
ã«å¯Ÿå¿ããç¶æ
颿°ãžã®åç
§ãè¿ãã ãã§ãããã®æ€ç¥æ©èœã䜿çšããŠãæ£ããç¶æ
ã«å
¥ãããšãã§ããŸãã ->> $probeForState()
å®è£
ã¡ã«ããºã ã¯æ¬¡ã®ããã«ãªããŸãã _state = probeForState()
ç¶æ
æ€ç¥æ¹æ³ã¯ãæå®ã®æ¹æ³ã§ç¶æ
ã管çããããã®ãã¬ãŒã 衚èšã®äŸã§ããæ¬¡ã«ãFrameEventsã管çããããã®éèŠãªè¡šèšæ³ã«ã€ããŠãåŠç¿ããŸããè¡åã®ç¶æ¿ãšãã£ã¹ãããã£ãŒ
åäœã®ç¶æ¿ãšãã£ã¹ãããã£ãŒã¯åŒ·åãªããã°ã©ãã³ã°ãã©ãã€ã ã§ããããã®èšäºã®ãã¬ãŒã 衚èšã«é¢ããæåŸã®ãããã¯ã§ããFrameã¯ãããŒã¿ãŸãã¯ä»ã®å±æ§ã®ç¶æ¿ã§ã¯ãªããåäœã®ç¶æ¿ã䜿çšããŸãããã®ç¶æ
ã§ã¯ãåæç¶æ
ãã€ãã³ããåŠçããªãå ŽåïŒãŸãã¯ã次ã®èšäºã§èª¬æããããã«ãåã«ã€ãã³ããæž¡ãããå ŽåïŒãFrameEventsã¯ä»ã®ç¶æ
ã«éä¿¡ãããŸãããã®äžé£ã®ã€ãã³ãã¯ãä»»æã®æ·±ãã«å°éã§ããŸãããã®ããã«ããã·ã³ã¯ã¡ãœãããã§ãŒã³ãšåŒã°ããææ³ã䜿çšããŠå®è£
ã§ããŸããããç¶æ
ããå¥ã®ç¶æ
ã«ã€ãã³ããéä¿¡ããããã®FMN衚èšã¯ããã£ã¹ããã㣠=>ã§ãã $S1 => $S2
ãã®FMNã¹ããŒãã¡ã³ãã¯ã次ã®ããã«å®è£
ã§ããŸãã func S1(e:FrameEvent) { S2(e)
ç¶æ
ã¡ãœãããé£éãããã®ãã©ãã»ã©ç°¡åããããããŸããããã®ææ³ãããªãé£ããç¶æ³ã«é©çšããŠã¿ãŸãããã #Movement -machine- $Walking => $Moving |getSpeed| ^(3) |isStanding| ^(true) $Running => $Moving |getSpeed| ^(6) |isStanding| ^(true) $Crawling => $Moving |getSpeed| ^(.5) |isStanding| ^(false) $AtAttention => $Motionless |isStanding| ^(true) $LyingDown => $Motionless |isStanding| ^(false) $Moving |isMoving| ^(true) $Motionless |getSpeed| ^(0) |isMoving| ^(false)
äžèšã®ã³ãŒãã§ã¯ã2ã€ã®åºæ¬çãªç¶æ
-$ Movingãš$ Motionless-ããããä»ã®5ã€ã®ç¶æ
ã¯ãããããéèŠãªæ©èœãç¶æ¿ããŠããŸããã€ãã³ããã€ã³ãã£ã³ã°ã¯ããã€ã³ãã£ã³ã°ã®äžè¬çãªå€èгãæç¢ºã«ç€ºããŠããŸããç§ãã¡ãåŠãã ãã¯ããã¯ã®ãããã§ãå®è£
ã¯éåžžã«ç°¡åã«ãªããŸãã class Movement {
絊氎æ©
ããã§ãFMNã«é¢ããåºæ¬çãªç¥èãåŸãããWaterSampleã¯ã©ã¹ãç¶æ
ã䜿çšããŠãããã€ã³ããªãžã§ã³ããªæ¹æ³ã§åå®è£
ããæ¹æ³ãçè§£ã§ããããã«ãªããŸããããŸãã倧åŠé¢çã®ç©çåŠè
ã«ãšã£ãŠæçšãªãã®ã«ããæ°ãã$ãã©ãºãç¶æ
ã远å ããŸããFMNã®å®å
šãªå®è£
ã¯æ¬¡ã®ããã«ãªããŸãã #WaterSample -machine- $Begin |create|
ã芧ã®ãšãããåæç¶æ
ã¯$ Beginã§ãã¡ãã»ãŒãžã«å¿çããŸã| create |ãããŠäŸ¡å€ãä¿æããŸãtemp
ãæ€ç¥æ©èœã¯æåã«åæå€temp
ããã§ãã¯ããŠè«çç¶æ
ãæ±ºå®ããæ¬¡ã«ãã·ã³ã®ãã®ç¶æ
ãžã®ç§»è¡ãå®è¡ããŸãããã¹ãŠã®ç©ççç¶æ
ïŒ$åºäœã$æ¶²äœã$ã¬ã¹ã$ãã©ãºãïŒã¯ã$ããã©ã«ãç¶æ
ããä¿è·åäœãç¶æ¿ããŸããçŸåšã®ç¶æ
ã«å¯ŸããŠç¡å¹ãªãã¹ãŠã®ã€ãã³ãã¯ã$ Defaultç¶æ
ã«æž¡ãããInvalidStateErrorãšã©ãŒãã¹ããŒãããŸããããã¯ãæ¯ãèãã®ç¶æ¿ã䜿çšããŠãåçŽãªé²åŸ¡ããã°ã©ãã³ã°ãå®è£
ããæ¹æ³ã瀺ããŠããŸãããããŠä»ãå®è£
ïŒ class WaterSample {
ãããã«
ãªãŒãããã³ã¯ããœãããŠã§ã¢ãšãââãŒããŠã§ã¢ã®éçºã®å°éåéã§ã®ã¿é·ãé䜿çšãããŠããã³ã³ãã¥ãŒã¿ãŒãµã€ãšã³ã¹ã®åºæ¬æŠå¿µã§ãã Frameã®äž»ãªç®çã¯ããªãŒãããã³ãèšè¿°ããããã®è¡šèšæ³ãäœæããã³ãŒããŸãã¯ãã¡ã«ããºã ããå®è£
ããããã®ç°¡åãªãã¿ãŒã³ãèšå®ããããšã§ãã Frame衚èšãããã°ã©ããŒã®ãã·ã³ã®èŠæ¹ãå€ããæ¥åžžã®ããã°ã©ãã³ã°ã¿ã¹ã¯ã§ããããå®è·µããç°¡åãªæ¹æ³ãæäŸãããããŠãã¡ãããã³ãŒãã®ã¹ãã²ããã£ããããããä¿åããããšãé¡ã£ãŠããŸããã¿ãŒãããŒã¿ãŒããã¹ã¿ãé£ã¹ãïŒéŽæšããæ®åœ±ïŒä»åŸã®èšäºã§ã¯ãç§ãã¡ãåŠãã æŠå¿µã«åºã¥ããŠãFMNè¡šèšæ³ã®ããã«å€§ããªåãšè¡šçŸåãäœæããŸããæéãçµã€ã«ã€ããŠãFMNãå«ã¿ããœãããŠã§ã¢ã¢ããªã³ã°ãžã®ææ°ã®ã¢ãããŒãã«ãããäžç¢ºå®ãªåäœã®åé¡ã解決ããããžã¥ã¢ã«ã¢ããªã³ã°ã®ç ç©¶ã«è°è«ãæ¡å€§ããŸãã