è€éãã¯éçºè ã®äž»ãªæµã§ãã ãã®ãããªä»®èª¬ããããŸãããæ°ããæ©èœãè¿œå ããéçšã§ãœãããŠã§ã¢è£œåã®æéã®çµéãšãšãã«è€éããå¿ ç¶çã«å¢å€§ãããšããå ¬çã«åž°ããã§ãããã å€æŽãä¿èšŒããããããå€ã«éãããŸã§æé·ããŸãã 100ïŒ ã«è¿ã確çã§ããšã©ãŒãçºçããŸãã ãã®ä»®èª¬ãžã®è¿œå ããããŸãããã®ãããªãããžã§ã¯ããããã«ãµããŒãããç¶ãããšãé ããæ©ãããå¿ èŠãªå€æŽãå ããããšãäžå¯èœãªã»ã©è€éã«ãªããŸãã æŸèæãæªåé«ãã¢ã³ããã¿ãŒã³ãå«ãŸãªããœãªã¥ãŒã·ã§ã³ãèãåºãããšã¯äžå¯èœã§ãã
é£æ床ã®ãœãŒã¹
è€éãã¯å ¥åèŠä»¶ã«ãã£ãŠå¿ ç¶çã«å°å ¥ããããã®ã¿ã€ãã®è€éããåé¿ããããšã¯äžå¯èœã§ãã ããšãã°ããã¹ãŠã®äŒèšããã°ã©ã ã«ã¯ã人ã«æ¯æããè¡ãã¿ã¹ã¯ãããããããã®æ¯æãã®èšç®ã«ã¯ãäŒç€Ÿã§äžå®æé以äžåãã人ã«è¿œå ã®éé¡ãè«æ±ãããšããèŠä»¶ããããŸãã ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã«ã¯å¿ ç¶çã«æ¬¡ã®ãããªãã®ãå«ãŸããŸãã
if(qualifiedForExtraPayment(employee)) { calculateThatExtraPayment(...) }
ããã¯ãããžãã¹èŠä»¶ã«ãã£ãŠã¢ããªã±ãŒã·ã§ã³ã«å°å ¥ãããè€éãã®èŠçŽ ã§ãã
ãã ããèŠä»¶ã«ãã£ãŠå®çŸ©ããããéçºè ã«ãã£ãŠçŽæ¥å°å ¥ãããè€éãããããŸãã ãã®ã人工çãªãè€éãã®ã»ãšãã©ã¯ã DRYååãç解ããŠããéçºè ã®ç¹æ®æ§ã«èµ·å ããŠããŸãã
ããšãã°ãåè¿°ã®ä»®æ³äŒèšããã°ã©ã ã§ã¯ã2ã€ã®ã»ãŒåäžã®ããŒãžãäœæããå¿ èŠããããŸããäž¡æ¹ã§ã人ãžã®æ¯æããèšç®ãããããã®æ¯æãã«é¢ãã詳现æ å ±ã衚瀺ããå¿ èŠããããŸãã ãããã1ããŒãžã¯çŽç²ã«æ å ±æäŸã§ãããäœäººããéãåãåããã確èªããŸãã2ããŒãžç®ã¯ãå®éã®ééãè¡ãããã®3çªç®ã®ã¢ã¯ã·ã§ã³ãååšãããšã°ãŒã¯ãã£ãã§ãã
ãã®äŸã¯ç¢ºãã«æ¶ç©ºã®ãã®ã§ãããä»ã®éçºè ã®ã³ââãŒãã§ãåæ§ã®ããšãå®æçã«èŠãããŸãã
ããã解決ããæ¹æ³ã
æåã®ããŒãžã§ã¯ãæ¬äŒŒã³ãŒãã¯æ¬¡ã®ããã«ãªããŸã
const payment = calculatePayment(employee); displayPayment(payment);
2ããŒãžç®
const payment = calculatePayment(employee); displayPayment(payment); proceedWithPayment(payment);
ããã¯æã ã©ã®ããã«æ±ºå®ãããŸãã
2çªç®ã®ã¡ãœãããäœæãã代ããã«ãè¿œå ã®ãã©ã¡ãŒã¿ãŒãæåã®ã¡ãœããã«å°å ¥ãããŸã
const payment = calculatePayment(employee); displayPayment(payment); if(isOnlyInformation) { return; } proceedWithPayment(payment);
ãããŠãããã«ãã¢ããªã±ãŒã·ã§ã³ã®è€éãã®å¥ã®èŠçŽ ãå¥ã®èŠçŽ ããããŸãã ãã®è€éãã®ãã€ã³ãã¯èŠä»¶ããã§ã¯ãªããéçºè ãåé¡ã解決ããæ¹æ³ããæ¥ãŠããŸãã
ã³ãŒããæ¢ã«ååã«å解ãããŠããå Žåã2ã€ã®è¡ãäžèŽããããã2ã€ã®ã¡ãœããã1ã€ã«ãã¹ã¿ãã¯ãããŠããããšãããããŸãã ããããæåã¯ãã³ãŒããæåã«ãé¡ã«ãæžããã段éã§ããããã®ã¡ãœããïŒcalculatePaymentãšdisplayPaymentïŒã®å®è£ ã¯ãŸã å¥ã ã®ã¡ãœããã«å ¥ããããªããããããŸãããããã®æ¬äœã«çŽæ¥æžã蟌ãŸãã2ã€ã®ã¡ãœãããäžèŽããããã«èŠããŸããæåã®100è¡ã ãã®ãããªå Žåããã®ãã³ãŒãã®éè€ãåãé€ããããšã¯è¯ã解決çã®ããã«æãããããããŸããã ããããããã¯æããã«ããã§ã¯ãããŸããã ãã©ã€ã¢ã³ããã¿ãŒã³ã«é¢ããååã®èšäºã§ãDRYååã䜿çšããããšã§åé¿ã§ããã¢ããªã±ãŒã·ã§ã³ã®è€éããå®çŸããæ¹æ³ã®äŸãæ¢ã«ç€ºããŸããã åãã³ãŒããèšè¿°ããæ¹æ³ã䜿çšããŸããããã®ãã¿ãŒã³ã䜿çšããã«ãèŠä»¶ã«èµ·å ããªãã¢ããªã±ãŒã·ã§ã³ã«è€éããå°å ¥ããŸããã
ãããã£ãŠãããéçºè ã®æã§ã¯ãèŠä»¶ã®è€éãã«æ¯äŸããŠãã¢ããªã±ãŒã·ã§ã³ã®è€éããç·åœ¢ã«å¢å ãããšããçµè«ã«éããŸããå¥ã®éçºè ã®æã§ã¯ãè€éãã¯ææ°é¢æ°çã«å¢å ããŸãã
åç¬è²¬ä»»ã®åå
åçã«åæ£ãããè€éãã¯ããã®å¿ ç¶æ§ãã¹ãŠã«ãšã£ãŠããã»ã©æ害ã§ãå±éºã§ããããŸããããéçºè ã1ãæã«éäžããããšã¯æããã倢ã«ãªããŸãã é¢æ°ã«ifãããå Žåã2çªç®ã®ãã©ã³ããè¿œå ããŸãã2ã€ã®ãã©ã³ãããããããããã¹ããããŠãããã©ããã¯é¢ä¿ãããŸãããã¡ãœããããã¹ããããã®å°ãªããšã4ã€ã®å¯èœãªãªãã·ã§ã³ãããã3çªç®ã®ifã¯8ã«ãªããŸããæ£åžžã«å解ãããåå®è¡ã«4ã€ã®åå²ãããä»ã®é¢æ°ã«åœ±é¿ãäžããããããããæœåšçã«4ã€ã®ãã¹ããåèš8ãèšè¿°ããå¿ èŠããããŸããå解ã§ããªãå Žåããã®ããžãã¯ã¯ãã¹ãŠ1ã€ã®ã¡ãœããã«å«ãŸããŸãã 4 * 4 => 16ãšæžãå¿ èŠãããããã®ãããªåãã¹ãã¯tesãããè€éã«ãªããŸã æåã®8ã®ã ãã¹ãã®æ°ãšè€éãã¯ãã¢ããªã±ãŒã·ã§ã³ã®æçµçãªè€éããåæ ããŠãããåãæ°ã®è€éãã®èŠçŽ ã§ã¯ãåå以äžç°ãªããŸãã
SOLID Principle Bookã®æåã®æ®µèœã§ããSRPãšåŒã°ããåºãç¥ãããã³ãŒãèšèšååã¯ããã®ãããªè€éãã®å±±ãšæŠãããšãç®çãšããŠããŸãã ãŸãããã®ç¥èªã®æ®ãã®æåã«ã¯ãã»ãšãã©ããªããžã§ã¯ãæåããã°ã©ãã³ã°ã«é¢é£ããã«ãŒã«ãå«ãŸããŠããŸãããSRPã¯æ®éçã§ãããããã°ã©ãã³ã°ãã©ãã€ã ã ãã§ãªããã¢ãŒããã¯ãã£ãœãªã¥ãŒã·ã§ã³ïŒä»ã®ãšã³ãžãã¢ãªã³ã°åéã«ãïŒã«é©çšã§ããŸãã æ®å¿µãªããããã®ååã«ã¯æ§ãããªè¡šçŸãå«ãŸããŠãããå¿ ãããæ確ã§ã¯ãããŸããããäœãã«å¯Ÿããå¯äžã®è²¬ä»»ãã©ã®ããã«å€æããããéèŠã§ãã ããšãã°ãããã«ã¯100äžè¡ã®ç¥ã¯ã©ã¹ããããŸãããè¡æãå¶åŸ¡ããå¯äžã®è²¬ä»»ããããŸãã ãããã圌ã¯ä»ã«äœãããŸããããã¹ãŠãé çªã«æå³ããã®ã§ããïŒ æããã«ããã§ã¯ãããŸããã ååã¯å€å°èšãæããããšãã§ããŸã-ã³ãŒãã®ç¹å®ã®èŠçŽ ãããã³ãããé¢æ°ãã¯ã©ã¹ããŸãã¯ã¢ããªã±ãŒã·ã§ã³ã®ã¬ã€ã€ãŒå šäœã®ããããã§ããå¯èœæ§ãããå Žåã責任ã倧ããããå Žåã¯ãå解ããæçã«åå²ããå¿ èŠããããŸãã ãããŠããããå€ããããšããäºå®ã¯ããã®ãããªå åã«ãã£ãŠå€æããããšãã§ããŸã-ãã®ãã¹ããè€éãããããå€ãã®ã¹ããããå«ãŸããŠããå ŽåããŸãã¯å€ãã®ãã¹ããå¿ èŠãªå Žåã責任ã倧ããããŠããããå解ããå¿ èŠããããŸãã ããã¯ãã³ãŒããèŠãªããŠãå€æã§ããå ŽåããããŸãã ãããã ã³ãŒãèã1ã€ã®ã¯ã©ã¹ã®ãã¡ã€ã«ãéããŠããã«800è¡ã®ã³ãŒãã衚瀺ãããŠããå Žåããã®ã³ãŒããèªãã§ãã®ã¯ã©ã¹ã«å€ãã®è²¬ä»»ãããããšã確èªããå¿ èŠãããããŸããã ãã¡ã€ã«ã«äŸåé¢ä¿ïŒã€ã³ããŒããyuzingãªã©ïŒã®ããŒãžå šäœãå«ãŸããŠããå Žåãåãçµè«ã«éããããã«äžã«ã¹ã¯ããŒã«ããŠãã®ã³ãŒããèªã¿å§ããå¿ èŠã¯ãããŸããã ãã¡ãããããŸããŸãªããªãã¯ããããŸããIDEã¯åžæ°ã«ã³ãŒããŒãdulããããã©ã¹èšå·ãã®äžã§ã€ã³ããŒãã厩å£ãããŸããã¯ã€ãã¹ã¯ãªãŒã³ã¢ãã¿ãŒãçŽç«ãããã³ãŒããŒèªèº«ã®ããªãã¯ããããŸãã ç§ã¯ç¹°ãè¿ããŸãããç§ã¯ãã®ãããªéçºè ã®ã³ââãŒããèªãå¿ èŠãããªããç§ã¯ããããããã奜ãã§ã¯ãªãããšãç解ããŠããŸãã
ããããå解ã¯çµ¶å¯Ÿçãªããã®ã¹ãã£ãã¯ã®ããäžæ¹ã®ç«¯ãã«å°éããããã«å¿ èŠã§ã¯ãããŸãã-1ã€ã®ãªãã©ã³ããæã€100äžã®ã¡ãœããã¯ã100äžã®ãªãã©ã³ããæã€1ã€ã®ã¡ãœãããããè¯ããªããããããŸããã ç¹°ãè¿ããŸãããé床ã«å解ãããšãããã2ã€ã®éã³å¿ã®ãããããã°ã©ãã³ã°ã§æãé£ããã¿ã¹ã¯ãã®æåã®1ã€ãå¿ ãçºçããŸããé¢æ°ã®åœåãšãã£ãã·ã¥ã®ç¡å¹åã§ãã ããããããã«å°éããåã«ãå¹³åçãªéçºè ã¯æåã«å°ãªããšã800è¡ã®ã¯ã©ã¹ã§ãå°ãªããšãæå°éã«å解ããæ¹æ³ãåŠã°ãªããã°ãªããŸããã
ãšããã§ãå¥ã®ãã®ãããªéã³å¿ã®ããå²åŠçæèããããŸã-æŠå¿µãšããŠã®ã¯ã©ã¹ã¯ãããŸãã«ãå€ãã®è²¬ä»»ãæ ããŸã-è¡åãšæ¡ä»¶ã ãµããŸãã®ããã®æ©èœãšç¶æ ã®ããã®ããã¬ãŒã³ããªããžã§ã¯ãïŒPOJOãPOCOãªã©ããŸãã¯Cã®æ§é äœïŒã®2ã€ã®ãšã³ãã£ãã£ã«åå²ã§ããŸãã ãããã£ãŠãOOPãã©ãã€ã ã¯åãå ¥ããããŸããã ãããšäžç·ã«æ®ããã
è€éããšã®éããšããŠã®å»ºç¯
ç§ãèšã£ãããã«ãè€éããšè€éãã®ä¹ç®ã¯ããã°ã©ãã³ã°ã«åºæã®ãã®ã§ã¯ãªãã人çã®ããããåŽé¢ã«ååšããŸãã ãããŠããã®åé¡ã®è§£æ±ºçãã·ãŒã¶ãŒã«ãã£ãŠææ¡ãããŸãã-åå²ãšåŸæã çžäºã«é¢é£ãã2ã€ã®åé¡ã¯ããããã®åé¡ãå¥ã ã«æ¬¡ã ã«åãããšãããå°é£ã§ãããããŒã人ãšæŠãããã«å£çµãã2ã€ã®étriãªéšæãåãããšã¯ããå°é£ã§ãã ããããäºãã«äœããã®åœ¢ã§åé¢ãããŠããå Žåã1ã€ã®éšæã¯åå¥ã«æåããå¥ã®éšæã¯ã¯ããã«ç°¡åã«ãªããŸãã äœã¬ãã«ã§ã¯ãæ¢ã«ç¹å®ã®ã³ãŒããèšè¿°ãããšããããã¯å解ãšSRPã§ãã é«ã¬ãã«ã§ãã¢ããªã±ãŒã·ã§ã³èšèšã¬ãã«ã§ã¯ãã¢ãŒããã¯ãã£ãœãªã¥ãŒã·ã§ã³ãããã«åœ¹ç«ã¡ãŸãã
ããããã¯ãUI /ããã³ããšã³ãã®è©³çŽ°ã«çŠç¹ãåœãŠãŸãã
UIãå«ãã¢ããªã±ãŒã·ã§ã³ã®éçºã«ã¯ãMVCãMVPãMVVMãªã©ã®ã¢ãŒããã¯ãã£ãœãªã¥ãŒã·ã§ã³ãé·ãé䜿çšãããŠããŸããã ããããã¹ãŠã®ãœãªã¥ãŒã·ã§ã³ã«ã¯2ã€ã®å ±éã®æ©èœããããŸããæåã®æ©èœã¯Mããã¢ãã«ãã§ãã 圌ãã¯åœŒå¥³ã«ããçš®ã®å®çŸ©ããäžããŸããç§ã¯ããã§ãã®ãããªåçŽåã§ç®¡çããŸã-ããã°ã©ã ã®æ®ãã 2çªç®ã¯Vãããã¥ãŒããŸãã¯ãã¥ãŒã§ãã ããã¯ã¢ããªã±ãŒã·ã§ã³ã®ä»ã®éšåããåé¢ãããã¬ã€ã€ãŒã§ããããã®å¯äžã®è²¬ä»»ã¯ã¢ãã«ããã®ããŒã¿ã®èŠèŠçè¡šçŸã§ãã ãããã®ã¢ãŒããã¯ãã£ã¯ãMãšVãçžäºã«éä¿¡ããæ¹æ³ãç°ãªããŸãã ãã¡ãããç§ã¯ããããèæ ®ããŸããããããã®ã¢ãŒããã¯ãã£ã®éçºã«è²»ãããããã¹ãŠã®åªåããããåé¡ãå¥ã®åé¡ããåé¢ããããšã«åããããŠããããšããããŠããªããæšæž¬ããããã«ãã¢ããªã±ãŒã·ã§ã³ã®è€éããæžããããšã«åã³æ³šæãæãã ãã§ãã
ãããŠãèŠèŠçè¡šçŸããã®å±€ã®å¯äžã®è²¬ä»»ã§ãããšèšã£ãŠãç§ã¯ãããã®ã¢ãŒããã¯ãã£ã®åºæ¬ååãæå³ããã ãã§ã-ãã¬ãŒã³ããŒã·ã§ã³å±€ã«ããžãã¯ããã£ãŠã¯ãªããŸããã 絶察ã«ã ãã®ããã«ããããã®ã¢ãŒããã¯ãã£ãèæ¡ãããŠããŸãã ãããŠãMVCã®ã¢ãŒããã¯ãã£ã«ã€ããŠè©±ããšããã·ã³ã³ã³ãããŒã©ãŒããšããçšèªããŸã ãããŸããã ãã®ã¢ãŒããã¯ãã£ã䜿çšãããšãããžãã¯ã³ã³ãããŒã©ãŒãå«ããã¹ãã§ã¯ãªããšããçµè«ã«éããŸããã 絶察ã«ã ããžãã¯ã®å Žåãããã¯ãã®å±€ã®2çªç®ã®è²¬ä»»ã§ããã1ã€ã§ããããšãä¿èšŒããããåªåããå¿ èŠããããŸãã
åæ¹åããŒã¿ãããŒã¢ãŒããã¯ãã£
ããæ°
ãã®ã¢ãŒããã¯ãã£ã®ç®çã¯ãåè¿°ã®ã¢ãŒããã¯ãã£ã®ç®æšãšãŸã£ããåãã§ããã¢ããªã±ãŒã·ã§ã³ã®è€éãã軜æžããåé¡ãäºãã«åé¢ãããããã®éã«è«ççãªéå£ãæ§ç¯ããããšã§ãã ãã®ã¢ãŒããã¯ãã£ã®å©ç¹ã¯ã以äžã®ä»ã®ã¢ãŒããã¯ãã£ãããåªå ãããçç±ã§ãã ã¢ããªã±ãŒã·ã§ã³ã¯ã1ã€ã®ããã¥ãŒããš1ã€ã®ãã¢ãã«ãã«éå®ããããã®ã§ã¯ãããŸãããã©ã®ã¢ããªã±ãŒã·ã§ã³ã§ãããããã®ããã€ãããããŸãã ãããŠããããã®éã«äœããã®æ¥ç¶ããªããã°ãªããŸããã äŸãšããŠä»¥äžãåãäžããŸã-è¡šã«åŸã£ãŠéé¡ãèšç®ããå¿ èŠããããŸãã ãããã¥ãŒã§ã¯ã人ãããŒãã«ã«ããŒã¿ãå ¥åããå¥ã®ã¢ãã«ããã®ããŒã¿ããµãã¹ã¯ã©ã€ãããéãèšç®ããæŽæ°ããå¿ èŠãããããšããã¥ãŒã«äŒããŸãã ããã«ããã®éã«å¯ŸããŠ3çªç®ã®ã¢ãã«ã眲åããããšããäºå®ã«ãã£ãŠäŸãæ¡åŒµããŸãããã®å Žåããé©çšããã¿ã³ãã¢ã¯ãã£ãã«ããå¿ èŠããããŸãã ããã«ãéçºè ã¯ãããæåŸã®ã¢ã¯ã·ã§ã³ã§ãããšèª€è§£ãããå ŽåããããŸã-æåºã®è²¬ä»»ã§ãããããŒã¯ã¢ããã§æ¬¡ã®ãããªãã®ã確èªã§ããŸãïŒ
<div *ngIf="otherModel.sumOfItems === 100">
ã
ããã¯ãã§ã«ééãã§ãã2ã€ã®æ°å€ãæ¯èŒããããšã¯ãã¢ãã«ãå³å¯ã«å¶åŸ¡ããããžãã¯ã§ãããããŒã¯ã¢ããã¯å³å¯ã«èšç®ããããã©ã°ã§åäœããã¯ãã§ã-
<div *ngIf="myModel.canProceed">
ç¹ã«é«åºŠãªã±ãŒã¹ã§ã¯ã2ã€ã®ã¢ãã«éã®ãã®é¢ä¿ãèšè¿°ãããå€éšã¢ãã«ããã®ããŒã¿ããã§ãã¯ããããã®ã¢ãã«ã«å¯äœçšãããããã¡ãœãããåŒã³åºãããŸãã ãããã«ãããã¢ãã«éã«ã¯äžçš®ã®å€åäŒæã°ã©ãã衚瀺ãããŸãã
é ããæ©ããããã®ã°ã©ãã¯å¶åŸ¡äžèœã«ãªããå€æŽãå ãããšãã°ã©ãã®äžã§çºçããå¯äœçšã§ãããã©ã®ãããªçµæã«ãªãããéçºè ã远跡ããããšã¯å®¹æã§ã¯ãããŸããã Facebookããã®ãã¬ãŒã³ããŒã·ã§ã³ã§ã¯ãããŠã³ã¹ããªãŒã å¹æãšåŒã°ããŠããŸããããããã¯çšèªã§ã¯ãããŸããã ãŸããã°ã©ãã®äžã§çºçãããšã©ãŒãä¿®æ£ããããšããå¥ã®éçºè ã¯ããã®åé¡ã®æ ¹æ¬åå ã远跡ããã®ãå°é£ã«ãªããŸãã äžéšã®å Žæã§ã¯ããã®ã°ã©ãã¯åšæçã«é²ãããšãããããã®åšæãçµäºããæ¡ä»¶ã¯ãã°ã©ãå ã®ãŸã£ããç°ãªããã€ã³ãã§ã®ç¡å®³ãªå€æŽã«ãã£ãŠç Žãããå¯èœæ§ããããŸãããã®çµæãã¢ããªã±ãŒã·ã§ã³ããã³ã°ããçç±ãç解ã§ããŸããã å€æŽäŒæã°ã©ãã¯ã顧客ã®èŠä»¶ã«åºã¥ããŠããªãããšã¯ç°¡åã«ããããŸãã ãããã¯å®è¡ããå¿ èŠã®ããã·ãŒã±ã³ã·ã£ã«ã¢ã¯ã·ã§ã³ã®ã¿ãæ瀺ããŸããããããã®ã¢ã¯ã·ã§ã³ã¯{å¿ èŠãªè¡šçŸã眮æ}ãšããŠã³ãŒãäžã«æ£åšãããããã®éã«ãµãã¹ã¯ãªãã·ã§ã³ãã€ãã³ãã¹ããŒãªã©ãæ¿å ¥ãããŸãã éçºè ã®è¯å¿ã«æ¢ã«ãããŸãã
ããã«ã€ããŠã¯ã Reduxã®åæ©ä»ãã§ããå°ãèªãããšãã§ããŸãã
UDFã¢ãŒããã¯ãã£ã¯ã2ã€ã®åºæ¬çãªå¶éã課ãããããã€ãã©ã€ã³ã§ãã1ïŒãã€ãã©ã€ã³ã®æ¬¡ã®ã¹ããŒãžã¯ãåã®ã¹ããŒãžãŸãã¯ãã®å®è¡çµæã«åœ±é¿ãäžããæš©å©ãæã¡ãŸããã 2ïŒã³ã³ãã€ãŒã®ãã«ãŒãã³ã°ãã¯ããŠãŒã¶ãŒããã®å ¥åã®ã¿ãçæã§ããŸãã ãããã£ãŠãã¢ãŒããã¯ãã£ã®åå-ã¢ããªã±ãŒã·ã§ã³ã¯ããŠãŒã¶ãŒã«åãã£ãŠäžæ¹åã«ã®ã¿ããŒã¿ãç¬ç«ããŠç§»åããå€éšã®åœ±é¿ã®ã¿ããã®ã¡ã€ã³ã¹ããªãŒã ã®å察æ¹åã«ç§»åã§ããŸãã
ãã€ãã©ã€ã³ã«ã¯2ã€ã®äž»èŠãªã¹ããŒãžããããæåã®ã¹ããŒãžã¯ç¶æ ãæ åœãã2çªç®ã®ã¹ããŒãžã¯è¡šç€ºãæ åœããŸãã ããã€ãã®ç¹ã§ãäžèšã®ã¢ãŒããã¯ãã£ã®ã¢ãã«ãšè¡šçŸã®ããã«èŠããŸããããããã®ã¢ãŒããã¯ãã£éã®éãã¯ãã¢ãã«ãšè¡šçŸã®çžäºäœçšã«ãããŸãã ãããŠãããã«å ããŠãã¢ãã«å士ã®çžäºäœçšã«ãããŠã ã¢ããªã±ãŒã·ã§ã³ã®å šäœã®ç¶æ ã¯ç¹å®ã®ã¹ãã¢ã«éäžããŠãããç¹å®ã®å€éšã€ãã³ãïŒãŠãŒã¶ãŒå ¥åãªã©ïŒãçºçãããšããã€ã³ãAïŒå€éšåºæ¿ïŒãããã€ã³ãBïŒåºæ¿åŸïŒãžã®ãã¹ãŠã®ç¶æ å€åã1ã€ã®ã¢ã¯ã·ã§ã³ã§çºçããå¿ èŠããããŸãã ã€ãŸããäžèšãšåãã¹ã¯ãªããã§ã¯ãã³ãŒãã¯reduxã®reduxã®äŸã䜿çšããŠæ¬¡ã®ããã«ãªããŸãã
function userInputHappened(prev, input) { const table = updateRow(prev.table, input); const total = calculateTotal(prev.total, table); const canProceed = determineCanProceed(prev.canProceed, total); return { ...prev, table, total, canProceed }; }
ããã¯ãè«çã®éåžžã®æ§ç¯ãšã®äž»ãªéãã§ããéèŠãªååã瀺ããŠããŸãã çžäºã®ãµãã¹ã¯ãªãã·ã§ã³ã¯ãªãã2ã€ã®é£ç¶ããæäœã®éã«ã€ãã³ããã¹ããŒãããŸããã ç¹å®ã®å€éšåºæ¿ã«å¯ŸããŠå®è¡ããå¿ èŠããããã¹ãŠã®ã¢ã¯ã·ã§ã³ã¯ãé çªã«èšè¿°ããå¿ èŠããããŸãã ãããŠããã®ãããªã³ãŒãã«å€æŽãå ãããšãå€æŽã®çµæããã¹ãŠèŠããŸãã ãããŠãçµæãšããŠããã®äººçºçã«å°å ¥ãããè€éãã¯æå°éã«æããããŸãã
Redux
åœåãUDFããã³ããšã³ãã¢ãŒããã¯ãã£ã¯ã2ã€ã®åå¿ããã³ãã©ãã¯ã¹ã©ã€ãã©ãªã®ãã³ãã«ã®äžéšãšããŠFacebookã«ãã£ãŠææ¡ãããŸããããå°ãåŸã«ãã©ãã¯ã¹ãreduxã«çœ®ãæããããããã€ãã®éåžžã«éèŠãªå€æŽãæäŸãããŸããã ãŸããç¶æ å¶åŸ¡ã¯ã¯ãªãŒã³ãªã³ãŒãã§èšè¿°ãããããã«ãªããŸãããå®éããã¹ãŠã®ç¶æ 管çã¯1ã€ã®ç°¡åãªåŒã§èšè¿°ã§ããŸãã
次ã®ç¶æ ã¯ãåã®ç¶æ ãšäœããã®åºæ¿ã®çŽç²ãªé¢æ°ã«çãããªããŸãã
第äº-ãã¬ãŒã³ããŒã·ã§ã³å±€ã¯ä»ãå¥ã®ã¯ãªãŒã³ãªæ©èœ
ã€ãŸãããã¹ãŠã®UIã³ã³ããŒãã³ãã®ã¿ã¹ã¯ã¯ãå ¥åã§ãªããžã§ã¯ããååŸããçµæãšããŠããŒã¯ã¢ãããæäŸããããšã§ãã
ãããã£ãŠã次ã®ããšãéæãããŸãã
1.ãuncleanããéåæã³ãŒããã¢ããªã±ãŒã·ã§ã³ãããã®ç«¯ã«ç§»åããŸãã2ã€ã¯å€§ãããã¢ããªã±ãŒã·ã§ã³ã®å®çŸ©ãããã¯ãã¯ãªãŒã³ã«ãªã£ããšããèšããŸãã
2.éåžžã«ã¯ãŒã«ãªæ¥œåšã 1ã€ç®ã¯ããããªããŒãã§ããããã«ãããç¶æ ã倱ãããšãªãããªã³ã¶ãã©ã€ã§çŽç²ãªã¬ã³ããªã³ã°æ©èœã眮ãæããããšãã§ããŸããã€ãŸããUIã¬ã€ã€ãŒããããããç·šéããããã«çµæã確èªã§ããŸãã æ¯åã¢ããªã±ãŒã·ã§ã³ãåèµ·åããã«ããã°ã®åçãã€ã³ããŸã§ãã¯ãªãã¯ãããå¿ èŠããããŸããã 2çªç®ã®ããŒã«ã§ããã¿ã€ã ãã©ãã«ã§ã¯ãç¶æ ïŒ1ïŒããç¶æ ïŒnïŒãŸã§ã®ãã¹ãŠã®ç¶æ ãèšæ¶ãããããã«æ²¿ã£ãŠååŸã«ç§»åããäœãééã£ãŠããããé çªã«ç¢ºèªã§ããŸãã ããã«ã1ã€ã®PCã§ãã°ãåçŸããã¿ã€ã ã©ã€ã³ããšã¯ã¹ããŒãããå¥ã®PCã«ããŠã³ããŒããããã€ãŸãããã®ãã°ãåçããæé ã説æããªããŠãããã¹ã¿ãŒããéçºè ã«ãã°ã転éã§ããŸãã ãã ãããã®2çªç®ã®ããŒã«ã«ã¯ãã1ã€ã®èŠä»¶ããããŸããã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ãšã¢ã¯ã·ã§ã³ã¯ã·ãªã¢ã«åå¯èœã§ãªããã°ãªããŸããã ã€ãŸã MapãDateTimeãªã©ã®åºæ¬ã¯ã©ã¹ã䜿çšã§ããŸããã POJOã®ã¿ã ããã«ãã¬ãã¥ãŒãµãŒã§ã¯ããªããžã§ã¯ãã®åç §ã®ç䟡æ§ã«äŸåããããšã¯ã§ããŸãã; idãªã©ã®å€ã§æ¯èŒããå¿ èŠããããŸãã
3.åå©çš-èªåããŸã-äœããã®çš®é¡ã®UIã³ã³ããŒãã³ããã¢ãã«ã«å¿ã³èŸŒã¿ãããèªäœã®ããŒã¿ãåãåãããããåŠçããŠè¡šç€ºããå Žåã«ééããŸãããïŒ
åãUIã䜿çšããããã«ãæ°ããããŒã¿ãœãŒã¹ãŸãã¯ç°ãªãã·ããªãªã§ç°ãªãã¢ã¯ã·ã§ã³ã»ããã䜿çšããæ°ããã¿ã¹ã¯ãçºçããããšã¯ãããŸããïŒ å¥ã®ã·ããªãªã§åãããŒã¯ã¢ãããåå©çšããããšã¯ãåã«éçŸå®çã§ãã
ãªããžã§ã¯ããååŸããçµæãšããŠããŒã¯ã¢ãããçæããUIã®äžéšãåå©çšããããšã¯ããŸã£ããå¥ã®ããšã§ãã é©åãªå Žæã«å¥ã®ããŒã¿æ§é ãããå Žåã§ããããããã®ã³ã³ããŒãã³ããåãå ¥ãããã®ã«å€æããèªåèªèº«ã«æ¿å ¥ããŠããã®ãªããžã§ã¯ããäžããŸãã çµæãšããŠãããªãã¯ãããããªããå¿ èŠãšãããã®ãã¬ã³ããªã³ã°ããããšãå®å šã«ç¢ºä¿¡ããŠãããå¯äœçšãå šã被ãããšã¯ãããŸããã
ç¶æ 管çãšåãããšã ããŒãã«ã®è¡ãæŽæ°ããé¢æ°ããããŸãã 圌女ãèªåã®äžã§äœãä»ã®ããšãããããäœããã®æ¹æ³ã§ããŒãã«ãæ£èŠåãããããœãŒãããããããšããŸãã å¥ã®ã¹ã¯ãªããããçŽç²ãªé¢æ°ãåŒã³åºã䟡å€ã¯äœã§ããïŒ ãŸããå¯äœçšãçºçããªããšç¢ºä¿¡ããŠããŸãã
ã¹ã¯ãªããå šäœãåå©çšããããšã¯äžå¯èœã«ãªããŸãã ãã¬ãŒã³ããŒã·ã§ã³ç¶æ ã®å®å šãªåé¢ããããšããäºå®ã®ããã ãŸãããã®ãããªåå©çšã®ãšã³ããªãã€ã³ãã¯è€è£œããå¿ èŠããããŸããããã®ãããªãšã³ããªãã€ã³ãã®ã¡ã€ã³ã®ãèãã¯åå©çšã§ãããããåå©çšããå¿ èŠããããŸãã
æ®å¿µãªãããè¯ããã®ã¯ãªããçè·¡ããªããReduxã«ã¯1ã€ã®éèŠãªå¶éããããŸããã æ¢ã«è¿°ã¹ãããã«ããã«ãŒããã¯ãŠãŒã¶ãŒã®ã¿ãéå§ã§ãããã®ãããªå¶éã¯FLUXã«å®è£ ãããŸãããç¶æ ã®å€åã«ãµãã¹ã¯ã©ã€ãããããã«ããã»ããµã§æ°ããã¢ã¯ã·ã§ã³ãã¹ããŒããããšã¯ã§ããŸãããäŸå€ãã¹ããŒããŸãã ã€ãŸãããã®ãµãã¹ã¯ãªãã·ã§ã³ã®ããã»ããµå ã®ããŒãã£ã«ãµãã¹ã¯ã©ã€ããããUIã³ã³ããŒãã³ãã«ã¯ãç¶æ ãããã«å€æŽããæš©å©ããããŸããã ã¬ã³ããªã³ã°ã®ã¿ãããŒãã³ã¢ã®ã¿ã reduxã§ãã®äŸå€ãæžãããŸããã
Reduxããã³UDFã®èª€ã£ã䜿çšäŸ
ç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã®1ã€ã§ãåžžèãŸã§ã®å€ãã®äºæã®éåãçºèŠãããŸããã
1ïŒããžãã¯ã¯UIã³ã³ããŒãã³ãã«çŽæ¥é 眮ãããUIã³ã³ããŒãã³ãã¯ã©ã®ããŒã¿ãããŒãããããèªã決å®ããŸã
2ïŒUIã³ã³ããŒãã³ãã¯äºãã«ïŒç æ°ïŒïŒããã€ãã®ä»ã®ã¯ã©ã¹ããç¶æ¿ãããŸãã
3ïŒUIã³ã³ããŒãã³ãã¯*ã¢ããã¿ãŒãšåŒã°ããŸãïŒæ¬¡ã¯äœã§ããã*ã€ã³ãžã§ã¯ã¿ãŒã*å·¥å ŽïŒïŒ
4ïŒUIã³ã³ããŒãã³ãã¯ãããã®ãããŒã¿ãšä»ã®ã³ã³ããŒãã³ãã®ããŒã¿ãç¶æ ããªãŒã®ã©ãã«ãããããç¥ã£ãŠããŸãã
5ïŒUIã³ã³ããŒãã³ãã¯ç¬ç«ããŠç¶æ ã®äžéšã«ãµãã¹ã¯ã©ã€ãããåŠçã®çµæãšããŠæ°ããã¢ã¯ã·ã§ã³ãã¹ããŒããŠããç¬èªã®ãç¶æ ãæããã«ãããã®ã«ãŒããååšããªãã«ãŒãã¢ãŒããã¯ãã£ãå€æŽããŸãã
ãã®èšèšã®åæ©ã¯ãåäžã®åå©çšãã€ã³ããäœããããšããé¡æã§ããã ããã«ããã®ç¹ã¯ãã¡ãããUIã¬ã€ã€ãŒã®ããŒã¯ã¢ããã«ãããŸãããã®ããã«èãããŸã-UIã³ã³ããŒãã³ããæ¿å ¥ãããšãèªåçã«ããã¯ã¢ãããããŸãïŒã¯ãããããã¯ãé£æ¥ãããã¥ãŒãããåžžã«èãããåèªã§ããããã¯ã¢ãããæ³šå ¥ããµã€ã³ã転éãã³ãŒãã®åãã¯ãã§ã«ãªã¢ãŒãã§æããããŸãïŒããã®ç¶æ ãã³ã³ããŒãã³ãã¯ç¶æ ã«ãµãã¹ã¯ã©ã€ãããŸã圌ã®ããã®å ¥åãçæããé£æ¥ã³ã³ããŒãã³ãã圌ãäŸåããããŒã¿ã圌ã¯åæããã³é 延èªã¿èŸŒã¿ã®äž¡æ¹ã®ããã«ããã¯ãšã³ãããããŒã¿ãåãåããŸãããŸãã3ã€ã®ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšããããã®ã³ã³ããŒãã³ãã§apiã¡ãœãããçªç¶å€æŽãããå ŽåããŸãã¯ãã®ã³ã³ããŒãã³ãã«æ°ããããžãã¯ãè¿œå ããå¿ èŠãããå Žåã¯ãã³ã³ããŒãã³ãã«è¿œå ããŸãã
3ã€ã®å Žæã®1ã€ã«ç°ãªãããŒã¿ãœãŒã¹ãããå ŽåããŸãã¯ãã®ã³ã³ããŒãã³ãã®éäžã«å¥ã®åŠçããžãã¯ãããå Žåãã©ãããã°ããã§ãã-ãã®ã¢ãŒããã¯ãã£ãœãªã¥ãŒã·ã§ã³ã¯ãããææ¡ããŸããã圌ããèšãããã«-ãŸããäœããããŠãã ãããtyzhprogrammerãæããã«ãå éšã«å ¥ããæ°ããããžãã¯ãäœæããifãä»ããå¿ èŠããããŸããããã«ããã3çªç®ã®ã·ããªãªã§ã¯ãªã³ã«ãªããæåã®2ã€ã®ã·ããªãªã§ã¯ãªãã«ãªããŸãã
ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã®å€æŽã®ååžã®ã°ã©ãã¯æ¬¡ã®ããã«ãªããŸãã
人ã ã¯ã¢ããªã±ãŒã·ã§ã³ã§reduxã䜿çšããç¹ã«ãã€ãã¹ã®åŽé¢ãç¹ã«ããã€ãºã®å€ããæ§æãååŸããŸããã ã
ããªãã¯ãã°ã©ãã®å€æŽã®äŒæãæç»ããããšãããšã圌ããšããŠäœ¿çšãããåæ°ããšéåžžã«ãã䌌ãŠããããšã確èªããããšã¯å®¹æã§ããantiprimer Facebookã®ãã¬ãŒã³ããŒã·ã§ã³ã«ã
åèšïŒ
1ïŒUDFã¢ãŒããã¯ãã£ã«éåããŠãããreduxã¯ãããå®è£ ããããšã«ãªã£ãŠããŸããã掟æãªpub-subãšããŠã§ã¯ãããŸããã
2ïŒããŒã¯ã¢ãããšç¶æ ã®ããŒãã«ãããªã³ã°
3ïŒSRPã®ååã«éåããŠããŸã-ãã¬ãŒã³ããŒã·ã§ã³ã¬ã€ã€ãŒã®ããžãã¯
4ïŒåžžèã«éåããŠããŸã-ãã¬ãŒã³ããŒã·ã§ã³ã¬ã€ã€ãŒã®ã³ã³ããŒãã³ãã®åå/ç®çã
ãªã¢ã¯ãã£ãããã°ã©ãã³ã°ãšã®æ¯èŒ
UIã¢ããªã±ãŒã·ã§ã³ã®äœæã«é©ããå¥ã®æŠå¿µããããããããéåžžã®ããŠããŒãããåªããŠããŸããã圌女ã«ãšã£ãŠããŸã圌女ã®ãã¬ãŒã ã¯ãŒã¯ãå®è£ ããããã«ãå€ãã®ã¢ãžããŒã¿ãŒãããŸãã
ãšã³ãã£ãã£ãå€æŽãããšãã«ãäŸåãšã³ãã£ãã£ãåŠçããå¿ èŠããªãã¢ãã«éã®çžäºäœçšãå«ãŸããŸããäŸåãšã³ãã£ãã£èªäœã¯ãå€æŽãããããšãæ€åºããããèªäœãåéèšããŸãã
knockoutJSãã¬ãŒã ã¯ãŒã¯ã®äŸã䜿çšããŠãæ¬äŒŒã³ãŒããèšè¿°ããŸãã
tableVmããããããŒãã«ãã£ãŒã«ããšããã®ããŒãã«ãæŽæ°ã§ããé¢æ°ããããŸã
tableVm.table = ko.observable(someInitialData); tableVm.updateTable = function(input) { const current = tableVm.table(); const updated = ... // some code here tableVm.table(updated); }
ããã«ãå¥ã®ïŒå Žåã«ãã£ãŠã¯åãïŒãã¥ãŒã¢ãã«ã«ã³ãŒãããããŸãã
tableTotalVm.total = ko.computed(() => tableVm.table().map(...).sum());
3çªç®ã®VMã§ã¯ã次ã®ã³ãŒã
submitVm.canProceed = ko.computed(() => tableTotalVm.total() === 100);
ãã¹ã¯ãšã¢ããŒããã¯ããšåŒã°ãããã®ãUDFãæå³çã«æ®ãããã®ã«å°éããããšã¯ç°¡åã«ããããŸãã1ã€ã®ã³ãŒããå¥ã®ã³ãŒãã«çœ²åããã2çªç®ã®ã³ãŒãã3çªç®ã«çœ²åãããŸããé ããæ©ãããå€åã®ååžã®å€§ããå¶åŸ¡ãããªãã°ã©ãã«ãªããŸãã
ããã«ãå€æŽã®éååžãäºæ³ãããŸãã
ããã§ã¯ãããäœãã¬ãã«ã§ãŒãããå§ãŸãã€ã³ããã¯ã¹ãä¿åãããUIã§1ããã€ã³ããã¯ã¹ã«ãããããå¿ èŠããããã€ãŸããUIã§äœããå€æŽããããšãã«ããããçåŽã«å€æããå¿ èŠããããããããäžäœã¬ãã«ã«å€æããå¿ èŠããããããç°¡åãªäŸã瀺ããŸãæ»ãã
lowerVm.index = ko.observable(indexLoadedFromApi); upperVm.index = ko.computed( () => lowerVm.index() + 1), (newVal) => lowerVm.index(newVal - 1) );
ãããŠããã®ãããªã·ã¹ãã ã§UIãäžéå€ãå€æŽãããšãcomputeã¯ãã®å€æŽãäžäœã¢ãã«ã«ããã·ã¥ããŸãã ãªããªãäžäœã¢ãã«ãå€æŽãããå Žåã¯ãäžäœã¢ãã«ãå床ã«ãŠã³ãããããã«å¿ããŠUIãæŽæ°ããå¿ èŠããããŸãããŸã ãã®ãããªç¶æ³ãååšããå¯èœæ§ããããŸã-ããå€ãäžçªäžã«çœ®ããŠããã®æŽæ°ã®æžŠãããã³ãŒãã®ãšã©ãŒãŸãã¯ãã¡ãžãŒããžãã¯ã®ããã«å¥ã®å€ãåã«ãŠã³ããããŸããããã®å Žåã埪ç°äŸåé¢ä¿æ€åºãã¬ãŒã ã¯ãŒã¯ã§ã¯ãã¡ã«ããºã ãæ£åžžã«åäœããªãå¯èœæ§ããããå®å šã«ç解ã§ããªãå Žæã§äŸå€ãããã³ã°ããŸãã¯ååŸãããããµã€ã¬ã³ããšã©ãŒã¡ãã»ãŒãžããŸãã¯ã¹ã¿ãã¯ãªãŒããŒãããŒãçºçããŸãã
ãããŠããã®ãããªã¡ã«ããºã ãååšãããšããäºå®ã¯ãããã°ãã«ãŒãããäŸåé¢ä¿ãäœæããå±éºæ§ãããããšã瀺ããŠããŸãããŸããããžãã¹èŠä»¶ã«ãã£ãŠåšæçãªäŸåé¢ä¿ã決ãŸãå ŽåããããŸããç§åŠãæåãçç£ã®3ã€ã®ã¹ã©ã€ããŒãããCivilizationã®ãããªã²ãŒã ãæ³åããŠãã ããããããã®åèšã¯åžžã«100ïŒ ã§ããå¿ èŠããããŸãã 3ã€ã®èšç®ã§äœããå®è£ ããŠã¿ãŠãã ããããŸãã¯ãäŸãã°ãçåœã·ãã¥ã¬ãŒã¿ãŒãããã¯ãçžäºã«äŸåãã1000ã®èšç®ããããã®ã§ã¯ãªãã1ã€ã®èŠ³æž¬å¯èœãªãã®ã§ãããã¢ããªã±ãŒã·ã§ã³å šäœã®ã¢ãã«å šäœãååšããããšãããããŸãããããŠåé¡ã¯ãã¢ããªã±ãŒã·ã§ã³ã§ããã芳å¯ã§ããããã«ããå¿ èŠããããã©ããã§ãã
ãã£ã¡ãªã¢ã¯ãã£ãããã°ã©ãã³ã°ãæå±ããŠããèè ã®æèŠã¯ãããã¯ã¢ãŠãã®å ŽåãšãŸã£ããåãã§ã¯ãããŸããããçç¶ã¯ãŸã£ããåãã§ãããšããçãããããŸãããããŠãäœè ã¯çµµæåã䜿ã£ãŠUDFããæªãå ã®äžã§ãåãã§å ¬éããŸããããã¯ãUIã¢ããªã±ãŒã·ã§ã³ã®äœæã®å°é家ã§ãããšèãã人ã§ãããããããåœç¶ã®ããšãšããŠããããèæ ®ãã人ã§ãããã®ã¢ãŒããã¯ãã£ããŸã£ããç解ããŠããªãããšãéåžžã«æ確ã«ç€ºããŠããŸããé·å¹Žäœ¿çšããŠãããã¹ãŠã®ãã®ãå£ããŠããŸããããæ¬åœã«ç解ããã®ã¯ç°¡åã§ã¯ãããŸããã
ãã®èª€è§£ã¯ããã€ã¢ã°ã©ã ã®æç»æ¹æ³ã§èŠãããšãã§ããåäžã®ã¢ãã«ãåäžã®ãã¥ãŒã§æç»ããããããéçºè ã®å¿ãã€ããUDFã®æ£ç¢ºæ§ãæ確ã§ã¯ãããŸããããã¹ãŠã®ã¢ãŒããã¯ãã£ãèŠæ ãããããäžè¬çã«ãããã®éããç解ããã®ã¯ç°¡åã§ã¯ãããŸããããããŠããããã®ã¢ãã«ãšãã¥ãŒãããããããç¶æ³ãæãå¿ èŠããããŸãããããŠããããã®å€ãããªã¢ã¯ãã£ãããã°ã©ãã³ã°ã䜿çšããŠããå Žåãå€æŽååžå³ã¯æ¬¡ã®ããã«ãªããŸãã
ããã§ã¯ãview1ã®ãã¹ãŠã®ãŠãŒã¶ãŒã¢ã¯ã·ã§ã³ãšåæ§ã«ãå€æŽãç°ãªãèšç®å¯Ÿè±¡ã«é 次é ä¿¡ããã次ã«èŠ³æž¬å¯èœãªå¯Ÿè±¡ã«åæ£ãããŸãããããŠcompute5ã2ååã«ãŠã³ããããview3ã2åæŽæ°ãããããšã¯æããã§ããããã¯ã¢ãŠãã¢ããªã±ãŒã·ã§ã³ã§ã¯ãèšç®ããã1ã€ãé åå ã®èŠçŽ ã®æ°ã«ãã£ãŠNååã«ãŠã³ããããå¹æãçºçããŸãããããã¯ã¢ãŠãã¯å¿ èŠãªãã®ã ããæŽæ°ãããã®ãžã§ããã¢ãã«ã¯çç£æ§ãäžçã«ããããããã®ç¬éã«çªç¶ççºãããšãã䞻匵ããã倧ããªå©ç¹ã
UDFã䜿çšããã¢ããªã±ãŒã·ã§ã³
ãªã¢ã¯ã·ã§ã³/ãªãã¥ãŒã¹ã¢ããªã±ãŒã·ã§ã³ã®äŸã調ã¹ããšããå®å šã«éçºãããŠããªããšæããŸãããç¹ã«ãreduxã®èè èªèº«ã§ããDen Abramovã¯ãUIã³ã³ããŒãã³ãã«çŽæ¥ããããããã¡ã€ã«ãšåããã¡ã€ã«ã«æžã蟌ãããšãææ¡ããŠããŸãã以äžã®props uiã³ã³ããŒãã³ãã§ãã³ã°ããdispatchToPropsé¢æ°
(dispatch) => { return { someMethod: (someData) => { dispatch({type: Actions.someAction, someData }); } } };
ãããã®ã¡ãœããã¯ããè€éã«ãªããéåææäœãå«ãã³ã³ãã³ããæ¡å€§ããå ŽåããããŸã
(dispatch) => { return { async someMethod: (someId) => { dispatch({type: Actions.startedLoadingAction }); const someData = await api.loadSomeData(someId); dispatch({type: Actions.someAction, someData }); } } };
ãããããžãã¹ããžãã¯ã§ããããšã¯ç°¡åã«ããããŸãããããŠãé·ãéãUIã¬ã€ã€ãŒã«ã¯ããžãã¹ããžãã¯ã®å Žæããªããšãããããã¯ã«ã€ããŠã¯ååæ¶ã«ã€ããããŠããŸãããããã«ããã€ãã©ã€ã³ã®2çªç®ã®ã¹ãããã«ãããã®ããžãã¯ã¯ãUDFã¢ãŒããã¯ãã£èªäœã«éåããæåã®ã¹ãããã«åœ±é¿ããŸããããªãããããè¡ãããšãã§ããªããšããäºå®ã¯ãããã«æããã«ãªããŸãããã©ãããã°ã§ããŸããïŒãã°ããããŠã調æ»ãè©Šè¡é¯èª€ã®åŸãçããåºãŸãããããã«ããã®çãã®æå¿«ãã¯ããã®åçŽãã«é¡èã§ãããã€ãã©ã€ã³ã®Nçªç®ã®ã¹ãããã«åœ±é¿ããã³ãŒãã¯ãN-1ãã€ãã©ã€ã³ã®ã¹ãããäžã«ããå¿ èŠããããŸããããã«ãéåæã³ãŒããã¢ããªã±ãŒã·ã§ã³ã®ãšããžã«ã·ããããå¿ èŠããããšããã¹ããŒãã¡ã³ãã¯ãã©ã®ãšããžã«æŽç·ŽãããŠããããååŸããŸããçªç¶ãããã¯ããã¯ãšã³ããååšããå Žæã§ãããæ¥ç¶ã¯éåæã§ããããºã«ãéçºãããéŽäžã§ããè²ãäžèŽããŸãããã³ã³ãã¢ã®ãã1ã€ã®ã¹ããããäœæããå¿ èŠããããŸãããµãŒãã¹ããå¶åŸ¡ç¶æ ã¹ãããã®åã«é 眮ããŸãã
äžè¬çãªå³ã¯æ¬¡ã®ãšããã§ãã
ããŒãž/ã¢ããªã±ãŒã·ã§ã³ã«å ¥ãæç¹ã§ãã¹ãã¢ãäœæãããã€ãã©ã€ã³ã®æåã®å ¥åã¡ãœãããåŒã³åºãå¿ èŠããããŸããããããããããããã¡ãœãããšåŒã³ç¶ããŸãããŸãããµã€ãããšã«1ã€ã®ãµãã¹ã¯ãªãã·ã§ã³UIãçºè¡ããŸãã察å¿ããã¢ã¯ã·ã§ã³ãåŒã³åºãããšã«ããåºæ¿ã¡ãœããã¯ãç¶æ ããé²è¡ã€ã³ãžã±ãŒã¿ãŒãäœçœ®ã«åæåããUIãµãã¹ã¯ãªãã·ã§ã³ã¯ããã«å¿ããŠæ©èœããå€èŠ³ãæç»ããŸãã
åºæ¿ã¡ãœããã¯ã次ã®ã¢ã¯ã·ã§ã³ã«ãããåæããŒã¿ã®ããŒãæã«éåæã¢ã¯ã·ã§ã³ãåŒãèµ·ãããŸãããµãŒããŒããå¿çãæ¥ããšããã€ãã©ã€ã³ã§æ¬¡ã®ãã¹ãçºçããå¥ã®ã¬ã³ããªã³ã°ãè¡ãããŸãã
ããŒã¯ã¢ããã«ã¯ãé¡äŒŒã®ãã®ããããŸã
<button onClick={() => service.userClickedApply()} ></button>
ãããã£ãŠãUIã¬ã€ã€ãŒã«ã¯ããžãã¹ããžãã¯ã¯ãªãã察å¿ãããŠãŒã¶ãŒã¢ã¯ã·ã§ã³ã§ã©ã®åºæ¿ã¡ãœããããã«ããå¿ èŠããããã瀺ãã ãã§ãã
ãã®å Žåãéçºè ã¯ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®ããŒãžã«å ±éã®ã«ãŒããããããåããŒãžã«ç¬èªã®ã«ãŒããããããå€æã§ããŸããåŸè ã®å Žåãã¹ãã¢ãåæåããåããŒãžã¯ãã®ã¬ãã¥ãŒãµãŒã瀺ãå¿ èŠããããŸãã
ãã€ãã©ã€ã³ã®æåã®ã¹ããããš2çªç®ã®ã¹ãããã®çžäºäœçšã
ãµãŒãã¹ã®ååã¯ããã®äŸå°çšã«æ§æãããUIã³ã³ããŒãã³ãã®ååã«å¯Ÿå¿ããŠããŸããããŒãžã¯å·Šããã«ãå³ããã«ãããã¿ãŒã«å解ãããäžéšã®ã³ã³ããŒãã³ããå·Šããã«ãšããã¿ãŒã«é 眮ããããšãæ³å®ãããŠããŸããPaymentsãšUserDataã¯å³ããã«ã«ãããŸãã察å¿ãããµãŒãã¹ãšUIã®å¯Ÿå¿ããç¶æ ã¯ã³ã³ããŒãã³ãã«å±ããŸãããããããã®ã³ã³ããŒãã³ãã察å¿ãããããã®ã³ã³ããŒãã³ããåãå ¥ãã圢åŒãæã£ãŠããããšã«æ³šæããŠãã ããã
ãŠãŒã¶ãŒå ¥åãç¹å®ã®ã³ã³ããŒãã³ãã«é¢ä¿ããå Žåãã€ãŸãèŠä»¶ã«åŸã£ãŠããã®ãŠãŒã¶ãŒå ¥åã¯ç»é¢äžã®äœãã«åœ±é¿ãäžããªããªãããã®ç¹å®ã®ã³ã³ããŒãã³ãã«å¯Ÿå¿ãããµãŒãã¹ãåŒã³åºããããã®ã¡ãœããã¯ãã®ç¶æ ã®å®çŸ©ã®é£ã«ããã¢ã¯ã·ã§ã³ãäœæããŸããã€ã³ã¿ãŒãã§ã€ã¹ïŒã¿ã€ã ã¹ã¯ãªãããæå³ããŸãïŒãããã³å®éã«ã¯æžéæ©ã§ãããµãŒãã¹ã¯åœç¶ããã®ã³ã³ããŒãã³ãã®ã¬ãã¥ãŒãµãŒãšçŽæ¥æ¥ç¶ããŠããªããããç¢å°ãç¹ç·ã§ç€ºãããŠããŸããã¢ã¯ã·ã§ã³ã¯ãäžå€®ã®ãšã³ããªãã€ã³ãstã«éãããŸãã
ããèå³æ·±ãã±ãŒã¹ã¯ãèŠä»¶ã2ã€ã®ã³ã³ããŒãã³ãã®ç¶æ ã§äžåºŠã«äœããå€æŽããããšãæå³ããå Žåã§ãïŒããšãã°ãUserDataã³ã³ããŒãã³ãã§ïŒããŠãŒã¶ãŒã[éå»1幎éã®æ¯æãã衚瀺]ãã¿ã³ãã¯ãªãã¯ãããšãæ¯æãããŒãã«ãæŽæ°ãããUserDataã³ã³ããŒãã³ãã®[åèš]ãã£ãŒã«ããå€æŽãããŸãããã®å Žåãå³åŽã®ããã«ã«å¯Ÿå¿ãããµãŒãã¹ãåŒã³åºãã察å¿ããã¢ã¯ã·ã§ã³ãã¹ããŒããå³åŽã®ããã«ã¬ãã¥ãŒãµãŒããã®ç¶æ ãšç¶æ ãã£ãŒã«ãã«å¯ŸããŠé©åãªã¢ã¯ã·ã§ã³ãå®è¡ãã察å¿ããçŽç²ãªé¢æ°ãåŒã³åºããŸããç§ã建ç¯ã®åæ©ä»ãã§äžããäŸã®ããã«ãåæ§ã«ãããŒãžäžã®å€ãã®ãã¹ãŠãæŽæ°ããå¿ èŠãããå Žåãããšãã°ãå¥ã®ãŠãŒã¶ãŒãéžæãããŠããå Žåããã¹ãŠã®ããŒã¿ããªããŒãããåŸãããŒãžãµãŒãã¹ã§ããŒãžã¬ãã¥ãŒãµãŒã¬ãã«ã®ã¢ã¯ã·ã§ã³ãåŒã³åºãå¿ èŠããããŸããããã«ããããã¹ãŠãäžåºŠã«æŽæ°ãããŸãã代ããã«ããšãã°ãå·Šããã«ãšå³ããã«ã®ããŒã¿ãå¥ã ã«ããŒãããŠãå¥ã ã®é²è¡ç¶æ³ã€ã³ãžã±ãŒã¿ãŒã衚瀺ã§ããå ŽåãããŒãžãµãŒãã¹ããå·Šããã«ãšå³ããã«ãµãŒãã¹ã®å¯Ÿå¿ããã¡ãœãããåŒã³åºãããšãã§ããŸããå¿ èŠã«å¿ããŠãã®ã¢ã¯ã·ã§ã³ãåçãããããããã®èŠæ±ã䞊è¡ããŠçµã¿åãããããã·ãŒã±ã³ã·ã£ã«ã«ããããèŠä»¶ã«æé©ãªããã«ç¬ç«ããŠå®è¡ãããã§ããŸãã
ã³ã³ãã¢ã®3çªç®ã®ã¹ããã
ç§ãèšã£ãããã«ãå·ãžã®å å ¥ã¯1ã€ã§ãªããã°ãªããŸããããã®äŸã§ã¯ããã®ããŒãžã¬ãã«ã®ãµãã¹ã¯ãªãã·ã§ã³ãããŒãžã¯åæ§ã®ã³ãŒããæ³å®ããŠããŸã
import {store} from ... import {LeftPanel, RightPanel, Footer } from ... export class Page extends React.Component { componentWillMount() { store.subscribe(() => this.setState(store.getState())); } render() { return ( <div> <h1>Title here</h1> <LeftPanel state={this.state.leftPanel} /> <RightPanel state={this.state.rightPanel} /> <Footer state={this.state.footer /> </div> ); } }
ããã«ãã¹ããŒãã³ã³ããŒãã³ããšæããªã³ã³ããŒãã³ããžã®ãŸãã«åå²ãæ³å®ãããŠããŸããå³åŽã®ããã«ãæ åœããã³ã³ããŒãã³ãã¯ãã®ããŒãžã«åºæã§ãããä»ã®å Žæã§åŒã³åºããããšã¯æ³å®ãããŠããªããããã¹ããŒãã«ã§ããŸããã€ãŸããç¹å®ã®ãŠãŒã¶ãŒã¢ã¯ã·ã§ã³ã«ãã£ãŠããªã¬ãŒãããå¿ èŠãããç¹å®ã®åºæ¿ãç¥ãå¿ èŠããããŸãããŸããUserDataã³ã³ããŒãã³ãã¯èªç±ã«ãã«ã«ããããšãã§ããŸãããŸããããã·ããªãªã§ã¯ã1ã€ã®ãµãŒãã¹ãšå¯Ÿå¿ããã¬ãã¥ãŒãµãŒãã¡ã¢ãªå ã®ããŒã¿ã管çã§ããå¥ã®ã·ããªãªã§ã¯ãå¥ã®ããŒãžã§å¥ã®ãµãŒãã¹ãéåæã¡ãœãããåŒã³åºããŸãã
ãã®ããã«ãªããŸã
import {rightPanelService, userDataService} from ... import {UserData } from ... export class RightPanel extends React.PureComponent{ render() { const state = this.props.state; return ( <div class="right-panel"> <UserData state={state.userData} onLastYearClicked={() => rightPanelService.lastYearClicked()} onUserNameChanged={(userName) => userDataService.userNameChanged(userName)} /> <Payments state={state.payments} ...etc. /> </div> ); } }
ããã§ã¯ãPureComponentã䜿çšãããŠãããšããäºå®ã«æ³šæãæãããšãã§ããŸããããã¯ããã®ç¶æ ã§ããŒãžã®ç¶æ ãæŽæ°ãããšãã«rightPanelãã£ãŒã«ãã®å€ãåãå Žåãå€æŽãããŒãžã®ä»ã®éšåã®ã¿ã«åœ±é¿ãããã®éšåã«ã¯åœ±é¿ããªãå Žåãå³ããã«ä»¥äžã®ãã¹ãŠã®ã¬ã³ããªã³ã°ãåæãããããšãæå³ããŸããçŽç²ãªãªãã¥ãŒãµãŒã³ãŒããã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ã«ãã©ã¹ã®å¹æããããããŸãã以åã¯ããã®PureComponentã¯å®è£ ãéåžžã«ç°¡åã§ããããReduxäœæè ã®å¥ã®ã©ã€ãã©ãªããã€ã³ããŒãããããããèªåã§äœæããå¿ èŠããããŸãããããã®ã³ã³ããŒãã³ãã¯çŽæ¥ãªã¢ã¯ã·ã§ã³ã«å«ãŸããŸããæ ŒçŽåº«ïŒããŒãžã§ã³2ã4ã5 ...ïŒã§ã¯ãã³ã³ããŒãã³ãã®æŽæ°æŠç¥ããããæ åœããŸããããã§ã@ Inputsã®ããããå€æŽãããŠããªãå ŽåïŒåç §ã®ç䟡æ§ãæ瀺ãããŠããå ŽåïŒããã®ã³ã³ããŒãã³ãã®ããŒãã£ãã§ãã¯ãå®è¡ããå¿ èŠã¯ãããŸããããŸããããŒã¯ã¢ããå ã®ãã¹ãŠã®åã³ã³ããŒãã³ãã¯ãµã€ã¯ã«ããé€å€ãããŸããã€ãŸããreactã®ããã«ã¬ã³ããŒãã©ã³ãå šäœãåæã§ããŸãã
次ã«ãUserDataã³ã³ããŒãã³ãèªäœ
export function UserData({state, onLastYearClicked, onUserNameChanged}) { return ( <div class="user-data"> <input value={state.userName} onChange={(newVal) => onUserNameChanged(newVal)} /> ...etc. </div> ); }
極端ãªãã¹ã
å°ãåã«å¥ã®èãã蚪ããŸãããå®éãããžãã¯ãæããªãããã³ããšã³ãã¢ããªã±ãŒã·ã§ã³ã¯ãããŒã¯ã¢ããã¬ã³ããªã³ã°ããªããŠãæ©èœã§ããããšãããããŸããããããŠããã®ãããªäºå®ãè°è«ã«æã¡èŸŒãå ŽåïŒ
1ïŒãã©ãŠã¶ãåŒã³åºãããšã¯ãUIå±€ã®åäœãã¹ãã§æéçã«æãè²»çšã®ãããæäœã§ãã
2ïŒããŒã¯ã¢ããã®æ©èœã¯ãã¢ããªã±ãŒã·ã§ã³ã®ä»ã®éšåãšæ¯èŒããŠæ¯èŒçå°ãã
3ïŒããŒã¯ã¢ããã¯ãéçºè ã®ã³ââã¹ãã®èŠ³ç¹ãããã¹ãããã®ã«è²»çšãããããäžéšã®èŠçŽ ãä»ã®èŠçŽ ã«ã¯ããŒã«ãããªã©ã®ãã°ãæé€ãã éåžžéåžžã«å®ãã
ã€ãŸããã¹ãã³ã¹ãã¯ãç¹å®ã§ãããã°ã®äŸ¡å€ã¯ãããŸããã
ãããããã®ãããªã¢ããªã±ãŒã·ã§ã³ãnodeJSã§çŽæ¥ãã¹ããããšã©ããªããŸããïŒãã©ãŠã¶ãŒãéããã«ãã¬ã³ããªã³ã°ãå®è¡ããã«ããã¹ãã§çŽæ¥ã¹ãã¢ãäœæãããµãŒãã¹ã¡ãœãããåŒã³åºããåºæ¿çãªã¡ãœãããåŒã³åºããŠãŠãŒã¶ãŒã¢ã¯ã·ã§ã³ãã·ãã¥ã¬ãŒããããã®ãããªæäœã®çµæãšããŠã¹ãã¢ã§å€æããããŒã¿ããã¹ãããŸããã»ã¬ã³ïŒãŸãã¯ããã§äœ¿çšãããã®ïŒãšããåãããããã®ã³ãŒããèšè¿°ããå¿ èŠãããªãããã¹ãã¯éåžžââã®ãã¹ããããæ°ååãŸãã¯æ°çŸåãéããªããããããã«ãã¹ãããæéãã§ããŸãã
ãã¡ããããã©ãŠã¶ã§ã¢ããªã±ãŒã·ã§ã³ã®èµ·åãè¿œå ã§ç¢ºèªãããªãã·ã§ã³ããããŸããåããŒãžã«äžåºŠã¢ã¯ã»ã¹ããã«ãŒãã£ã³ã°ã®åäœããã¹ãããããŒãžã®ã«ãŒãã§ãµãã¹ã¯ãªãã·ã§ã³ãå®è¡ããããšãã§ããŸãããããŠããã®ãããªãã¹ãã¯ãé·æã¹ãã¬ã¹ãã¹ããããå Žæã«çœ®ãããšãã§ããŸããããã¯ãé éã®2é±éããšã«1åãããããŸãã¯äžæ©å®è¡ãããŸãããããŠããŸã åäœãã¹ãã§ããããŸã åäœãã¹ãã®ã¬ãã«ã«èœã¡ãŠããªããã¹ãã®ã»ãšãã©ã¯ããã§ã«ååã«é«éã§å®è¡ãããŠããããããã¹ãŠã®ã³ãããã§ãå°ãªããšãéçºããã»ã¹ã®ãããã¿ã§å®è¡ã§ããŸãã
æ®å¿µãªããããã®ãããªããªãã¯ã¯ã¢ã³ã®ã¥ã©ãŒã§ã¯æ©èœããŸãããã¢ããªã±ãŒã·ã§ã³ãæ©èœããããã«ããã¹ãŠã®ãµãŒãã¹ã¯@Injectableã§ã©ãããããããã¯ãšã³ããªã¯ãšã¹ãã«ã¯Httpè§åºŠãµãŒãã¹ã䜿çšããŸããäŸåé¢ä¿æ³šå ¥ã¡ã«ããºã ãæŸæ£ããããšãããšãHttpã®ä»£ããã«ãã€ãã£ããã§ããã䜿çšããObservableã®ä»£ããã«Promiseã䜿çšãããšå€±æããå ŽåããããŸããããšãã°ãasync / awaitããµããŒããããŠããªãããšãããã£ãŠãããªã©ãzone.jsã©ã€ãã©ãªã§ãµããŒããããŠããªãã¹ã¯ãªãããå®è¡ãããå±éºæ§ããããŸãã
æåŸã«
次ã®èšäºã§ã¯ãreduxã䜿çšããŠç掻ãç°¡çŽ åãã4ã€ã®ã³ãŒãã®ãã¡3ã€ããã®å Žã§èªåçã«çæã§ãããœãªã¥ãŒã·ã§ã³ãèªåããçµãåºãäºå®ã§ãããœãªã¥ãŒã·ã§ã³ã¯ãtypescriptã«ã®ã¿é©çšãããŸããã€ã³ã¿ãŒãã§ã€ã¹ã§ç¶æ ããªãŒãèšè¿°ãããšããäºå®ã«åºã¥ããŠããŸãã