ã¯ããã«
ãã®ãããç¯å² ã æ¹æ³è« ãããã³ã¢ãŒããã¯ãã£ããã§ã«æ±ºå®ããŠããŸãã çè«ããå®è·µãã³ãŒãã®äœæã«ç§»ããŸãããã ãŸããããžãã¹ããžãã¯ïŒ ãµãŒãã¹ãšã€ã³ã¿ã©ã¯ã¿ãŒïŒãèšè¿°ãããã¶ã€ã³ãã¿ãŒã³ããå§ããããšæããŸãã ãããããããã«çæããåã«ã ValueObjectãšEntityã®æ§é ãã¿ãŒã³ã調ã¹ãŸãã ã«ããŒèšèªã§éçºããŸãã ãããªãèšäºã§ã¯ã Variable Architectureã䜿çšããŠéçºã«å¿
èŠãªãã¹ãŠã®ãã¿ãŒã³ãåæããŸãã ãã®äžé£ã®èšäºãžã®å¿çšã§ãããã¹ãŠã®éçºã¯ãå¥ã®ãã¬ãŒã ã¯ãŒã¯ã§åéãããŸãã

ãããŠããã§ã«é©åãªåå-LunaParkãéžæããŠããŸãã
çŸåšã®éçºã¯Githubã«æçš¿ãããŠããŸãã
ãã¹ãŠã®ãã³ãã¬ãŒããæ€èšŒããåŸã1ã€ã®æ¬æ Œçãªãã€ã¯ããµãŒãã¹ãçµã¿ç«ãŠãŸãã
æŽå²çã«
Ruby on Railsã§èšè¿°ãããè€éãªãšã³ã¿ãŒãã©ã€ãºã¢ããªã±ãŒã·ã§ã³ããªãã¡ã¯ã¿ãªã³ã°ããå¿
èŠããããŸããã ã«ããŒéçºè
ã®æ¢è£œã®ããŒã ããããŸããã ãã¡ã€ã³é§åéçºã®æ¹æ³è«ã¯ãããã®ã¿ã¹ã¯ã«æé©ã§ãããã䜿çšãããŠããèšèªã§ã®ã¿ãŒã³ããŒãœãªã¥ãŒã·ã§ã³ã¯ãããŸããã§ããã èšèªã®éžæã¯äž»ã«ç§ãã¡ã®å°éåéã«ãã£ãŠæ±ºå®ããããšããäºå®ã«ãããããããéåžžã«æåããããšãå€æããŸããã ç§ã®æèŠã§ã¯ãWebã¢ããªã±ãŒã·ã§ã³ã§äžè¬çã«äœ¿çšããããã¹ãŠã®èšèªã®äžã§ãã«ããŒãæãè¡šçŸåããããŸãã ãããã£ãŠãå®éã®ãªããžã§ã¯ãã®ã¢ããªã³ã°ã«é©ãããã®ã¯ä»ã«ãããŸããã ããã¯ç§ã®æèŠã ãã§ã¯ãããŸããã
ãããJavaã®äžçã§ãã 次ã«ãRubyã®ãããªæ°åè
ãããŸãã Rubyã«ã¯éåžžã«è¡šçŸåè±ããªæ§æãããããã®åºæ¬ã¬ãã«ã§ã¯ãDDDã«ãšã£ãŠéåžžã«åªããèšèªã§ããå¿
èŠããããŸãïŒãããã®çš®é¡ã®ã¢ããªã±ãŒã·ã§ã³ã§ã®å®éã®äœ¿çšã«ã€ããŠã¯ãŸã èããŠããŸãããïŒã Railsã¯ã1990幎代ååã®Web以åã®UIãšåããããç°¡åã«Web UIãäœæã§ããããã«ãªã£ããããå€ãã®è奮ããããããŸããã çŸæç¹ã§ã¯ããã®æ©èœã¯ããã¡ã€ã³ã®è±å¯ããããŸãæããªãèšå€§ãªæ°ã®Webã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ã«äž»ã«é©çšãããŠããŸãã ããããç§ã®æåŸ
ã¯ãåé¡ã®UIå®è£
ã®éšåãåæžãããã«ã€ããŠã人ã
ãããããã¡ã€ã³ã«ãã£ãšæ³šæãåããæ©äŒãšèŠãªãããšã§ãã Rubyã®äœ¿çšããã®æ¹åã«é²ãããã«ãªãã°ãDDDã«åªãããã©ãããã©ãŒã ãæäŸã§ãããšæããŸãã ïŒã€ã³ãã©ã¹ãã©ã¯ãã£ã®ããã€ãã®èŠçŽ ãåããå¿
èŠãããã§ããããïŒ
ãšãªãã¯ã»ãšãŽã¡ã³ã¹2006
æ®å¿µãªãããéå»13幎éã倧ããªå€åã¯ãããŸããã§ããã ã€ã³ã¿ãŒãããäžã§ã¯ãRailsãããã«é©å¿ãããè©Šã¿ãèŠã€ããããšãã§ããŸãããã©ããã²ã©ãããã«èŠããŸãã Railsãã¬ãŒã ã¯ãŒã¯ã¯éããé
ããSOLIDã§ã¯ãããŸããã ActiveRecordã«åºã¥ããRepositoryãã¿ãŒã³ã®å®è£
ã誰ããã©ã®ããã«æåããããšããŠããã®ããæ¶ãªãã§èŠãããšã¯éåžžã«å°é£ã§ãã ãã€ã¯ããã¬ãŒã ã¯ãŒã¯ãæ¡çšããããŒãºã«åãããŠæ¹è¯ããããšã«ããŸããã Grapeãè©ŠããŠã¿ãŸããããèªåããã¥ã¡ã³ãåã®ã¢ã€ãã¢ã¯æåããããã«èŠããŸããããããã§ãªãå Žåã¯æŸæ£ãããããã«ããã䜿çšãããšããã¢ã€ãã¢ãæŸæ£ããŸããã ãããŠãããã«å¥ã®ãœãªã¥ãŒã·ã§ã³ã ã·ããã©ã䜿çšãå§ããŸããã REST ã³ã³ãããŒã©ãŒããã³ãšã³ããã€ã³ãã«ã¯åŒãç¶ã䜿çšããŸã ã
RESTïŒWebã¢ããªã±ãŒã·ã§ã³ãéçºããå Žåããã®æè¡ã«ã€ããŠæ¢ã«ã¢ã€ãã¢ãæã£ãŠããŸãã é·æãšçæããããå®å
šãªãªã¹ãã¯ãã®èšäºã®ç¯å²å€ã§ãã ãããããšã³ã¿ãŒãã©ã€ãºã¢ããªã±ãŒã·ã§ã³ã®éçºè
ãšããŠã®ç§ãã¡ã«ãšã£ãŠæãéèŠãªæ¬ ç¹ã¯ãRESTïŒååãããæããã§ãïŒãããã»ã¹ã§ã¯ãªããã®ç¶æ
ãåæ ããããšã§ãã ãããŠããã®å©ç¹ã¯ç解ããããããšã§ãããã®æè¡ã¯ãããã¯ãšã³ãéçºè
ãšããã³ããšã³ãéçºè
ã®äž¡æ¹ã«ãšã£ãŠæããã§ãã
ãããããã®åŸãRESTã«çŠç¹ãåœãŠãã®ã§ã¯ãªããhttp + jsonãœãªã¥ãŒã·ã§ã³ãå®è£
ããŸããïŒ ãµãŒãã¹APIãéçºãããã®èª¬æã第äžè
ã«æäŸãããšããŠããå€ãã®è³ªåãå¯ããããŸãã 䜿ãæ
£ããRESTãæäŸããå Žåãããã¯ããã«å€ãã®ããšãã§ããŸãã
RESTã®äœ¿çšã¯åŠ¥åæ¡ãšèããŸãã éçºè
ããªã¯ãšã¹ã圢åŒããããèæŠã«æéã浪費ããªãããã«ãç°¡æœããšjsonapiæšæºã®ããã«JSONã䜿çšããŸãã
å°æ¥ã Endpointãåæãããšããæ®ããåãé€ãããã«ã¯ã1ã€ã®ã¯ã©ã¹ã®ã¿ãæžãæããã ãã§ååã§ããããšãããããŸãã ãããã£ãŠãRESTã«çåãããå Žåã¯ãRESTããŸã£ããæ°ã«ããå¿
èŠã¯ãããŸããã
ããã€ãã®ãã€ã¯ããµãŒãã¹ãäœæããéçšã§ãåºç€-æœè±¡ã¯ã©ã¹ã®ã»ãããååŸããŸããã ãã®ãããªåã¯ã©ã¹ã¯30åã§èšè¿°ã§ããŸãããã®ã³ãŒãã®ç®çãç¥ã£ãŠããã°ãã³ãŒãã¯ç°¡åã«ç解ã§ããŸãã
ããã§äž»ãªå°é£ãçããŸããã DDDãã©ã¯ãã£ã¹ãšã¯ãªãŒã³ãªã¢ãŒããã¯ãã£ã«å¯ŸåŠããªãã£ãæ°ããåŸæ¥å¡ã¯ãã³ãŒããšãã®ç®çãç解ã§ããŸããã§ããã ãšãŽã¡ã³ã¹ãèªãåã«ç§èªèº«ããã®ã³ãŒããåããŠèŠãå Žåãç§ã¯ãããã¬ã¬ã·ãŒããªãŒããŒãšã³ãžãã¢ãªã³ã°ãšèŠãªããŸãã
ãã®é害ãå
æããããã«ã䜿çšãããã¢ãããŒãã®å²åŠã説æããããã¥ã¡ã³ãïŒã¬ã€ãã©ã€ã³ïŒãæžãããšã決å®ãããŸããã ãã®ããã¥ã¡ã³ãã®æŠèŠã¯æåããããã§ãHabréã«æ²èŒããããšã«ããŸããã ãããžã§ã¯ãããšã«ç¹°ãè¿ãããæœè±¡ã¯ã©ã¹ã¯ãå¥ã®gemã«é
眮ããããšã«ããŸããã
å²åŠ

