DCI ãèãã #2
追è¨
ã¾ãã§é³©ããã®ã¹ã©ã¤ãã§DCIã«ã¤ãã¦ç解ããã¤ããã«ãªãã®å±éºã ãããããæ¹ãããã§ãããã㦠d.hatena.ne.jp/digitalsoul/20⦠ãèªã¿ã¾ããããDCIã¯ã¨ã³ãã¦ã¼ã¶ã®ã¡ã³ã¿ã«ã¢ãã«ãå®è£ ã«è½ã¨ãè¾¼ãããã®è¨è¨ãã©ãã¤ã ã§ã
— Naoto Takai (@takai) December 27, 2012
ã¨ãããã¨ã§ã以ä¸ã®å 容ã¯ãã¹ã¦ééãã§ããå¯è½æ§ãé«ãã§ãã
å è¨äº
ããã¾ã§ã®ãããã: ActiveStrategy ã¯ã¤ãã¤ããªã¢ããã¼ãã ããã
æèã«ãã£ã¦å¯è½ãªæåãå¤ãããã¢ãã«ã¯åºæ¬çã«ãã¼ã¿ã®ã¿ãæã¤ãã¨ã§ã¯ãªã¼ã³ãªç¶æ
ãä¿ã¨ãã¨ãã£ã¦ããã®ã«ã便å©ãª include
ãæä¾ãã ActiveStrategy ã¯ãã¯ãã¤ãã¤ããªã¢ããã¼ãã§ãæåã®åãåãã容æã«ãªãã®ã¯ãããã¨ã ããã©ãããã£ã¦ä»ã¾ã§ã® include å°çããä½ãé²åãã¦ãªãããï¼ã¨ãã話ããã
ã§ã¯æèã¨ã¯ãã¨ããã Web ã¢ããªã±ã¼ã·ã§ã³ã«ãããæèã¨ã¯ä½ãã¨ãã話ã«ãªã£ã¦ããã®ã ããã©ãããã¯å°ã ããããããã±ã£ã¨æµ®ãã¶ã ãã§ãããã ãããã
- ãªã¯ã¨ã¹ãããã
- Cookie
- Session
- ã¢ãã«ã®ç¶æ
- ã©ã®ã³ã³ããã¼ã©ã«ããã
ãããå°ã£ããã¨ã«ãããã¯ã¢ãã«ãã¯ã©ã¹ãã¾ããã§åå¨ããæèã ãççµåã¨ã¯ãªãã ã£ãã®ãï¼æ¬å½ã«ãã¹ã¦ã(èªåçã«)ã«ãã¼ãããã¨æããªãã¯ã©ã¹ãè¶ ããã¢ã¯ã»ã¹ãå®ç¾ãããã¨ã«ãªãããã©ãããã£ã¦ binding_of_caller ã¿ãããªé»éæ³ã®ä¸ã«æãç«ã¤ãã®ãããªãããªâ¦â¦
ã§ã¯é½åº¦æèãçæããã¢ããã¼ãã«ç«ã¡è¿ã£ã¦ã¿ãã®ã ããã©ãã¾ããã®å ´åã ã¨é å½ã« Mike Pack ã®ããã°ã¿ãããªãã¨ãèãããã¤ã¾ãæèã«ãã©ã¡ã¼ã¿ãä¸ãã¦ãããä¸æããã¨æ¯ãèããã¨ãã話ã ãä¸è¦ããã¯ãã£ãããã¦ãããããããããã¢ããã¼ãã ã¨æããã¤ã³ã¿ã©ã¯ã·ã§ã³ãã¤ã¾ãæåã¯ããããã¾ã¨ãã Role ãæã£ã¦ãããæè(Context)ã¯ä¸ãããæ å ±ããé©åã« Role ã extend ããããç¹å®ã®æåãå¼ã³åºãã£ã¦å¯¸æ³ã ããããè¯ãæããããªãããé½åããåé¢ããã¦ãããã©ã®æåãæ±ããã¯æèããã£ã¦ãããã©ãæ¯ãèãã¹ãã㯠Role ãç¥ã£ã¦ããã
ã¡ãã£ã¨ã¾ã£ã¦ï¼ Mike Pack ããRuby Works ã® dci gem ãã確ãã«åãã¢ããã¼ããã¨ã£ã¦ããã ããã©ãããã£ã¦ããããããããªããï¼ããããè«ããããªããã©ãå°ãªãã¨ãå㯠Context#call
ãªãã¦ã Proc ã§ããªããã®ããå¼ã¶ãã®ã¯ãããã ãããããªã User#authenticate
ãæ³£ãæ³£ãã¢ãã«ã«å
¥ããã»ãããã£ã¨ããããããã大äºãªã®ã¯ç¶ºéºã«åãåãããã¦ãã¦ããã¤ããæãåºããããªãã¨ã ããµã³ãã«ãããã¤ããã®ã¯ãééãã ã¨ããã£ã¦ã¯ãããããã«ã¼ãã«è¿½å ããæè(AddToCartContext)ãã£ã¦ä¸ä½å
¨ä½ä½ãè¦ãæèãªãã ï¼ User#add_to_cart
ãªã確ãã«ã¦ã¼ã¶ã¼ã®ã«ã¼ãã«ä½ãçªã£è¾¼ããã ãããã渡ãã¹ãå¼æ°ãã¡ã½ããåã ãã§å¤§ä½ããããåããæ¸ãã¦ããã®ã¯ Java ãããªãããã(æ¬å½ã«æ®å¿µã ãã©) Eclipse ã¯å¼æ°ã«ä½ã渡ãã¹ããæãã¦ãããªã(Rsense ã使ãã°ãããï¼ã¨ããã¢ããã¤ã¹ã欲ãããããããªã)ããã®ã¡ã½ãããå¿
è¦ãªãã®ã¯ãªãã¹ãç°¡åã«äºæ¸¬ã§ããªãã¨ãããªãã
ã¨ã¾ãããã ãã ã¨æç´ã£ã¦ããããããªããShut the fuck up and write some code. ã«ã®ã£ã¨ã£ã¦ããåãèããæå¼·ã® DCIããä½ãã®ãä¸çªãããã¨ã (ãã¨ããããå²ç¬ã®çã«ãªã£ã¦ã)ã
ã¯ããæ¸ãããDicer(hosted on github) ã ãActiveStrategy åæ§ãã¾ã rubygems ã«ã¯ä¹ã£ã¦ãªãã
ã¾ã ããªãã¦ããªãããã©ãæ¦ãåã®ããããã£ããã¨ã¯å®ç¾ããã¦ããã
ä¾ãã° Context#call
ãªãã¦æ¸ããããªãï¼ã¨ããåã®ããã¾ã¾ã¯
user.with_context(some_context).add_to_cart(item)
ã¨ãªã£ããããã¯ãªããªãããããããæ¹ãããªãããªããã¦ã¼ã¶ã¼ã¯ç¹å®ã®ç¶æ³ä¸ã§ #add_to_cart
ãæã¤ãã¨ããã®ã¯ã·ã³ãã«ã ã Context ã¯ã©ãã§ä½ã£ã¦ãããããä½ã渡ãã¦ãããããã®æèãç¶æ
ãå¤æããã®ã«å¿
è¦ãªåã ã渡ãã¦ãããã°ããã
ã©ã®æåãæ¡ç¨ããã©ã®æåãæ¡ç¨ããªãããã¨ããå¤æã¯æèãè¡ãã interaction :action, :if => guest?
ãªãã Context#guest?
ã false ã®æã«ã¯ action
ã¯å¼ã¹ãªãã£ã¦ãã¨ã«ãªãããããã NoMethodError ã ã
Mike Pack ãã®æ¸ãã Role ã«ç¸å½ãããã®ã¯ Dicer::Interaction ã«ãªã£ããããã¯æåãã¾ã¨ãããã£ã¦æå³ã ãä¾ãã°èªè¨¼ã«å¿
è¦ãªæåãã¾ã¨ãã AuthenticateInteraction
ã¨ãããããããã®ã
dci gem ãã Mike Pack ã®ãµã³ãã«ã¨éãã¨ããã¯ã Context ãæåãå¼ã³åºããé¢ç¥ããªããã¨ã ã¨æããæèã¯ãããããã©ã®ããã«æ¯ãèããããã¯ç¥ã£ã¦ããã¹ãã ããããããä¸ãã¦ããã¦ããã¨æãããã©ããããããã©ã®ããã«æ¯ãèãããã¾ã§ç¥ã£ã¦ãå¿ è¦ã¯ãªãã¨åã¯æãã
ã¨ã¾ããã ãã ãã£ã¦ã¿ã¦ãã¨ã¦ãããä¿®è¡ã ã£ãã¨æããã¨ã«ããåã«ã¨ã£ã¦ã®åçã¯ã²ã¨ã¤åºãããã ãããã£ããå ã¯ä¸äººã§èãã¦ãåãæããªãæ°ããã¦ããã®ã§ã @kakutani ããã @ursm ããããSapporo Ruby Kaigi 㧠DCI ã«è§¦ãã¦ãã人ããåã« DCI ã®åå¨ãæãã¦ããã @lchin ã«è©±ãèããããªãæ°¸åã§ã¯ Interaction ã Activity ã¨ãã¦å®ç¾©ãã¦ãããããã©ããã®ã¸ããã©ããªã£ã¦ãã®ãæ°ã«ãªãã¨ãã ãªãã gem ã«ãªã£ã¦ãªãã®ãæ®å¿µãããã