æŠéã«ã€ããŠã®å€å
žçãªæ ç»ãæãåºãã°ã極ãå·§ã¿ã«æ±ã£ãŠããã¿ããªç·ãããã§ãããã 6ã€ç®ã¯ãæ¬è³ªçã«éåžžã«åå§çãªããŒã«ã§ããã¹ãã£ãã¯ã§ããã人éã®æã«èœã¡ãæåã®ããŒã«ã®1ã€ã§ãã ãããããã¹ã¿ãŒã®æã§ã圌ã¯æãã¹ãæŠåšã«ãªããŸãã
足ãæããªããã¹ãã«ãäœæããã®ã«æéãè²»ãããããŸãã¯å°æã®ãã¯ããã¯ãåŠã¶ã®ã«æéãè²»ããããšãã§ããŸãã 4ã€ã®åºæ¬ååãç¹å®ããŸããã
- è€éãªãã®ãã·ã³ãã«ã«ããå¿
èŠããããŸãã
- æè¡ãããç¥èãéèŠã§ãã ããã¥ã¡ã³ãã¯ã³ãŒãããã人ã«ãšã£ãŠç解ãããããã®ã§ãããããã¥ã¡ã³ããå¥ã®ãã®ã«çœ®ãæããã¹ãã§ã¯ãããŸããã
- å®çšäž»çŸ©ã¯ç¬æ䞻矩ãããéèŠã§ãã æšæºã¯ãå¢çããã¯ã¹ãèšå®ããã®ã§ã¯ãªããæ¹æ³ãã¬ã€ãããå¿
èŠããããŸãã
- ã¢ãŒããã¯ãã£ã®æ§é æ§ããœãªã¥ãŒã·ã§ã³ã®éžæã«ãããæè»æ§ã
åæ§ã®å²åŠã¯ãããšãã°ãArchLinux OS- The Arch Wayã§ãã©ãããšãã§ããŸãã ç§ã®ã©ãããããã§ã¯ãLinuxã¯é·ãéå®çããŠããŸããã§ããããé
ããæ©ããã¯ã©ãã·ã¥ããŠããŸããåžžã«åã€ã³ã¹ããŒã«ããå¿
èŠããããŸããã ããã¯å€ãã®åé¡ãåŒãèµ·ãããæã«ã¯ä»äºã®ç· ãåãã®æ··ä¹±ãªã©ã®æ·±å»ãªåé¡ãåŒãèµ·ãããŸããã ããããArchãã€ã³ã¹ããŒã«ããŠ2ã3æ¥ãè²»ãããåŸãOSãã©ã®ããã«æ©èœããããç解ããŸããã ãã®åŸã圌女ã¯å€±æããããšãªããããå®å®ããä»äºãå§ããŸããã ç§ã®ã¡ã¢ã¯ãæ°æéã§æ°ããPCã«ã€ã³ã¹ããŒã«ããã®ã«åœ¹ç«ã¡ãŸããã è±å¯ãªããã¥ã¡ã³ãã¯ãæ°ããåé¡ã®è§£æ±ºã«åœ¹ç«ã¡ãŸããã
ãã¬ãŒã ã¯ãŒã¯ã«ã¯ã絶察ã«é«ã¬ãã«ã®ãã£ã©ã¯ã¿ãŒããããŸãã ãããèšè¿°ããã¯ã©ã¹ã¯ãã¢ããªã±ãŒã·ã§ã³ã®æ§é ãæ
åœããŸãã ãµãŒãããŒãã£ã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããŠãããŒã¿ããŒã¹ãšããåãããhttpãããã³ã«ããã®ä»ã®äœã¬ãã«ã®ãã®ãå®è£
ããŸãã ããã°ã©ããŒã«ã³ãŒããã®ããèŠããŠã1ã€ãŸãã¯å¥ã®ã¯ã©ã¹ãã©ã®ããã«æ©èœããããç解ããŠãããããã§ãããŸããããã¥ã¡ã³ãã«ããããããã®ç®¡çæ¹æ³ãç解ã§ããŸãã ãšã³ãžã³ã®èšèšãç解ããŠããè»ãé転ããããšã¯ã§ããŸããã
æ çµã¿
éåžžã®æå³ã§LunaParkããã¬ãŒã ã¯ãŒã¯ãšåŒã¶ããšã¯å°é£ã§ãã ãã¬ãŒã -ãã¬ãŒã ãä»äº-ä»äºã ç§ãã¡ã¯èªåèªèº«ãç¯å²ã«éå®ããªãããšã匷ãæ±ããŸãã 宣èšããå¯äžã®ãã¬ãŒã ã¯ããã®ããžãã¯ãŸãã¯ãã®ããžãã¯ãèšè¿°ããã¯ã©ã¹ã«äŒãããã¬ãŒã ã§ãã ããã¯ãããããããã®ããã®åºç¯ãªæ瀺ãåããããŒã«ã®ã»ããã§ãã
åã¯ã©ã¹ã¯æœè±¡çã§ããã3ã€ã®ã¬ãã«ããããŸãã
module LunaPark
åäžã®èŠçŽ ãäœæãããã©ãŒã ãå®è£
ããå Žåããã®ã¯ã©ã¹ããç¶æ¿ããŸãã
module Forms class Create < LunaPark::Forms::Single
è€æ°ã®èŠçŽ ãããå Žåãå¥ã®å®è£
ã䜿çšããŸãã
module Forms class Create < LunaPark::Forms::Multiple
çŸæç¹ã§ã¯ããã¹ãŠã®éçºãå®å
šã«æŽã£ãŠããããã§ã¯ãªããgemã¯ã¢ã«ãã¡ç¶æ
ã§ãã èšäºã®çºè¡ã«åŸã£ãŠã段éçã«åŒçšããŸãã ã€ãŸã ValueObject
ãšEntity
ã«é¢ããèšäºã衚瀺ãããå Žåããããã®2ã€ã®ãã³ãã¬ãŒãã¯æ¢ã«å®è£
ãããŠããŸãã ãµã€ã¯ã«ã®çµãããŸã§ã«ããããã¯ãã¹ãŠãããžã§ã¯ãã§ã®äœ¿çšã«é©ãããã®ã«ãªããŸãã ãã¬ãŒã ã¯ãŒã¯èªäœã¯sinatra \ rodaãžã®ãªã³ã¯ãªãã§ã¯ã»ãšãã©åœ¹ã«ç«ããªãã®ã§ããããžã§ã¯ãããã°ããéå§ããããã«ããã¹ãŠãå°ç¡ãã«ãããæ¹æ³ã瀺ãå¥ã®ãªããžããªãäœæãããŸãã
ãã¬ãŒã ã¯ãŒã¯ã¯ãäž»ã«ããã¥ã¡ã³ããžã®ã¢ããªã±ãŒã·ã§ã³ã§ãã ãããã®èšäºããã¬ãŒã ã¯ãŒã¯ã®ããã¥ã¡ã³ããšããŠåãåããªãã§ãã ããã
ããã§ã¯ãããžãã¹ã«åãæãããŸãããã
å€ãªããžã§ã¯ã
-圌女ã®èº«é·ã¯ïŒ
-151
-ããªãã¯èªç±ã®å¥³ç¥ãšäŒãå§ããŸãããïŒ
ãã®ãããªäœããã€ã³ãã£ã¢ãã§èµ·ãã£ããããããªãã 人éã®æé·ã¯åãªãæ°ã§ã¯ãªãã枬å®ã®åäœã§ããããŸãã ãªããžã§ã¯ãã®å±æ§ã¯ãããªããã£ãïŒæŽæ°ãæååãããŒã«ãªã©ïŒã«ãã£ãŠã®ã¿èšè¿°ã§ãããšã¯éããããããã®çµã¿åãããå¿
èŠã«ãªãå ŽåããããŸãã
- ãéã¯åãªãæ°åã§ã¯ãªããæ°åïŒéé¡ïŒ+é貚ã§ãã
- æ¥ä»ã¯ãæ¥ãæãããã³å¹Žã§æ§æãããŸãã
- äœéã枬å®ããã«ã¯ã1ã€ã®æ°å€ã§ã¯äžååã§ããã枬å®åäœãå¿
èŠã§ãã
- ãã¹ããŒãçªå·ã¯ãã·ãªãŒãºãšå®éã«ã¯çªå·ã§æ§æãããŠããŸãã
äžæ¹ãããã¯åžžã«çµã¿åããã§ã¯ãªããããããããªããã£ãã®äžçš®ã®æ¡åŒµã§ãã
å€ãã®å Žåãé»è©±çªå·ã¯çªå·ãšèŠãªãããŸãã ãã®äžæ¹ã§ã圌ãå ç®ãŸãã¯é€ç®ã®æ¹æ³ãæã£ãŠããã¹ãã§ã¯ãªãã§ãããã ãããããåœã³ãŒããçºè¡ããã¡ãœãããšéœåžã³ãŒããå®çŸ©ããã¡ãœããããããŸãã ãããããæ°åã®æåå79001231212
ãšããŠã ãã§ãªããèªã¿åãå¯èœãªæåå79001231212
ãšããŠæ瀺ããç¹å®ã®è£
食æ¹æ³ãããã§ãããã
ãã¶ããã³ã¬ãŒã¿ãŒïŒæ矩ã«åºã¥ããŠãããã¯è°è«ã®äœå°ã®ãªã-ã¯ãã åžžèçã«ãã®ãžã¬ã³ãã«è¿ã¥ããå Žåããã®çªå·ã«é»è©±ããããšã決å®ãããšããªããžã§ã¯ãèªäœãé»è©±ã«è»¢éããŸãã
phone.call Values::PhoneNumber.new(79001231212)
ãããŠãæååãšããŠè¡šç€ºããããšã«ããå Žåãããã¯æããã«äººã«å¯ŸããŠè¡ãããŸãã ã§ã¯ããªããã®è¡ãããã«äººãèªããããã«ããªãã®ã§ããããïŒ
Values::PhoneNumber.new(79001231212).to_s
Three Axesãªã³ã©ã€ã³ã«ãžãã®ãµã€ããäœæããã«ãŒãã²ãŒã ã販売ããŠãããšããŸãã ããã©ã³ããã¯ã©ã¹ãå¿
èŠã«ãªããŸãã
module Values class PlayingCard < Lunapark::Values::Compound attr_reader :suit, :rank end end
ãããã£ãŠãã¯ã©ã¹ã«ã¯2ã€ã®èªã¿åãå°çšå±æ§ããããŸãã
- ã¹ãŒã-ã«ãŒãã¹ãŒã
- ã©ã³ã¯-ã«ãŒãã®å°å³
ãããã®å±æ§ã¯ããããã®äœææã«ã®ã¿èšå®ããããããã®äœ¿çšæã«ã¯å€æŽã§ããŸããã ãã¡ããããã©ã³ããåãã 8ãæ¶ããŠQãæžããŸãããããã¯åãå
¥ããããŸããã ãŸãšããªç€ŸäŒã§ã¯ãã»ãšãã©ã®å Žåãããªãã¯æãããŸãã ãªããžã§ã¯ãã®äœæåŸã«å±æ§ãå€æŽã§ããªãããšã«ãããå€ãªããžã§ã¯ãã®æåã®ããããã£ã§ããäžå€æ§ã決ãŸããŸãã
å€ãªããžã§ã¯ãã®2çªç®ã®éèŠãªããããã£ã¯ãããããæ¯èŒããæ¹æ³ã§ãã
module Values RSpec.describe PlayingCard do let(:card) { described_class.new suit: :clubs, rank: 10 } let(:other) { described_class.new suit: :clubs, rank: 10 } it 'should be eql' do expect(card).to eq other end end end
ãã®ãããªãã¹ãã¯ã¢ãã¬ã¹ã§æ¯èŒãããããã倱æããŸãã ãã¹ãã«åæ Œããã«ã¯ã Value-Obectsãå€ã§æ¯èŒããå¿
èŠããããŸãããã®ãããæ¯èŒã¡ãœãããè¿œå ããŸãã
def ==(other) suit == other.suit && rank == other.rank end
ããã§ãã¹ãã«åæ ŒããŸãã æ¯èŒãè¡ãã¡ãœãããè¿œå ããããšãã§ããŸããã10ãšKãæ¯èŒããã«ã¯ã©ãããã°ããã§ããïŒ ããããæ¢ã«æšæž¬ãããŠããããã«ãããããValue Objectsã®åœ¢åŒã§æ瀺ããŸãã ããŠã次ã®ãããªããã10ã¯ã©ããéå§ããå¿
èŠããããŸãã
ten = Values::Rank.new('10') clubs = Values::Suits.new(:clubs) ten_clubs = Values::PlayingCards.new(rank: ten, clubs: clubs)
ã«ãã«ã¯3è¡ã§ååã§ãã ãã®å¶éãåé¿ããããã«ã Object-Valueã® 3çªç®ã®ããããã£ã§ãã売ãäžããå°å
¥ããŸãã .wrap
ã¯ã©ã¹ã®ç¹å¥ãªã¡ãœããã.wrap
ãŸãããããã®ã¡ãœããã¯ãããŸããŸãªã¿ã€ãã®å€ãååŸããé©åãªå€ã«å€æã§ããŸãã
class PlayingCard < Lunapark::Values::Compound def self.wrap(obj) case obj.is_a? self.class
ãã®ã¢ãããŒãã«ã¯å€§ããªå©ç¹ããããŸãã
ten = Values::Rank.new('10') clubs = Values::Suits.new(:clubs) from_values = Values::PlayingCard.wrap rank: ten, suit: clubs from_hash = Values::PlayingCard.wrap rank: '10', suit: :clubs from_obj = Values::PlayingCard.wrap from_values from_str = Values::PlayingCard.wrap '10C'
ãããã®ã«ãŒãã¯ãã¹ãŠåãã§ãã wrap
ã¡ãœãããé©åãªãã©ã¯ãã£ã¹ã«å±éãããå Žåãå¥ã®ã¯ã©ã¹ã«é
眮ããŸãã ç¬æçãªã¢ãããŒãã®èŠ³ç¹ããã¯ãå¥ã®ã¯ã©ã¹ãå¿
é ãšãªããŸãã
ããŒãããããã®ã¹ããŒã¹ã¯ã©ãã§ããïŒ ãã®ã«ãŒããåãæãã©ããã調ã¹ãæ¹æ³ã¯ïŒ ããã¯ãã©ã³ãã§ã¯ãããŸããã ããã¯ãã©ã³ãã®äŸ¡å€ã§ã ã ããã¯ãŸãã«ã段ããŒã«ã®é
ã«ããç¢æ10ã§ãã
Object-Valueãšããªããã£ãã«é¢é£ããå¿
èŠããããŸãããããã¯äœããã®çç±ã§rubyã«å®è£
ãããŠããŸããã§ããã ãããããæåŸã®ããããã£ãçºçããŸã-Object -Valueã¯ã©ã®ãã¡ã€ã³ã«ããã€ã³ããããŠããŸããã
æšå¥šäºé
åããã»ã¹ã®ãã¹ãŠã®ç¬éã«äœ¿çšãããããŸããŸãªæ¹æ³ãšããŒã«ã®äžã§ãä»ã®æ¹æ³ãšæ¯ã¹ãŠããéããããåªããæ¹æ³ãšããŒã«ãåžžã«1ã€ãããŸãã
ãã¬ããªãã¯ã»ãã€ã©ãŒ 1914
ç®è¡æŒç®ã¯æ°ãããªããžã§ã¯ããè¿ãå¿
èŠããããŸã
å€ãªããžã§ã¯ãã®å±æ§ã¯ãããªããã£ããŸãã¯ä»ã®å€ãªããžã§ã¯ãã®ã¿ã§ãã
ã¯ã©ã¹ã¡ãœããå
ã§ç°¡åãªæäœãç¶æãã
æäœãå€æãã倧ããå Žåãããããå¥ã®ã¯ã©ã¹ã«ç§»åããã®ãçã«ããªã£ãŠããŸã
ãã®ãããªããžãã¯ã®å¥ã®ãµãŒãã¹ãžã®è»¢éã¯ã ãµãŒãã¹ãåé¢ãããŠããå Žåã«ã®ã¿å¯èœã§ããå€éšãœãŒã¹ããã®ããŒã¿ã¯äœ¿çšããŸããã ãã®ãµãŒãã¹ã¯ãå€ãªããžã§ã¯ãèªäœã®ã³ã³ããã¹ãã«ãã£ãŠå¶éãããå¿
èŠããããŸãã
å€ãªããžã§ã¯ãã¯ãã¡ã€ã³ããžãã¯ã«ã€ããŠäœãç¥ãããšãã§ããŸãã
ãªã³ã©ã€ã³ã¹ãã¢ãäœæããŠãããååã®è©äŸ¡ããããšããŸãã ååŸããã«ã¯ã ãªããžããªãä»ããŠããŒã¿ããŒã¹ã«ãªã¯ãšã¹ããè¡ãå¿
èŠããããŸã ã
ãšã³ãã£ãã£
Entityã¯ã©ã¹ã¯ãå®éã®ãªããžã§ã¯ããæ
åœããŸãã å¥çŽæžãæ€
åãäžåç£æ¥è
ããã€ãã¢ã€ãã³ãç«ãå·èµåº«ãªã©ãäœã§ãæ§ããŸããã ããžãã¹ããã»ã¹ãã¢ãã«åããããã«å¿
èŠãªãªããžã§ã¯ãã¯ãã¹ãŠEntityã§ãã
ãšã³ãã£ãã£ã®æŠå¿µã¯ãEvansãšMartinã§ç°ãªããŸãã ãšãŽã¡ã³ã¹ã®èŠ³ç¹ããèŠããšããšã³ãã£ãã£ã¯ããã®åæ§ã匷調ããäœãã«ãã£ãŠç¹åŸŽä»ãããããªããžã§ã¯ãã§ãã
ãšãã»ã³ã¹by Zvansãªããžã§ã¯ãããå±æ§ã®ã»ããã§ã¯ãªããäžæã®åã
ã®ååšã«ãã£ãŠå®çŸ©ãããŠããå Žåããã®ããããã£ã¯ãã¢ãã«ã§ãªããžã§ã¯ããå®çŸ©ãããšãã«ã¡ã€ã³ã®ããããã£ãšããŠèªã¿åãããå¿
èŠããããŸãã ã¯ã©ã¹ã®å®çŸ©ã¯ã·ã³ãã«ã§ããªããžã§ã¯ãã®ã©ã€ããµã€ã¯ã«ã®ç¶ç¶æ§ãšäžææ§ãäžå¿ã«æ§ç¯ããå¿
èŠããããŸãã 圢ç¶ãååšã®å±¥æŽã«é¢ä¿ãªããåãªããžã§ã¯ããåºå¥ããæ¹æ³ãèŠã€ããŸãã å±æ§ã«å¿ããŠãªããžã§ã¯ããæ¯èŒããããšã«é¢é£ããæè¡èŠä»¶ã«ç¹ã«æ³šæããŠãã ããã ãã®ãããªãªããžã§ã¯ãããšã«å¿
ç¶çã«äžæã®çµæãäžããæäœãå®çŸ©ããŸã-ç¹å®ã®ã·ã³ãã«ããã®ããã®äžææ§ãä¿èšŒããå¿
èŠããããããããŸããã ãã®ãããªèå¥æ段ã«ã¯å€éšèµ·æºããããããããªãããããèªèº«ã®äŸ¿å®ã®ããã«ã·ã¹ãã ã«ãã£ãŠçæãããä»»æã®èå¥åã§ãã£ãŠãããã ãã ãããã®ãããªããŒã«ã¯ãã¢ãã«å
ã®ãªããžã§ã¯ããåºå¥ããããã®ã«ãŒã«ã«æºæ ããå¿
èŠããããŸãã ã¢ãã«ã¯ãåäžã®ãªããžã§ã¯ããäœã§ããããæ£ç¢ºã«å®çŸ©ããå¿
èŠããããŸãã
ããŒãã£ã³ã®èŠ³ç¹ããèŠããšã ãšã³ãã£ãã£ã¯ãªããžã§ã¯ãã§ã¯ãªãã¬ã€ã€ãŒã§ãã ãã®ã¬ã€ã€ãŒã¯ããªããžã§ã¯ããšãããå€æŽããããã®ããžãã¹ããžãã¯ã®äž¡æ¹ãçµã¿åãããŸãã
ããŒãã£ã³ããã®èå»ãšã³ãã£ãã£ã®ç§ã®èŠè§£ã§ã¯ããšã³ãã£ãã£ã«ã¯ã¢ããªã±ãŒã·ã§ã³ç¬ç«ããžãã¹ã«ãŒã«ãå«ãŸããŠããŸãã ãããã¯åãªãããŒã¿ãªããžã§ã¯ãã§ã¯ãããŸããã ããŒã¿ãªããžã§ã¯ããžã®åç
§ãä¿æã§ããŸãã ãããããã®ç®çã¯ãå€ãã®ç°ãªãã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšã§ããããžãã¹ã«ãŒã«ã¡ãœãããå®è£
ããããšã§ãã
ã²ãŒããŠã§ã€ã¯ãšã³ãã£ãã£ãè¿ããŸãã å®è£
ïŒè¡ã®äžïŒã¯ãããŒã¿ããŒã¹ããããŒã¿ããã§ããããããã䜿çšããŠããŒã¿æ§é ãæ§ç¯ãããšã³ãã£ãã£ã«æž¡ããŸãã ããã¯ãå
å«ãŸãã¯ç¶æ¿ã®ããããã§å®è¡ã§ããŸãã
äŸïŒ
ãããªãã¯ã¯ã©ã¹MyEntity {ãã©ã€ããŒãMyDataStructureããŒã¿;}
ãŸãã¯
ãããªãã¯ã¯ã©ã¹MyEntityã¯MyDataStructureãæ¡åŒµããŸã{...}
ãããŠãèŠããŠãããŠãç§ãã¡ã¯ãã¹ãŠæ¬è³ªçã«æµ·è³ã§ãã ãããŠç§ãããã§è©±ããŠããã«ãŒã«ã¯æ¬åœã«ã¬ã€ãã©ã€ã³ã«äŒŒãŠããŸã...
ãšãã»ã³ã¹ãšã¯ãæ§é ã®ã¿ãæå³ããŸãã æãåçŽãªåœ¢åŒã§ã¯ã Entityã¯ã©ã¹ã¯æ¬¡ã®ããã«ãªããŸãã
module Entities class MeatBag < LunaPark::Entities::Simple attr_accessor :id, :name, :hegiht, :weight, :birthday end end
ããžãã¹ã¢ãã«ã®æ§é ãèšè¿°ããå¯å€ãªããžã§ã¯ãã«ã¯ãããªããã£ãåãšå€ãå«ããããšãã§ããŸãã
LunaPark::Entites::Simple
ã¯ã©ã¹ã¯ä¿¡ããããªãã»ã©ã·ã³ãã«ã§ããã®ã³ãŒããèŠãããšãã§ããŸãã1ã€ã ã-ç°¡åãªåæåãæäŸããŸãã
LunaPark :: Entites ::ã·ã³ãã« module LunaPark module Entities class Simple def initialize(params) set_attributes params end private def set_attributes(hash) hash.each { |k, v| send(:"
ããªãã¯æžãããšãã§ããŸãïŒ
john_doe = Entity::MeatBag.new( id: 42, name: 'John Doe', height: '180cm', weight: '80kg', birthday: '01-01-1970' )
ããããæ¢ã«ãæ³åã®ãšãããäœéã身é·ãç幎ææ¥ãValue Objectsã§ã©ããããŸãã
module Entities class MeatBag < LunaPark::Entites::Simple attr_accessor :id, :name attr_reader :heiht, :wight, :birthday def height=(height) @height = Values::Height.wrap(height) end def weight=(height) @height = Values::Weight.wrap(weight) end def birthday=(day) @birthday = Date.parse(day) end end end
ãã®ãããªã³ã³ã¹ãã©ã¯ã¿ã§æéãç¡é§ã«ããªãããã«ã LunaPark::Entites::Nested
ããè€éãªå®è£
ã LunaPark::Entites::Nested
ã
module Entities class MeatBag < LunaPark::Entities::Nested attr :id attr :name attr :heiht, Values::Height, :wrap attr :weight, Values::Weight, :wrap attr :birthday, Values::Date, :parse end end
ååã瀺ãããã«ããã®å®è£
ã§ã¯ããªãŒæ§é ãäœæã§ããŸãã
ããã°ã家é»è£œåã«å¯Ÿããç§ã®æ
ç±ãæºè¶³ãããŸãããã åã®èšäºã§ãæŽæ¿¯æ©ã®ããããšå»ºç¯ã®é¡äŒŒæ§ãåŒãåºããŸããã 次ã«ãå·èµåº«ãªã©ã®éèŠãªããžãã¹ãªããžã§ã¯ãã«ã€ããŠèª¬æããŸãã

class Refregerator < LunaPark::Entites::Nested attr :id, attr :brand attr :title namespace :fridge do namespace :door do attr :upper, Shelf, :wrap attr :lower, Shelf, :wrap end attr :upper, Shelf, :wrap attr :lower, Shelf, :wrap end namespace :main do namespace :door do attr :first, Shelf, :wrap attr :second, Shelf, :wrap attr :third, Shelf, :wrap end namespace :boxes do attr :left, Box, :wrap attr :right, Box, :wrap end attr :first, Shelf, :wrap attr :second, Shelf, :wrap attr :third, Shelf, :wrap attr :fourth, Shelf, :wrap end attr :last_open_at, comparable: false end
ãã®ã¢ãããŒãã«ãããå·èµåº«ã®ãã¢ãªã©ã®äžèŠãªãšã³ãã£ãã£ãäœæããå¿
èŠããªããªããŸãã å·èµåº«ããªããã°ãããã¯å·èµåº«ã®äžéšã§ãªããã°ãªããŸããã ãã®ã¢ãããŒãã¯ãä¿éºã®è³Œå
¥ç³è«ãªã©ãæ¯èŒç倧ããªææžãã³ã³ãã€ã«ããã®ã«äŸ¿å©ã§ãã
LunaPark::Entites::Nested
ã¯ã©ã¹ã«ã¯ãããã«2ã€ã®éèŠãªããããã£ããããŸãã
æ¯èŒå¯èœæ§ïŒ
module Entites class User < LunaPark::Entites::Nested attr :email attr :registred_at end end u1 = Entites::User.new(email: 'john.doe@mail.com', registred_at: Time.now) u2 = Entites::User.new(email: 'john.doe@mail.com', registred_at: Time.now) u1 == u2
æå®ããã2人ã®ãŠãŒã¶ãŒã¯åçã§ã¯ãããŸããã ãããã¯ç°ãªãæéã«äœæãããããã registred_at
å±æ§ã®å€ã¯ç°ãªããŸãã ãã ããæ¯èŒå¯Ÿè±¡ã®ãªã¹ãããå±æ§ãåé€ããå ŽåïŒ
module Entites class User < LunaPark::Entites::Nested attr :email attr :registred_at, comparable: false end end
次ã«ã2ã€ã®æ¯èŒå¯èœãªãªããžã§ã¯ããååŸããŸãã
ãã®å®è£
ã«ã¯å£²äžé«ã®ããããã£ããããŸã-ã¯ã©ã¹ã¡ãœããã䜿çšã§ããŸã
Entites::User.wrap(email: 'john.doe@mail.com', registred_at: Time.now)
HashãOpenStructãŸãã¯ä»»æã®gemãEntityãšããŠäœ¿çšã§ããŸããããã«ããããšã³ãã£ãã£ã®æ§é ãå®çŸã§ããŸãã
ãšã³ãã£ãã£ã¯ããžãã¹ãªããžã§ã¯ãã®ã¢ãã«ã§ãããããåçŽã«ããŠãããŸãã äžéšã®ããããã£ãããžãã¹ã§äœ¿çšãããŠããªãå Žåã¯ã説æããªãã§ãã ããã
ãšã³ãã£ãã£ã®å€æŽ
ãæ°ã¥ãã®ãšããã Entityã¯ã©ã¹ã«ã¯ç¬èªã®å€æŽã®ã¡ãœããã¯ãããŸããã ãã¹ãŠã®å€æŽã¯å€éšããè¡ãããŸãã å€ãªããžã§ã¯ããäžå€ã§ãã ãã®äžã«ååšãããã¹ãŠã®æ©èœã¯ãæŠããŠãæ¬è³ªãè£
食ããããæ°ãããªããžã§ã¯ããäœæãããããŸãã æ¬è³ªèªäœã¯å€ãããŸããã Ruby on Railséçºè
ã«ãšã£ãŠããã®ã¢ãããŒãã¯çããã§ãããã åŽããèŠããšãäžè¬ã«OOPèšèªãä»ã®äœãã«äœ¿çšããŠããããã«èŠãããããããŸããã ããããå°ãæ·±ãèŠãŠã¿ããšãããã§ã¯ãããŸããã ãŠã£ã³ããŠã¯èªåçã«éãããšãã§ããŸããïŒ è»ã§ä»äºãããŠãããã«ãäºçŽããŠãããããç«ãæ°ããå å
¥è
ãç²åŸããŸããïŒ ãããã¯ãã¹ãŠå€éšã®åœ±é¿ã§ãã çŸå®ã®äžçã§äœããèµ·ãã£ãŠããŸããç§ãã¡ã¯ãããèªåèªèº«ã«åæ ããŠããŸãã ãªã¯ãšã¹ãããšã«ãã¢ãã«ã«å€æŽãå ããŸãã ãã®ãããããžãã¹ã¿ã¹ã¯ã«ååãªææ°ã®ç¶æ
ã«ç¶æããŸãã ã¢ãã«ã®ç¶æ
ãšããã®ç¶æ
ã®å€åãåŒãèµ·ããããã»ã¹ãåé¢ããå¿
èŠããããŸãã ãããè¡ãæ¹æ³ã«ã€ããŠã¯ã次ã®èšäºã§æ€èšããŸãã