ãã®èšäºã«ã¯ãã¬ããŒãã«é©åããªãã£ããååã®ãã詳现ãªåæãšå®è·µããã®è©³çްãªäŸãå«ãŸããŠããŸãããã®ãããã¯ãæ·±ãæãäžããŠãåå©çšå¯èœãªã³ã³ããŒãã³ãã®äœææ¹æ³ãåŠã³ããå Žåã¯ããããèªãããšããå§ãããŸããäžè¬çãªçšèªã§åå©çšå¯èœãªã³ã³ããŒãã³ãã®äžçã«ç²Ÿéãããå Žåã¯ãç§ã®æèŠã§ã¯ãã¬ããŒãã®èšé²ãé©ããŠããŸãã
åããŠã®ããã°ã©ãã³ã°èšèªã«é¢ããæ¬ãããã°ã©ãã³ã° ã³ãŒã¹ãããŒãã§ã¯ã ã³ãŒããã¯ãªãŒã³ ã³ãŒããªã©ã®é«å質ã®ã³ãŒããæžãããã®æ¬ã§ãã³ãŒãã®éè€ããã話é¡ã«ãªããããã³ãŒãã®éè€ãæªãããšã¯èª°ããç¥ã£ãŠããŸãã
ããã³ããšã³ãã§ã®éè€ãé¿ããããšãé£ããçç±ãšãåå©çšå¯èœãªã³ã³ããŒãã³ããæ£ããæžãæ¹æ³ãèŠãŠã¿ãŸãããããããŠãSOLID ã®ååã圹ç«ã¡ãŸãã
ã³ãŒãã®è€è£œãæ¢ããã®ãé£ããã®ã¯ãªãã§ãã?
åçã¯åçŽã«èãããã§ããããåæã«ããããå°éãããŠãããã©ãããç°¡åã«ç¢ºèªã§ããŸããã³ãŒãããŒã¹ã«éè€ããªãå Žåã¯ããã¹ãŠåé¡ãããŸãããå®è·µãé£ããã®ã¯ãªãïŒ
ã³ã³ããŒãã³ã Ya. ãã¥ãŒããªã¢ã«ã®ã©ã€ãã©ãªã䜿çšããŠäŸãåæããŸããããæã ããããžã§ã¯ãã¯äžæå²©ã§ããããã®åŸã䟿å®äžãéçºè ã¯åå©çšå¯èœãªã³ã³ããŒãã³ããå¥ã®ã©ã€ãã©ãªã«ç§»åããããšã«ããŸãããããã«æåã«å°éãããã®ã® 1 ã€ã¯ãã¿ã³ ã³ã³ããŒãã³ãã§ãããã³ã³ããŒãã³ãã¯é²åããæéã®çµéãšãšãã«æ°ãããã¹ãã«ããšãã¿ã³ã®èšå®ãç»å ŽããèŠèŠçãªã«ã¹ã¿ãã€ãºã®æ°ãå¢ããŸããããã°ãããããšãã³ã³ããŒãã³ããéåžžã«é«åºŠã«ãªããæ°ããã¿ã¹ã¯ã«äœ¿çšããŠããã«æ¡åŒµããã®ãäžäŸ¿ã«ãªããŸããã
ãã®ãããæ¬¡ã®ã€ãã¬ãŒã·ã§ã³ã§ã¯ãã³ã³ããŒãã³ãã®ã³ããŒãButton2 ã衚瀺ãããŸãããããã¯éåžžã«æã«èµ·ãã£ãããšã§ãããåºçŸã®æ£ç¢ºãªçç±ãèŠããŠãã人ã¯ããŸããããã ããã³ã³ããŒãã³ãã¯äœæãããŸããã
倧äžå€«ããã§ã - ãã¿ã³ã 2 ã€ã«ããŠã¿ãŸããããçµå±ã®ãšãããããã¯ãã ã®ãã¿ã³ã§ãããã ããå®éã«ã¯ããããžã§ã¯ãã« 2 ã€ã®ãã¿ã³ãé 眮ãããšãé·æçã«éåžžã«äžå¿«ãªçµæãçããŸããã
ã¹ã¿ã€ã«ãæŽæ°ããå¿ èŠããããã³ã«ãã©ã®ã³ã³ããŒãã³ãã§ãããè¡ããã¯æç¢ºã§ã¯ãããŸããã§ãããä»ã®å Žæã®ã¹ã¿ã€ã«ã誀ã£ãŠå£ããªãããã«ãã©ã®ã³ã³ããŒãã³ãã䜿çšãããŠãããã確èªããå¿ èŠããããŸããããã¿ã³è¡šç€ºã®æ°ããããŒãžã§ã³ãç»å Žãããšããã©ã®ã³ã³ããŒãã³ããæ¡åŒµããããæ±ºå®ããŸãããæ°ããæ©èœãç®ã«ãããã³ã«ãã©ã®ãã¿ã³ã䜿çšããããèããŸããããŸãã1 ã€ã®å Žæã§è€æ°ã®ç°ãªããã¿ã³ãå¿ èŠãªå Žåãããã2 ã€ã®ãã¿ã³ ã³ã³ããŒãã³ãã 1 ã€ã®ãããžã§ã¯ã ã³ã³ããŒãã³ãã«äžåºŠã«ã€ã³ããŒãããŸããã
é·ãç®ã§èŠãã°ããã¿ã³ã® 2 ã€ã®ã³ã³ããŒãã³ãã®ååšãèŠçã§ããããšã倿ãããšããäºå®ã«ãããããããç§ãã¡ã¯åé¡ã®æ·±å»ããããã«ã¯çè§£ãããã¢ã€ã³ã³ã§åæ§ã®ããšãããããšã«æåããŸãããã³ã³ããŒãã³ããäœæãããããç§ãã¡ã«ãšã£ãŠããŸã䟿å©ã§ã¯ãªãããšã«æ°ä»ãããšã㯠Icon2 ãäœæããæ°ããã¿ã¹ã¯ã«ã¯é©ããªãããšã倿ãããšãã« Icon3 ãäœæããŸããã
ãã¿ã³ã®è€è£œã«ããæªåœ±é¿ã®ã»ãŒãã¹ãŠããã¢ã€ã³ã³ ã³ã³ããŒãã³ãã§ç¹°ãè¿ãããŸããããããžã§ã¯ãã§ã¢ã€ã³ã³ãããŸã䜿çšãããªããããå°ãç°¡åã«ãªããŸãããæ£çŽèšã£ãŠãããã¯ãã¹ãŠæ©èœã«äŸåããŸããããã«ããã¿ã³ãšã¢ã€ã³ã³ã®äž¡æ¹ã§ãæ°ããã³ã³ããŒãã³ããäœæãããšãã«å€ãã³ã³ããŒãã³ãã¯åé€ãããŸããã§ãããåé€ããã«ã¯ããããžã§ã¯ãå šäœã§ãã°ãçºçããå¯èœæ§ããããããå€ãã®ãªãã¡ã¯ã¿ãªã³ã°ãå¿ èŠã ã£ãããã§ããã§ã¯ããã¿ã³ãšã¢ã€ã³ã³ã®ã±ãŒã¹ã®å ±éç¹ã¯äœã§ãããã? ãããžã§ã¯ãå ã®éè€ã®åºçŸã«ã€ããŠãåãã¹ããŒã ãçŸåšã®ã³ã³ããŒãã³ããåå©çšããŠæ°ããæ¡ä»¶ã«é©å¿ãããããšã¯å°é£ã ã£ãã®ã§ãæ°ããã³ã³ããŒãã³ããäœæããŸããã
ã³ã³ããŒãã³ãã®è€è£œãäœæããããšã§ãç§ãã¡ã¯å°æ¥ã®ç掻ãè€éã«ããŸããã³ã³ã¹ãã©ã¯ã¿ãŒã®ããã«ãæ¢æã®ãããã¯ããã€ã³ã¿ãŒãã§ãŒã¹ãçµã¿ç«ãŠããã£ãã®ã§ããããã䟿å©ã«è¡ãã«ã¯ãç°¡åã«å ¥æããŠäœ¿çšã§ããé«å質ã®ã³ã³ããŒãã³ããå¿ èŠã§ãã åé¡ã®æ ¹æ¬ã¯ãåå©çšãèšç»ããŠããã³ã³ããŒãã³ããæ£ããèšè¿°ãããŠããªãããšã§ãããããæ¡åŒµããŠä»ã®å Žæã«é©çšããããšã¯å°é£ã§ããã
åå©çšå¯èœãªã³ã³ããŒãã³ãã¯ãååã«çšéãåºããåæã«ã·ã³ãã«ã§ãªããã°ãªããŸããã圌ãšäžç·ã«ä»äºãããã®ã¯èŠçã§ã¯ãªããå€§ç ²ããã¹ãºã¡ãæã€ãããªãã®ã§ãã£ãŠã¯ãªããŸãããäžæ¹ãã³ã³ããŒãã³ãã¯ãã¹ã¯ãªãããå°ã倿Žããã ãã§ã¯ã"Component2" ãèšè¿°ããæ¹ãç°¡åã§ããããšãæç¢ºã«ãªããªãããã«ååã«ã«ã¹ã¿ãã€ãºã§ããå¿ èŠããããŸãã
SOLID åå©çšå¯èœãªã³ã³ããŒãã³ãã«åããŠ
é«å質ã®ã³ã³ããŒãã³ããäœæããã«ã¯ãé åèª SOLID ã®èåŸã«ããäžé£ã®ã«ãŒã«ãå¿ èŠã§ãããããã®èŠåã¯ã颿°ãšããŒã¿æ§é ãã¯ã©ã¹ã«çµåããæ¹æ³ãšãã¯ã©ã¹ãäºãã«çµåããæ¹æ³ã説æããŠããŸãã
ãªãå³å¯ã«å å®ã§ãããä»ã®äžé£ã®ååã§ã¯ãªãã®ã§ãã? SOLID ã«ãŒã«ã¯ãã¢ããªã±ãŒã·ã§ã³ãé©åã«èšèšããæ¹æ³ãæããŠãããŸãããããžã§ã¯ããå®å šã«éçºããæ°ããæ©èœã远å ããæ¢åã®æ©èœã倿Žãããšåæã«ããã¹ãŠãå£ããªãããã«ããŸããç§ã®æèŠã§ã¯ãè¯ãã³ã³ããŒãã³ããšã¯äœãã説æããããšãããšããç§ã®åºæºã SOLID ã®ååã«è¿ãããšã«æ°ä»ããŸããã
- Sã¯åç¬è²¬ä»»ã®ååã§ãã
- O - ãªãŒãã³/ã¯ããŒãºã®ååã
- L ã¯ãªã¹ã³ãã®çœ®æåçã§ãã
- I - ã€ã³ã¿ãŒãã§ãŒã¹ã®åé¢ã®ååã
- D - äŸåé¢ä¿é転ã®ååã
ãããã®ååã®äžéšã¯ãã³ã³ããŒãã³ãã®èª¬æã«é©ããŠããŸããä»ã®ãã®ã¯ãããã³ããšã³ãã®ã³ã³ããã¹ãã§ãã倧ããã«èŠããŸãããããããããã¯ãã¹ãŠäžç·ã«ãé«å質ã®ã³ã³ããŒãã³ãã«é¢ããç§ã®ããžã§ã³ããã衚ããŠããŸãã
ç§ãã¡ã¯ååã«åŸããŸãããåçŽãªãã®ããè€éãªãã®ãŸã§é ã远ã£ãŠèª¬æããŸãããŸããå€ãã®ç¶æ³ã§åœ¹ç«ã€åºæ¬çãªããšãèŠãŠã¿ãŸããããæ¬¡ã«ããã匷åã§å ·äœçãªç¶æ³ãèŠãŠã¿ãŸãããã
ãã®èšäºã§ã¯ãReact + TypeScript ã®ã³ãŒãäŸã瀺ããŸããç§ãæããã䜿ããã¬ãŒã ã¯ãŒã¯ãšã㊠React ãéžã³ãŸããããã®ä»£ããã«ã奜ããªããŸãã¯é©ããä»ã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšã§ããŸããTS ã®ä»£ããã«ãçŽç²ãª JS ã䜿çšã§ããŸãããTypeScript ã䜿çšãããšãã³ãŒãã§ã³ã³ãã©ã¯ããæç€ºçã«èšè¿°ã§ãããããè€éãªã³ã³ããŒãã³ãã®éçºãšäœ¿çšãç°¡åã«ãªããŸãã
ããŒã·ãã¯
ééåç
ãœãããŠã§ã¢ ãšã³ãã£ãã£ã¯ãæ¡åŒµã«å¯ŸããŠãªãŒãã³ã§ããã倿Žã«å¯ŸããŠã¯ããŒãºããå¿ èŠããããŸããã€ãŸããæ¢åã®ã³ãŒãã倿Žããããšãªããæ°ããã³ãŒãã§æ©èœãæ¡åŒµã§ããå¿ èŠããããŸããã©ãããŠãããéèŠã§ããïŒæ°ããæ©èœã远å ããããã«æ¢åã®ã¢ãžã¥ãŒã«ãç·šéãããã³ã«ããããžã§ã¯ãå šäœãäžå®å®ã«ãªããŸããåžžã«å€åããŠããã®ã§ãå£ããå¯èœæ§ãããå ŽæããããããããŸãã
ãã¿ã³ã®äŸã§åçã®é©çšãèããŠã¿ãŸãããããã¿ã³ ã³ã³ããŒãã³ããäœæããã¹ã¿ã€ã«ãèšå®ããŸããããããŸã§ã®ãšããããã¹ãŠãããŸãæ©èœããŠããŸãããããããã®åŸãæ°ããã¿ã¹ã¯ãçºçãããã®ãã¿ã³ã®ç¹å®ã® 1 ã€ã®å Žæã§ãããŸããŸãªã¹ã¿ã€ã«ãé©çšããå¿ èŠãããããšãããããŸããã
ãã¿ã³ã¯ãã³ãŒããç·šéããªããšå€æŽã§ããªãããã«èšè¿°ãããŠããŸã
çŸåšã®ããŒãžã§ã³ã§ç°ãªãã¹ã¿ã€ã«ãé©çšããã«ã¯ããã¿ã³ ã³ã³ããŒãã³ããç·šéããå¿ èŠããããŸããåé¡ã¯ãã³ã³ããŒãã³ããã«ã¹ã¿ãã€ãºã§ããªãããšã§ããã°ããŒãã« ã¹ã¿ã€ã«ãèšè¿°ãããªãã·ã§ã³ã¯ä¿¡é Œæ§ãäœããããèæ ®ããŸãããã©ããªç·šéã§ãå£ããå¯èœæ§ããããŸãããã¿ã³ã®ä»£ããã«ãããšãã°æ¥ä»ããã«ãŒ ã³ã³ããŒãã³ããªã©ãããè€éãªãã®ãé 眮ããå Žåã®çµæã¯å®¹æã«æ³åã§ããŸãã
ãªãŒãã³/ã¯ããŒãºã®ååã«åŸã£ãŠãæ°ããã¹ã¿ã€ã«ã远å ãããšãã«ãã¿ã³ã®ã³ãŒããæžãçŽãå¿ èŠããªãããã«ã³ãŒããæžãã¹ãã§ããã³ã³ããŒãã³ãã®ã¹ã¿ã€ã«ã®äžéšãå€éšã«æããããšãã§ããã°ããã¹ãŠãããŸããããŸãããããè¡ãã«ã¯ãã³ã³ããŒãã³ãã®æ°ããã¹ã¿ã€ã«ãèšè¿°ããããã«å¿ èŠãªã¯ã©ã¹ãæž¡ãå°éå ·ãäœæããŸãã
// ,
import cx from 'classnames';
// â mix
const Button = ({ children, mix }) => {
return (
<button
className={cx("my-button", mix)}
>
{children}
</button>
}
ããã§ãã³ã³ããŒãã³ããã«ã¹ã¿ãã€ãºããããã«ã³ãŒããç·šéããå¿ èŠããªããªããŸããã
ãã®ããªãäžè¬çãªæ¹æ³ã䜿çšãããšãã³ã³ããŒãã³ãã®å€èгãã«ã¹ã¿ãã€ãºã§ããŸãã远å ã®ã¯ã©ã¹ãã³ã³ããŒãã³ãèªäœã®ã¯ã©ã¹ãšæ··ãã£ãŠãããããããã¯ããã¯ã¹ãšåŒã°ããŸããã³ã³ããŒãã³ããå€éšããã¹ã¿ã€ã«èšå®ããæ¹æ³ã¯ãã¯ã©ã¹ãæž¡ãããšã ãã§ã¯ãªãããšã«æ³šæããŠãã ããã CSS ããããã£ãæã€ãªããžã§ã¯ããã³ã³ããŒãã³ãã«æž¡ãããšãã§ããŸãã CSS-in-JS ãœãªã¥ãŒã·ã§ã³ã䜿çšã§ããŸãããæ¬è³ªã¯å€ãããŸãããããã¯ã¹ã¯ãMaterialUIãVuetifyãPrimeNG ãªã©ãå€ãã®ã³ã³ããŒãã³ã ã©ã€ãã©ãªã§äœ¿çšãããŸãã
ããã¯ã¹ã«ã€ããŠã©ã®ãããªçµè«ãå°ãåºãããšãã§ããŸãã?å®è£ ãç°¡åã§çšéãåºããæå°éã®åŽåã§ã³ã³ããŒãã³ãã®å€èгãæè»ã«ã«ã¹ã¿ãã€ãºã§ããŸãã
ãããããã®ã¢ãããŒãã«ãæ¬ ç¹ããããŸããèªç±åºŠãé«ããããã»ã¬ã¯ã¿ãŒã®ç¹ç°æ§ã«åé¡ãçããå¯èœæ§ããããŸãããŸããã«ãã»ã«åãè§£é€ãããŸããæ£ãã CSS ã»ã¬ã¯ã¿ãŒãçæããã«ã¯ãã³ã³ããŒãã³ãã®å éšæ§é ãç¥ãå¿ èŠããããŸããããã¯ãã³ã³ããŒãã³ãããªãã¡ã¯ã¿ãªã³ã°ãããšãã«ãã®ãããªã³ãŒããç Žæããå¯èœæ§ãããããšãæå³ããŸãã
æåå€å
ã³ã³ããŒãã³ãã«ã¯ããã®ã³ã¢ãšãªãããŒãããããŸãããããã倿Žãããšãå¥ã®ã³ã³ããŒãã³ããåŸãããŸãããã¿ã³ã®å Žåãããã¯ç¶æ ãšåäœã®ã»ããã§ãããããŒãšã¯ãªãã¯ã®å¹æã«ããããŠãŒã¶ãŒã¯ãã¿ã³ããã§ãã¯ããã¯ã¹ãªã©ãšåºå¥ããŸããäžè¬çãªäœæ¥ããžãã¯ããããŸãããŠãŒã¶ãŒãã¯ãªãã¯ãããšãã€ãã³ã ãã³ãã©ãŒãããªã¬ãŒãããŸããããã¯ã³ã³ããŒãã³ãã®ã³ã¢ã§ããããã¿ã³ããã¿ã³ã«ãããã®ã§ããã¯ããäŸå€ã¯ãããŸãããã»ãšãã©ã®ãŠãŒã¹ã±ãŒã¹ã§ãã®ããã«æ©èœããŸãã
ãŸãã䜿çšããå Žæã«ãã£ãŠéšåãå€åããéšåããããŸããã¹ã¿ã€ã«ã¯ãã®ã°ã«ãŒãã«å±ããŸããå¥ã®ãµã€ãºãè²ã®ãã¿ã³ãå¿ èŠã«ãªããããããŸãããç°ãªãã¹ãããŒã¯ãšãã£ã¬ããããŸãã¯ç°ãªããããŒå¹æããã¹ãŠã®ã¹ã¿ã€ã«ã¯ãã³ã³ããŒãã³ãã®å€æŽå¯èœãªéšåã§ãããã¿ã³ãéãããã«èŠãããã³ã«æ°ããã³ã³ããŒãã³ããæžãçŽãããäœæããããããã¯ãããŸããã
é »ç¹ã«å€æŽããããã®ã¯ãã³ãŒãã倿Žããã«åŸ®èª¿æŽããå¿ èŠããããŸããããããªããšãå€ãã³ã³ããŒãã³ããã«ã¹ã¿ãã€ãºããŠè¿œå ãããããæ°ããã³ã³ããŒãã³ããäœæããæ¹ãç°¡åãªç¶æ³ã«é¥ã£ãŠããŸããŸãããååãªæè»æ§ããªãããšã倿ããŸããã
ããŒã
ãã¿ã³ã®äŸã䜿çšããã³ã³ããŒãã³ã ããžã¥ã¢ã«ã®ã«ã¹ã¿ãã€ãºã«æ»ããŸããããæ¬¡ã®æ¹æ³ã¯ãããŒããé©çšããããšã§ããããŒããšã¯ãã³ã³ããŒãã³ããè€æ°ã®ã¢ãŒãã§ç°ãªãå Žæã«è¡šç€ºãããæ©èœãæå³ããŸãããã®è§£éã¯ãæããããŒããšæãããŒãã®ã³ã³ããã¹ãã§ã®ããŒãèšå®ãããåºãã§ãã
ããŒãã®äœ¿çšã¯ãããã¯ã¹ã«ãã以åã®æ¹æ³ãé€å€ãããã®ã§ã¯ãããŸãããããããè£å®ããŸããã³ã³ããŒãã³ãã«ã¯è€æ°ã®è¡šç€ºã¡ãœãããããã䜿çšããå Žåã¯ç®çã®ã¡ãœãããæå®ããå¿ èŠããããšæç€ºçã«èšããŸãã
import cx from 'classnames';
import b from 'b_';
const Button = ({ children, mix, theme }) => (
<button
className={cx(
b("my-button", { theme }), mix)}
>
{children}
</button>
)
ããšãã°ããããžã§ã¯ãã« 20 åã®ãã¿ã³ããããåãã¿ã³ã®ã¹ã¿ã€ã«ãã¢ããªã±ãŒã·ã§ã³ã®å Žæã§èšå®ãããŠããããããã¹ãŠãå°ãç°ãªã£ãŠèŠããå ŽåãããŒãèšå®ã䜿çšãããšãã¹ã¿ã€ã«ã®åç©åãé¿ããããšãã§ããŸãããã®ã¢ãããŒãã¯ããªãŒããŒãšã³ãžãã¢ãªã³ã°ãæããããšãªãããã¹ãŠã®æ°ããã³ã³ããŒãã³ãã«é©çšã§ããŸããã³ã³ããŒãã³ãã®å€èгãç°ãªãå Žåãããããšãããã£ãŠããå Žåã¯ãæåããæç€ºçã«ããŒããèšå®ããããšããå§ãããŸããããã«ããããããªãã³ã³ããŒãã³ãéçºãç°¡çŽ åãããŸãã
ãã ããæ¬ ç¹ããããŸãããã®æ¹æ³ã¯ããžã¥ã¢ã«ã®ã«ã¹ã¿ãã€ãºã«ã®ã¿é©ããŠãããã³ã³ããŒãã³ãã®åäœã«åœ±é¿ãäžããããšã¯ã§ããŸããã
ã³ã³ããŒãã³ãã®ãã¹ã
æ°ãã颿°ã远å ãããšãã«ã³ã³ããŒãã³ã ã³ãŒãã®å€æŽãåé¿ããæ¹æ³ããã¹ãŠæããããã§ã¯ãããŸãããä»ã®ååã¯ãæ®ãã®ååã調ã¹ãããšã«ãã£ãŠç€ºãããŸããããã§ã¯ãåã³ã³ããŒãã³ããšã¹ãããã«ã€ããŠèšåããããšæããŸãã
Web ããŒãžã¯ãã³ã³ããŒãã³ãã®ããªãŒã®ãããªéå±€ã§ããåã³ã³ããŒãã³ãã¯ãäœãã©ã®ããã«ã¬ã³ããªã³ã°ããããæ±ºå®ããŸããããããåžžã«ãããšã¯éããŸãããããšãã°ããã¿ã³ã䜿çšãããšãå éšã§ã¬ã³ããªã³ã°ãããã³ã³ãã³ããæå®ã§ããŸããReact ã§ã¯ãäž»ãªããŒã«ã¯children propsãšrender propsã§ããVue ã«ã¯ããã匷åãªã¹ãããã®æŠå¿µããããŸãããããã®æ©èœã䜿çšããŠåçŽãªã³ã³ããŒãã³ããäœæããå Žåãåé¡ã¯ãããŸããããã ããè€éãªã³ã³ããŒãã³ãã§ãã£ãŠããã³ã³ããŒãã³ããäžãã衚瀺ããå¿ èŠã®ããäžéšã®èŠçŽ ã®ã¹ããŒã䜿çšã§ããããšãå¿ããªãã§ãã ããã
äžçŽ
以äžã«èª¬æããååã¯ããã倧ããªãããžã§ã¯ãã«é©ããŠããŸãã察å¿ããææ³ã«ããæè»æ§ãåäžããŸãããèšèšãšéçºã®è€éããå¢ããŸãã
åäžè²¬ä»»ã®åå
åäžè²¬ä»»ã®ååã¯ãã¢ãžã¥ãŒã«ã倿Žããçç±ã¯ãã 1 ã€ã§ãªããã°ãªããªãããšãæå³ããŸãã
ã©ãããŠãããéèŠã§ããïŒååã«éåããå Žåã®çµæã«ã¯ã次ã®ãããªãã®ããããŸãã
- ã·ã¹ãã ã®äžéšãç·šéãããšãã«ãå¥ã®ãã®ãå£ããªã¹ã¯ã
- æªãæœè±¡åããã®çµæãè€æ°ã®æ©èœãå®è¡ã§ããã³ã³ããŒãã³ããäœæãããã³ã³ããŒãã³ããäœããã¹ãã§äœããã¹ãã§ãªãããæ£ç¢ºã«çè§£ããããšãé£ãããªããŸãã
- ã³ã³ããŒãã³ãã®äžäŸ¿ãªäœæ¥ããã¹ãŠãäžåºŠã«å®è¡ããã³ã³ããŒãã³ããæ¹åãããããã°ãä¿®æ£ãããããããšã¯éåžžã«å°é£ã§ãã
ããŒãã®äŸã«æ»ã£ãŠãåäžè²¬ä»»ã®ååãå°éãããŠãããã©ãããèŠãŠã¿ãŸãããããã§ã«çŸåšã®åœ¢ã§ãããŒãã¯ãã®ã¿ã¹ã¯ã«å¯ŸåŠããŠããŸãããããã¯ãœãªã¥ãŒã·ã§ã³ã«åé¡ããªããæ¹åã§ããªããšããæå³ã§ã¯ãããŸããã
1 ã€ã®ã¢ãžã¥ãŒã«ãããŸããŸãªäººã«ãã£ãŠããŸããŸãªçç±ã§ç·šéãããŠãã
ãã¹ãŠã®ã¹ã¿ã€ã«ã 1 ã€ã® css ãã¡ã€ã«ã«å ¥ãããšããŸããããããŸããŸãªçç±ã§ããŸããŸãªäººã«ãã£ãŠç·šéãããå¯èœæ§ããããŸããåç¬è²¬ä»»ã®ååã«éåããŠããããšã倿ããŸããã誰ããã¹ã¿ã€ã«ããªãã¡ã¯ã¿ãªã³ã°ã§ããå¥ã®éçºè ãæ°ããæ©èœã埮調æŽããŸãããã®ãããäœããç°¡åã«å£ãããšãã§ããŸãã
SRP æºæ ã®ããŒãèšå®ãã©ã®ããã«èŠããããèŠãŠã¿ãŸããããå®ç§ãªçµµ: ãã¿ã³ãšãããçšã®ããŒãã®ã»ãããå¥ã«ãããŸãããã¿ã³ã«ããŒããé©çšããŠãããŒãä»ãã®ãã¿ã³ãååŸã§ããŸããããŒãã¹ãšããŠãããšãã°ã³ã³ããŒãã³ã ã©ã€ãã©ãªã«é 眮ããããã«ãããã€ãã®å©çšå¯èœãªããŒãã§ãã¿ã³ãçµã¿ç«ãŠãããšæããŸãã
念é¡ã®å¡è£ ãããŒãã¯åå¥ã®ãšã³ãã£ãã£ã§ããããã¿ã³ã«é©çšã§ããŸãã
ããŒãã¯ãã¿ã³ãã©ããããŸããããã¯ãåœç€Ÿã®å éšã³ã³ããŒãã³ã ã©ã€ãã©ãªã§ãã Lego ã§äœ¿çšãããŠããã¢ãããŒãã§ãã HOC (High Order Components) ã䜿çšããŠåºæ¬ã³ã³ããŒãã³ããã©ããããæ°ããæ©èœã远å ããŸããããšãã°ãããŒããä»ããŠè¡šç€ºããæ©èœã
HOC ã¯ãã³ã³ããŒãã³ããåãåããå¥ã®ã³ã³ããŒãã³ããè¿ã颿°ã§ããããŒããæã€ HOC ã¯ããã¿ã³å ã«ã¹ã¿ã€ã«ãæã€ãªããžã§ã¯ããã¹ããŒã§ããŸãã以äžã¯ããªãæè²çãªãªãã·ã§ã³ã§ããå®éã«ã¯ããããšã¬ã¬ã³ããªãœãªã¥ãŒã·ã§ã³ã䜿çšã§ããŸããããšãã°ãã¯ã©ã¹ãã³ã³ããŒãã³ãã«ã¹ããŒããŠããã®ã¹ã¿ã€ã«ã HOC ã«ã€ã³ããŒãããããCSS-in-JS ãœãªã¥ãŒã·ã§ã³ã䜿çšãããã§ããŸãã
ãã¿ã³ã®ããŒããèšå®ããããã®åçŽãª HOC ã®äŸ:
const withTheme1 = (Button) =>
(props) => {
return (
<Button
{...props}
styles={theme1Styles}
/>
)
}
const Theme1Button = withTheme1(Button);
HOC ã¯ãç¹å®ã®ããŒããæå®ãããŠããå Žåã«ã®ã¿ã¹ã¿ã€ã«ãé©çšã§ããŸãããã以å€ã®å Žåã¯ãäœãããŸããããã®ãããäžé£ã®ããŒãã§ãã¿ã³ãçµã¿ç«ãŠãããŒãã®å°éå ·ãæå®ããããšã§å¿ èŠãªãã®ãã¢ã¯ãã£ãã«ããããšãã§ããŸãã
è€æ°ã® HOC ã䜿çšããŠãç®çã®ããŒãã®ãã¿ã³ãåéããŸãã
import "./styles.css";
// .
const ButtonBase = ({ style, children }) => {
console.log("styl123e", style);
return <button style={style}>{children}</button>;
};
const withTheme1 = (Button) => (props) => {
// HOC , "theme1"
if (props.theme === "theme1") {
return <Button {...props} style={{ color: "red" }} />;
}
return <Button {...props} />;
};
const withTheme2 = (Button) => (props) => {
// HOC , "theme2"
if (props.theme === "theme2") {
return <Button {...props} style={{ color: "green" }} />;
}
return <Button {...props} />;
};
// - HOC
const compose = (...hocs) => (BaseComponent) =>
hocs.reduce((Component, nextHOC) => nextHOC(Component), BaseComponent);
// ,
const Button = compose(withTheme1, withTheme2)(ButtonBase);
export default function App() {
return (
<div className="App">
<Button theme="theme1">"Red"</Button>
<Button theme="theme2">"Green"</Button>
</div>
);
}
ãããŠãããã§ç§ãã¡ã¯è²¬ä»»ã®é åãåå²ããå¿ èŠããããšããçµè«ã«éããŸããã³ã³ããŒãã³ãã 1 ã€ããããã«èŠããŠããããã§ãã?ãããããããã¯ããã€ãã®å±€ã«åå²ãããã¹ãã§ããããããããç¹å®ã®æ©èœãæ åœããŸããã»ãšãã©ã®å Žåãããžã¥ã¢ã« ã¬ã€ã€ãŒã¯ã³ã³ããŒãã³ã ããžãã¯ããåãé¢ãããšãã§ããŸãã
ããŒããåå¥ã®ãšã³ãã£ãã£ã«åé¢ãããšãã³ã³ããŒãã³ãã®äœ¿ãããããåäžããŸããã©ã€ãã©ãªã«ãã¿ã³ãé 眮ããŠãå¿ èŠã«å¿ããŠãŠãŒã¶ãŒãç¬èªã®ããŒããäœæã§ããããã«ããããšãã§ããŸãããããã¯ã¯ãããžã§ã¯ãéã§ç°¡åã«ææ¢ãã§ããŸããããã«ãããã€ã³ã¿ãŒãã§ã€ã¹ã®äžè²«æ§ãç¶æããå ã®ã©ã€ãã©ãªãéè² è·ã«ããããšã¯ãããŸããã
ã¬ã€ã€ãŒãžã®åå²ãå®è£ ããããã®ããŸããŸãªãªãã·ã§ã³ããããŸããäžèšã®äŸã¯ HOC ã䜿çšããŠããŸããããåæãå¯èœã§ãããã ããããŒãã¯ã¹ã¿ã³ãã¢ãã³ã®ã³ã³ããŒãã³ãã§ã¯ãªããããããŒãã®å Žå㯠HOC ã®æ¹ãé©åã ãšæããŸãã
å¥ã®ã¬ã€ã€ãŒã«åã蟌ããã®ã¯ããžã¥ã¢ã«ã ãã§ã¯ãããŸããããã ããåé¡ã¯éåžžã«å šäœçãªãã®ã§ãããããHOC ãžã®ããžãã¹ ããžãã¯ã®è»¢éã«ã€ããŠè©³ããæ€èšããäºå®ã¯ãããŸãããç§ã®æèŠã§ã¯ãèªåãäœãããŠããã®ãããªããããå¿ èŠãªã®ããçè§£ããŠããã°ããããè¡ãããšãã§ããŸãã
è€åéšå
ããè€éãªã³ã³ããŒãã³ãã«ç§»ããŸããããSelect ãäŸãšããŠåãäžããåäžè²¬ä»»ã®ååã®äœ¿çšæ³ãèŠãŠã¿ãŸããããSelect ã¯ãããå°ããªã³ã³ããŒãã³ãã®æ§æãšèããããšãã§ããŸãã
- ã³ã³ãã - ä»ã®ã³ã³ããŒãã³ãéã®éä¿¡ã
- ãã£ãŒã«ã - éåžžã®éžæã®ããã¹ããšããŠãŒã¶ãŒãäœããå ¥åãã CobmoBox ã³ã³ããŒãã³ãã®å ¥åã
- ã¢ã€ã³ã³ - éžæçšã®ãã£ãŒã«ãã«ããåŸæ¥ã®ã¢ã€ã³ã³ã
- ã¡ãã¥ãŒã¯ãéžæé ç®ã®ãªã¹ãã衚瀺ããã³ã³ããŒãã³ãã§ãã
- ã¢ã€ãã ã¯ã¡ãã¥ãŒå ã®å¥ã®ã¢ã€ãã ã§ãã
åäžè²¬ä»»ã®ååã«æºæ ããã«ã¯ããã¹ãŠã®ãšã³ãã£ãã£ãåå¥ã®ã³ã³ããŒãã³ãã«åããå šå¡ãç·šéããçç±ã 1 ã€ã«ããå¿ èŠããããŸãããã¡ã€ã«ãã«ãããããšã次ã®è³ªåãçºçããŸããçµæãšããŠåŸãããã³ã³ããŒãã³ãã®ã»ãããã©ã®ããã«ã«ã¹ã¿ãã€ãºããã? ããšãã°ããã£ãŒã«ãã«æãããŒããèšå®ããå¿ èŠãããå Žåã¯ãã¢ã€ã³ã³ãæ¡å€§ããŠã¡ãã¥ãŒã®è²ã倿ŽããŸãããããå®çŸããã«ã¯ 2 ã€ã®æ¹æ³ããããŸãã
ãªãŒããŒã©ã€ã
æåã®æ¹æ³ã¯ç°¡åã§ãããã¹ããããã³ã³ããŒãã³ãã®ãã¹ãŠã®èšå®ãå ã®ã³ã³ããŒãã³ãã® props ã«ç§»åããŸãããã ãããœãªã¥ãŒã·ã§ã³ããæ£é¢ãããé©çšãããšãéžæã«ã¯éåžžã«å€ãã®å°éå ·ããããçè§£ãã«ããããšãããããŸããããããäœãšã䟿å©ã«æŽçããå¿ èŠããããŸããããã§ãªãŒããŒã©ã€ãã®åºçªã§ããããã¯ãã³ã³ããŒãã³ãã«è»¢éãããæ§æã§ãããåèŠçŽ ãã«ã¹ã¿ãã€ãºã§ããŸãã
<Select
...
overrides={{
Field: {
props: {theme: 'dark'}
},
Icon: {
props: {size: 'big'},
},
Menu: {
style: {backgroundColor: '#CCCCCC'}
},
}}
/>
props ããªãŒããŒã©ã€ãããç°¡åãªäŸã瀺ããŸããããã ãããªãŒããŒã©ã€ãã¯ã°ããŒãã«æ§æãšèããããšãã§ããŸããããã«ãããã³ã³ããŒãã³ãããµããŒããããã¹ãŠãæ§æãããŸãããããå®éã«ã©ã®ããã«æ©èœãããã¯ãBaseWebã©ã€ãã©ãªã§ç¢ºèªã§ããŸã ã
å šäœãšããŠããªãŒããŒã©ã€ãã䜿çšãããšãè€åã³ã³ããŒãã³ããæè»ã«ã«ã¹ã¿ãã€ãºã§ãããã®ã¢ãããŒããé©åã«æ¡åŒµã§ããŸããçæ: è€éãªã³ã³ããŒãã³ãã®æ§æã¯éåžžã«å€§ãããªãããªãŒããŒã©ã€ãã®åã«ã¯ãã€ãã¹é¢ããããŸããå éšã³ã³ããŒãã³ããå®å šã«å¶åŸ¡ã§ãããããå¥åŠãªããšãããããç¡å¹ãªèšå®ãå ¬éãããã§ããŸãããŸããã©ã€ãã©ãªã䜿çšããã«èªåã§ã¢ãããŒããå®è£ ãããå Žåã¯ãæ§æãçè§£ããããã«ã³ã³ããŒãã³ãã«æãããããããèªã¿åã£ãŠã³ã³ããŒãã³ããæ£ããæ§æããã©ãããŒãäœæããå¿ èŠããããŸãã
äŸåé¢ä¿é転ã®åå
æ§æããªãŒããŒã©ã€ãããä»£æ¿æ¡ãçè§£ããããã«ãSOLID ã®æå D ã«ç®ãåããŸãããããããäŸåé¢ä¿é転ã®ååã§ãã圌ã¯ãé«ã¬ãã«ã®ããªã·ãŒãå®è£ ããã³ãŒãã¯ãäœã¬ãã«ã®è©³çްãå®è£ ããã³ãŒãã«äŸåãã¹ãã§ã¯ãªããšäž»åŒµããŠããŸãã
éžæã«æ»ããŸããããã³ã³ããã¯ãã³ã³ããŒãã³ãã®ä»ã®éšåéã®éä¿¡ãæ åœããŸããå®éãæ®ãã®ãããã¯ã®ã¬ã³ããªã³ã°ãå¶åŸ¡ããã®ã¯ã«ãŒãã§ãããããè¡ãã«ã¯ãããããã€ã³ããŒãããå¿ èŠããããŸãã
äŸåé¢ä¿ã®å転ã䜿çšããªãå Žåãè€éãªã³ã³ããŒãã³ãã®ã«ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
import InputField from './InputField';
import Icon from './Icon';
import Menu from './Menu';
import Option from './Option';
ã³ã³ããŒãã³ãéã®äŸåé¢ä¿ãåæããŠãäœãåé¡ã«ãªãããçè§£ããŸããããããã§ãäžäœã¬ãã«ã® Select ã¯äžäœã¬ãã«ã® Menu ã«äŸåããŸããããã¯ãããèªäœãã€ã³ããŒãããããã§ããäŸåé¢ä¿é転ã®ååãç ŽãããŠããŸããããã«ããåé¡ãçºçããŸãã
- ãŸããã¡ãã¥ãŒã倿Žããå Žåã¯ãéžæãç·šéããå¿ èŠããããŸãã
- 次ã«ãå¥ã®ã¡ãã¥ãŒ ã³ã³ããŒãã³ãã䜿çšããå Žåã¯ãéžæã³ã³ããŒãã³ããç·šéããå¿ èŠããããŸãã
å¥ã®ã¡ãã¥ãŒã§éžæããå¿ èŠãããå Žåã¯ã©ãããã°ãããããããŸãã
äŸåé¢ä¿ãæ¡åŒµããå¿ èŠããããŸããã¡ãã¥ãŒã³ã³ããŒãã³ããéžæã«äŸåããããã«ããŸããäŸåé¢ä¿ã®å転ã¯äŸåé¢ä¿ã®æ¿å ¥ã«ãã£ãŠè¡ãããŸã - Select ã¯ããã©ã¡ãŒã¿ãŒã® 1 ã€ãšããŠã¡ãã¥ãŒ ã³ã³ããŒãã³ããåãå ¥ããå¿ èŠããããŸããããã§ã¿ã€ãã³ã°ã圹ã«ç«ã¡ãŸããSelect ãæåŸ ããŠããã³ã³ããŒãã³ãã瀺ããŸãã
// Select
const Select = ({
Menu: React.ComponentType<IMenu>
}) => {
return (
...
<Menu>
...
</Menu>
...
)
...
}
ããã¯ãå°éå ·ãç¹å®ã®ã€ã³ã¿ãŒãã§ãŒã¹ãæºããã¡ãã¥ãŒã³ã³ããŒãã³ããéžæã«å¿ èŠã§ããããšã宣èšããæ¹æ³ã§ããæ¬¡ã«ãDI ååãæç€ºããããã«ãç¢å°ãå察æ¹åãæããŸãã
ç¢å°ãå±éãããŠããŸãããããäŸåé¢ä¿é転ã®ä»çµã¿ã§ãã
äŸåé¢ä¿ã®åé¡ã¯è§£æ±ºããŸããããç³è¡£æ§æãšãã«ã㌠ããŒã«ã¯ããã§æè¿ããŸãã
æ¯åããã¹ãŠã®äŸåé¢ä¿ãã¬ã³ããªã³ã°å Žæã®ã³ã³ããŒãã³ãã«æå ¥ããã®ã¯é¢åã§ãã ãbem-react ã©ã€ãã©ãªã«ã¯äŸåé¢ä¿ã¬ãžã¹ããªãšæ§æããã»ã¹ããããŸãã圌ãã®å©ããåããŠãäŸåé¢ä¿ãšèšå®ãäžåºŠããã±ãŒãžåããã ãã§ãæ¢è£œã®ã³ã³ããŒãã³ãã䜿çšããããšãã§ããŸãã
import { compose } from '@bem-react/core'
import { withRegistry, Registry } from '@bem-react/di'
const selectRegistry = new Registry({ id: cnSelect() })
...
selectRegistry.fill({
'Trigger': Button,
'Popup': Popup,
'Menu': Menu,
'Icon': Icon,
})
const Select = compose(
...
withRegistry(selectRegistry),
)(SelectDesktop)
äžèšã®äŸã¯ãbem-react ã®äŸã䜿çšããã³ã³ããŒãã³ã ã¢ã»ã³ããªã®äžéšã瀺ããŠããŸããå®å šãªãµã³ãã« ã³ãŒããšãµã³ãããã¯ã¹ã¯ãyandex UIã¹ããŒãªãŒããã¯ã«ãã ãŸãã
äŸåé¢ä¿é転ã®äœ¿çšããäœãåŸãããŸãã?
- ãã« ã³ã³ãããŒã« - ã³ã³ããŒãã³ãã®ãã¹ãŠã®ã³ã³ããŒãã³ããã«ã¹ã¿ãã€ãºããèªç±ã
- æè»ãªã«ãã»ã«å - ã³ã³ããŒãã³ããéåžžã«æè»ã§å®å šã«ã«ã¹ã¿ãã€ãºã§ããããã«ããæ©èœãå¿ èŠã«å¿ããŠãéçºè ã¯ã³ã³ããŒãã³ããæ§æãããã¹ãŠã®ãããã¯ããªãŒããŒã©ã€ãããŠãå¿ èŠãªãã®ãååŸããŸãããã®å Žåãæ§ææžã¿ã®æ¢è£œã®ã³ã³ããŒãã³ããäœæãããªãã·ã§ã³ãåžžã«ãããŸãã
- ã¹ã±ãŒã©ããªã㣠- ãã®æ¹æ³ã¯ããããããµã€ãºã®ã©ã€ãã©ãªã«é©ããŠããŸãã
Yandex.Tutorial ã§ã¯ãDI ã䜿çšããŠç¬èªã®ã³ã³ããŒãã³ããäœæããŠããŸããå éšã® Lego ã³ã³ããŒãã³ã ã©ã€ãã©ãªããã®ã¢ãããŒããæ¡çšããŠããŸããããããããã«ã¯éå€§ãªæ¬ ç¹ã 1 ã€ãããŸããããã¯ãã¯ããã«è€éãªéçºã§ãã
åå©çšå¯èœãªã³ã³ããŒãã³ãã®éçºã®é£ãã
åå©çšå¯èœãªã³ã³ããŒãã³ããéçºããäžã§ã®é£ããã¯äœã§ãã?
ãŸããé·ããŠäžå¯§ãªãã¶ã€ã³ãã³ã³ããŒãã³ãã®æ§æéšåãšå€æŽå¯èœãªéšåãçè§£ããå¿ èŠããããŸãããã¹ãŠã®éšåã倿Žå¯èœã«ãããšãçè§£ããã®ãé£ãã倧éã®æœè±¡åã«ãªã£ãŠããŸããŸãã倿Žå¯èœãªããŒããå°ãªããããšãã³ã³ããŒãã³ãã®æè»æ§ãäžååã«ãªããŸããå°æ¥ã®åå©çšã®åé¡ãåé¿ããã«ã¯ãæ¹åããå¿ èŠããããŸãã
第äºã«ãã³ã³ããŒãã³ãã«å¯Ÿããé«ãèŠä»¶ãã³ã³ããŒãã³ããã©ã®éšåã§æ§æãããããçè§£ããŠããŸããæ¬¡ã«ããäºãã«ã€ããŠäœãç¥ããªããŠããäžç·ã«äœ¿çšã§ããããã«ããããäœæããå¿ èŠããããŸããåå©çšæ§ãèæ ®ããã«éçºãããããé£ããã§ãã
第äžã«ãåã®ãã€ã³ãã®çµæãšããŠã®è€éãªæ§é ãæ¬æ Œçãªã«ã¹ã¿ãã€ãºãå¿ èŠãªå Žåã¯ãã³ã³ããŒãã³ãã®ãã¹ãŠã®äŸåé¢ä¿ãåæ§ç¯ããå¿ èŠããããŸãããããè¡ãã«ã¯ããããã©ã®éšåã§æ§æãããŠããããæ·±ãçè§£ããå¿ èŠããããŸããããã»ã¹ã«ã¯ãåªããããã¥ã¡ã³ããäžå¯æ¬ ã§ãã
ãã¥ãŒããªã¢ã«ã«ã¯ãæè²ååŠãé 眮ãããŠããå éšã³ã³ããŒãã³ã ã©ã€ãã©ãªããããŸããããã¯ãåäŸãã¡ãåé¡ã解決ããéã«å¯Ÿè©±ããã€ã³ã¿ãŒãã§ãŒã¹ã®äžéšã§ãããããŠãæè²ãµãŒãã¹ã®å ±æã©ã€ãã©ãªããããŸããç°ãªããµãŒãã¹éã§åå©çšãããã³ã³ããŒãã³ããããã«çœ®ããŸãã
ãã§ã«åäœããã³ã³ããŒãã³ãããããæ°ããæ©èœã远å ããªãå Žåã1 äººã®æŽå士ã®è»¢éã«ã¯æ°é±éããããŸãããã®äœæ¥ã®ã»ãšãã©ã¯ãã³ã³ããŒãã³ããç¬ç«ãããã£ã³ã¯ã«åå²ããããããå ±æã§ããããã«ããããšã§ãã
ãªã¹ã³ãã®çœ®æåå
åã® 2 ã€ã®ååã¯äœããã¹ããã«é¢ãããã®ã§ãæåŸã® 2 ã€ã®ååã¯äœãå£ããŠã¯ãªããªããã«é¢ãããã®ã§ãã
ããŒãã©ã»ãªã¹ã³ãã®çœ®æåçããå§ããŸãããã圌ã¯ãããã°ã©ã å ã®ãªããžã§ã¯ãã¯ãããã°ã©ã ã®æ£ããå®è¡ãäžæããããšãªãããµãã¿ã€ãã®ã€ã³ã¹ã¿ã³ã¹ã«çœ®ãæããããã¹ãã ãšèšã£ãŠããŸãã
éåžžãã³ã³ããŒãã³ããã¯ã©ã¹ãšããŠäœæããããç¶æ¿ã䜿çšãããããããšã¯ãããŸããããã¹ãŠã®ã³ã³ããŒãã³ãã¯ãç®±ããåºããŠããã«äº€æã§ããŸãããããçŸä»£ã®ããã³ããšã³ãã®åºç€ã§ãã匷ãåä»ãã¯ãééããé¿ããäºææ§ãç¶æããã®ã«åœ¹ç«ã¡ãŸãã
ããã«äœ¿çšã§ãã亀æå¯èœæ§ã¯ã©ã®ããã«å£ããŸãã? ã³ã³ããŒãã³ãã«ã¯ API ããããŸããAPI ãšã¯ãã³ã³ããŒãã³ãã®äžé£ã®å°éå ·ãšããã¬ãŒã ã¯ãŒã¯ã«çµã¿èŸŒãŸããã¡ã«ããºã (ã€ãã³ã ãã³ãã©ãŒ ã¡ã«ããºã ãªã©) ãæå³ããŸããIDE ã§ã®åŒ·ãåä»ããš lint ã¯ãAPI ã®éäºææ§ã匷調ããããšãã§ããŸãããã³ã³ããŒãã³ãã¯å€éšãšå¯Ÿè©±ããAPI ããã€ãã¹ã§ããŸãã
- ã°ããŒãã« ã¹ãã¢ã«å¯ŸããŠäœããèªã¿æžãããã
- ãŠã£ã³ããŠãšå¯Ÿè©±ãã
- ã¯ãããŒãšã®å¯Ÿè©±ã
- ããŒã«ã«ã¹ãã¬ãŒãžã®èªã¿åã/æžã蟌ã¿ã
- ãããã¯ãŒã¯ã«ãªã¯ãšã¹ããéä¿¡ããŸãã
ã³ã³ããŒãã³ãã¯ç°å¢ã«äŸåããå¥ã®å Žæãå¥ã®ãããžã§ã¯ãã«ç§»åãããšå£ããå¯èœæ§ããããããããã¯ãã¹ãŠå®å šã§ã¯ãããŸããã
ãªã¹ã³ãã®çœ®æååã«æºæ ããã«ã¯ã次ã®ãã®ãå¿ èŠã§ãã
- ã¿ã€ãã³ã°æ©èœã䜿çšãã
- ã³ã³ããŒãã³ã API ããã€ãã¹ããçžäºäœçšãé¿ãã
- å¯äœçšãé¿ããã
é API ã€ã³ã¿ã©ã¯ã·ã§ã³ãåé¿ããæ¹æ³ã¯? ã³ã³ããŒãã³ããäŸåãããã¹ãŠã®ãã®ã API ã«å ¥ããå€ã®äžçããã®ããŒã¿ã props ã«è»¢éããã©ãããŒãäœæããŸããããšãã°ã次ã®ããã«:
const Component = () => {
/*
, , .
, .
, , .
*/
const {userName} = useStore();
// , ( , ).
const userToken = getFromCookie();
// â window .
const {taskList} = window.ssrData;
const handleTaskUpdate = () => {
// API . .
fetch(...)
}
return <div>{'...'}</div>;
};
/*
.
, .
*/
const Component2 = ({
userName, userToken, onTaskUpdate
}) => {
return <div>{'...'}</div>;
};
ã€ã³ã¿ãŒãã§ãŒã¹åé¢ã®åå
å€ãã®å°çšã€ã³ã¿ãŒãã§ã€ã¹ã¯ã1 ã€ã®æ±çšã€ã³ã¿ãŒãã§ã€ã¹ãããåªããŠããŸãããã®ååãããã³ããšã³ã ã³ã³ããŒãã³ãã«æç¢ºã«äŒããããšã¯ã§ããŸããã§ããããã®ãããAPI ã«æ³šæãæãå¿ èŠããããšçè§£ããŠããŸãã
ã§ããã ãå°ãªããšã³ãã£ãã£ãã³ã³ããŒãã³ãã«è»¢éããã³ã³ããŒãã³ãã§äœ¿çšãããŠããªãããŒã¿ã転éããªãããã«ããå¿ èŠããããŸããã³ã³ããŒãã³ãå ã®å€æ°ã® props ã¯æ³šæãå¿ èŠã§ããã»ãšãã©ã®å ŽåãSOLID ã®ååã«éåããŠããŸãã
ã©ãã§ã©ã®ããã«åå©çšããŸãã?
é«å質ã®ã³ã³ããŒãã³ããäœæããã®ã«åœ¹ç«ã€ååã«ã€ããŠèª¬æããŸãããæ¬¡ã«ãããããã©ãã§ã©ã®ããã«åå©çšããããèŠãŠã¿ãŸããããããã¯ãçºçããå¯èœæ§ã®ããä»ã®åé¡ãçè§£ããã®ã«åœ¹ç«ã¡ãŸãã
ã³ã³ããã¹ãã¯ç°ãªãå ŽåããããŸããåãããŒãžã®ä»ã®å Žæã§ã³ã³ããŒãã³ãã䜿çšããå¿ èŠãããå Žåããããšãã°ãä»ã®äŒç€Ÿã®ãããžã§ã¯ãã§ã³ã³ããŒãã³ããåå©çšãããå Žåãªã©ããããã¯ãŸã£ããç°ãªããã®ã§ããããã€ãã®ãªãã·ã§ã³ã匷調ããŸã
ããŸã åå©çšã¯å¿ èŠãããŸãããã³ã³ããŒãã³ããäœæããŸããããããã¯ç¹å®ã®ãã®ã§ãããä»ã®å Žæã§äœ¿çšããäºå®ã¯ãªããšèããŠããŸãã远å ã®åªåãããå¿ èŠã¯ãããŸããããŸããå ã«æ»ãããå Žåã«åœ¹ç«ã€ããã€ãã®ç°¡åãªæé ãå®è¡ã§ããŸãããããã£ãŠãããšãã°ãã³ã³ããŒãã³ããç°å¢ã«ããŸãçµã³ä»ããŠããªãããšãããã³äŸåé¢ä¿ãã©ãããããŠããããšã確èªã§ããŸããå°æ¥ã®ã«ã¹ã¿ãã€ãºã®ããã®äºçŽãããããšãã§ããŸã: ããŒãã远å ããããã³ã³ããŒãã³ãã®å€èгãå€éšãã倿Žããæ©èœ (ãã¿ã³ã®äŸã®ããã«) - æéã¯ããããŸããã
åããããžã§ã¯ãã§åå©çšããŸããã³ã³ããŒãã³ããäœæããçŸåšã®ãããžã§ã¯ãã®ä»ã®å Žæã§åå©çšããããšç¢ºä¿¡ããŠããŸããäžã«æžããããšã¯ãã¹ãŠããã«é¢é£ããŠããŸãä»ã«ãªã£ãŠåããŠãå€éšã©ãããŒã®ãã¹ãŠã®äŸåé¢ä¿ãåé€ããããšãäžå¯æ¬ ã§ãããå€éšããã«ã¹ã¿ãã€ãºã§ããããšãéåžžã«æãŸããã§ã (ããŒããŸãã¯ããã¯ã¹)ãã³ã³ããŒãã³ãã«å€ãã®ããžãã¯ãå«ãŸããŠããå Žåãã©ãã§ãå¿ èŠãã©ããããŸãã¯äžéšã®å Žæã§å€æŽããå¿ èŠããããã©ãããæ€èšããå¿ èŠããããŸãã 2 çªç®ã®ãªãã·ã§ã³ã«ã€ããŠã¯ãã«ã¹ã¿ãã€ãºã®å¯èœæ§ãèæ ®ããŠãã ãããããã§ã¯ãã³ã³ããŒãã³ãã®æ§é ã«ã€ããŠèããå¿ èŠã«å¿ããŠããŒãã«åå²ããããšãéèŠã§ãã
åæ§ã®ã¹ã¿ãã¯ã§åå©çšããŸããã³ã³ããŒãã³ãããèªåãšåãã¹ã¿ãã¯ãæã€é£æ¥ãããããžã§ã¯ãã§åœ¹ç«ã€ããšãçè§£ããŠããŸããããã¯ãäžèšã®ãã¹ãŠãå¿ é ã«ãªãå Žæã§ããããã«ãäŸåé¢ä¿ãšãã¯ãããžãŒãæ³šææ·±ãç£èŠããããšããå§ãããŸãã飿¥ãããããžã§ã¯ãã¯ãããªããšãŸã£ããåãããŒãžã§ã³ã®ã©ã€ãã©ãªã䜿çšããŠããŸãã? SASS ãš TypeScript ã¯åãããŒãžã§ã³ã䜿çšããŠããŸãã?
ãŸããSSR ãªã©ã®å¥ã®ã©ã³ã¿ã€ã ç°å¢ã§ã®åå©çšã«ã€ããŠã匷調ããããšæã ãŸããã³ã³ããŒãã³ãã SSR ã§ã¬ã³ããªã³ã°ã§ãããã©ããããŸãã¬ã³ããªã³ã°ã§ããå¿ èŠããããã©ãããæ±ºå®ããŸãããã®å Žåã¯ãäºåã«æåŸ ã©ããã«ã¬ã³ããªã³ã°ãããããšã確èªããŠãã ãããdeno ã GraalVM ãªã©ã®ä»ã®ã©ã³ã¿ã€ã ãããããšã«æ³šæããŠãã ããã䜿çšããå Žåã¯ããããã®æ©èœãèæ ®ããŠãã ããã
ã³ã³ããŒãã³ã ã©ã€ãã©ãª
ã³ã³ããŒãã³ããè€æ°ã®ãªããžããªããããžã§ã¯ãéã§åå©çšããå¿ èŠãããå Žåã¯ãã©ã€ãã©ãªã«ç§»åããå¿ èŠããããŸãã
ã¹ã¿ãã¯
ãããžã§ã¯ãã§äœ¿çšããããã¯ãããžãå¢ããã»ã©ãäºææ§ã®åé¡ã解決ããããšãé£ãããªããŸããåç©åãæžããããã¬ãŒã ã¯ãŒã¯ãèšèªãå€§èŠæš¡ãªã©ã€ãã©ãªã®ããŒãžã§ã³ãªã©ã䜿çšããããã¯ãããžãŒã®æ°ãæå°éã«æããã®ãæåã§ããæ¬åœã«å€ãã®ãã¯ãããžãŒãå¿ èŠã ãšçè§£ããã°ããããåãå ¥ããããšãåŠã°ãªããã°ãªããŸãããããšãã°ãWeb ã³ã³ããŒãã³ãäžã§ã©ãããŒã䜿çšãããããã¹ãŠãçŽç²ãª JS ã§åéããããã³ã³ããŒãã³ãã«ã¢ããã¿ãŒã䜿çšãããã§ããŸãã
ãµã€ãº
ã©ã€ãã©ãªã®åçŽãªã³ã³ããŒãã³ãã䜿çšãããšããã³ãã«ã«æ°ã¡ã¬ãã€ãã远å ãããå Žåãããã¯åé¡ãããŸããããã®ãããªã³ã³ããŒãã³ãã¯åå©çšããããããŸããããªããªããç¬èªã®è»œéããŒãžã§ã³ããŒãããäœæããå¯èœæ§ãæ£åœåãããããã§ãã size-limit ãªã©ã®ãµã€ãºå¶åŸ¡ããŒã«ã䜿çšããŠåé¡ã解決ã§ããŸãã
ã¢ãžã¥ãŒã«æ§ãå¿ããªãã§ãã ãããã³ã³ããŒãã³ãã䜿çšãããéçºè ã¯ããã¹ãŠã®ã©ã€ãã©ãª ã³ãŒãããããžã§ã¯ãã«ãã©ãã°ããã®ã§ã¯ãªããã³ã³ããŒãã³ãã ãã䜿çšã§ããããã«ããå¿ èŠããããŸãã
ã¢ãžã¥ã©ãŒ ã©ã€ãã©ãªã 1 ã€ã®ãã¡ã€ã«ã«ã³ã³ãã€ã«ãããŠããªãããšãéèŠã§ãããŸããã©ã€ãã©ãªã䜿çšãã JS ããŒãžã§ã³ã远跡ããå¿ èŠããããŸããES.NEXT ã§ã©ã€ãã©ãªããã«ãããES5 ã§ãããžã§ã¯ãããã«ããããšãåé¡ãçºçããŸãããŸããå€ãããŒãžã§ã³ã®ãã©ãŠã¶ãŒçšã«ã¢ã»ã³ããªãé©åã«æ§æãããã¹ãŠã®ã©ã€ãã©ãª ãŠãŒã¶ãŒããã®å 容ãçè§£ã§ããããã«ããå¿ èŠããããŸãããããè€éãããå Žåã¯ãå¥ã®æ¹æ³ããããŸã - åãããžã§ã¯ãã§ç¬èªã®ã©ã€ãã©ãªæ§ç¯ã«ãŒã«ãèšå®ããŸãã
æŽæ°
ã©ã€ãã©ãªãæŽæ°ããæ¹æ³ãäºåã«æ€èšããŠãã ããããã¹ãŠã®ã¯ã©ã€ã¢ã³ããšãã®ã«ã¹ã¿ã ã¹ã¯ãªãããç¥ã£ãŠãããšããã§ããããããã¯ãç§»è¡ãšç Žå£ç倿Žã«ã€ããŠããããèããã®ã«åœ¹ç«ã¡ãŸããããšãã°ãããªãã®ã©ã€ãã©ãªã䜿çšããŠããããŒã ã¯ããªãªãŒã¹åã«é倧ãªå€æŽã䌎ãã¡ãžã£ãŒ ã¢ããããŒãã«ã€ããŠç¥ãã®ã¯éåžžã«ã€ã©ã€ã©ããã§ãããã
ä»ã®èª°ãã䜿çšããŠããã©ã€ãã©ãªã«ã³ã³ããŒãã³ããç§»åãããšããªãã¡ã¯ã¿ãªã³ã°ã®ããããã倱ãããŸãããªãã¡ã¯ã¿ãªã³ã°ã®è² æ ã倧ãããªããªãããã«ãæ°ããã³ã³ããŒãã³ããã©ã€ãã©ãªã«ãã©ãã°ããªãããšããå§ãããŸãããããã¯å€æŽãããå¯èœæ§ãé«ããããäºææ§ã®æŽæ°ãšç¶æã«å€ãã®æéãè²»ããå¿ èŠããããŸãã
ã«ã¹ã¿ãã€ãºãšãã¶ã€ã³
ãã¶ã€ã³ã¯åå©çšæ§ã«åœ±é¿ããŸããããã«ã¹ã¿ãã€ãºã®éèŠãªéšåã§ããç§ãã¡ã®ãã¥ãŒããªã¢ã«ã§ã¯ãã³ã³ããŒãã³ãã¯ããèªäœã§ã¯ååšããããã®å€èгã¯ãã¶ã€ããŒã«ãã£ãŠèšèšãããŠããŸãããã¶ã€ããŒã«ã¯ãã¶ã€ã³ã·ã¹ãã ããããŸããã³ã³ããŒãã³ããã·ã¹ãã ãšãªããžããªã§ç°ãªã£ãŠèŠããå Žåãåé¡ãåé¿ããããšã¯ã§ããŸããããã¶ã€ããŒãšéçºè ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã®å€èгã«ã€ããŠåãèããæã£ãŠããªããããäžé©åãªæ±ºå®ã«ã€ãªããå¯èœæ§ããããŸãã
ã³ã³ããŒãã³ãã·ã§ãŒã±ãŒã¹
ã³ã³ããŒãã³ã ã·ã§ãŒã±ãŒã¹ã¯ããã¶ã€ããŒãšã®ããåããç°¡çŽ åããã®ã«åœ¹ç«ã¡ãŸãã人æ°ã®ããã·ã§ãŒã±ãŒã¹ ãœãªã¥ãŒã·ã§ã³ã® 1 ã€ã¯ Storybookã§ãããã®ããŒã«ãŸãã¯å¥ã®é©åãªããŒã«ã䜿çšããŠãéçºè 以å€ã®èª°ã«ã§ããããžã§ã¯ã ã³ã³ããŒãã³ããèŠããããšãã§ããŸãã
ã·ã§ãŒã±ãŒã¹ã«ã€ã³ã¿ã©ã¯ãã£ãæ©èœã远å ããŸã - ãã¶ã€ããŒã¯ã³ã³ããŒãã³ããæäœããããããã©ã®ããã«è¡šç€ºãããããŸããŸãªãã©ã¡ãŒã¿ãŒã§æ©èœãããã確èªã§ããå¿ èŠããããŸãã
ã³ã³ããŒãã³ããæŽæ°ãããšãã«ã¹ãã¢ããã³ããèªåçã«æŽæ°ãããããã«æ§æããããšãå¿ããªãã§ãã ããããããè¡ãã«ã¯ãããã»ã¹ã CI ã«ç§»åããå¿ èŠããããŸããããã§ãèšèšè ã¯ãããžã§ã¯ãã«å«ãŸããæ¢è£œã®ã³ã³ããŒãã³ãããã€ã§ã確èªããŠäœ¿çšã§ããŸãã
ãã¶ã€ã³ã·ã¹ãã
éçºè ã«ãšã£ãŠããã¶ã€ã³ ã·ã¹ãã ã¯ããããžã§ã¯ãå ã®ã³ã³ããŒãã³ãã®å€èгã管çããäžé£ã®ã«ãŒã«ã§ããã³ã³ããŒãã³ãã®åç©åã倧ãããªããªãããã«ããããã«ãã«ã¹ã¿ãã€ãºãå¶éããããšãã§ããŸãã
ãã 1 ã€ã®éèŠãªç¹ã¯ããããžã§ã¯ãå ã®èšèšã·ã¹ãã ãšã³ã³ããŒãã³ãã®ã¿ã€ããäºãã«ç°ãªãå Žåãããããšã§ããããšãã°ãå€§å¹ ãªåèšèšããããã³ãŒãå ã®ãã¹ãŠãæŽæ°ã§ããªãå Žåããã³ã³ããŒãã³ãã調æŽããå¿ èŠãããããèšèšã·ã¹ãã ã«å€æŽãå ããæéããªãå Žåãªã©ã§ãããã®ãããªå Žåãæ©äŒãããã°ããã«ãã¶ã€ã³ ã·ã¹ãã ãšãããžã§ã¯ããåæãããããšã¯ãããªãã®å©çã«ããã¶ã€ããŒã®å©çã«ããªããŸãã
æåŸã®æ®éçãã€æçœãªã¢ããã€ã¹ã¯ãã³ãã¥ãã±ãŒã·ã§ã³ãšäº€æžã§ãããã¶ã€ããŒãéçºã®åããã¬ã€ã¢ãŠãã®äœæã»ç·šéã®ã¿ãè¡ãè ãšããŠæããå¿ èŠã¯ãããŸããã圌ããšç·å¯ã«é£æºããããšã§ãé«å質ã®ã€ã³ã¿ãŒãã§ãŒã¹ãèšèšããã³å®è£ ããã®ã«åœ¹ç«ã¡ãŸããæçµçã«ãããã¯å ±éã®ç®çã«å©çãããããã補åã®ãŠãŒã¶ãŒãåã°ããŸãã
çµè«
ã³ãŒããéè€ãããšãéçºãå°é£ã«ãªããããã³ããšã³ãã®å質ãäœäžããŸããçµæãåé¿ããã«ã¯ãã³ã³ããŒãã³ãã®å質ãç£èŠããå¿ èŠããããSOLID ã®ååã¯é«å質ã®ã³ã³ããŒãã³ããäœæããã®ã«åœ¹ç«ã¡ãŸãã
çŸæç¹ã§åé¡ãè¿ éã«è§£æ±ºããã³ã³ããŒãã³ãããããå°æ¥ã«åããŠåªããã³ã³ããŒãã³ããäœæããæ¹ãã¯ããã«å°é£ã§ããåæã«ãåªãããã¬ã³ã¬ãã¯è§£æ±ºçã®äžéšã«éããŸãããã³ã³ããŒãã³ããã©ã€ãã©ãªã«æã¡èŸŒãå Žåã¯ããããã®æäœã䟿å©ã«ããå¿ èŠããããèšèšã·ã¹ãã ãšåæããå¿ èŠããããŸãã
ã芧ã®ãšãããã¿ã¹ã¯ã¯ç°¡åã§ã¯ãããŸãããé«å質ã®åå©çšå¯èœãªã³ã³ããŒãã³ããéçºããããšã¯é£ãããæéãããããŸãããã®äŸ¡å€ã¯ãããŸããïŒèª°ãããã®è³ªåã«èªåèªèº«ã§çãããšä¿¡ããŠããŸããå°èŠæš¡ãªãããžã§ã¯ãã®å ŽåããªãŒããŒããããéåžžã«é«ããªãå¯èœæ§ããããŸããé·æçãªéçºãèšç»ãããŠããªããããžã§ã¯ãã®å Žåãã³ãŒãã®åå©çšã«æè³ããããšãç©è°ãéžã決å®ã§ãããããããããã¯ä»ã¯å¿ èŠãªãããšèšã£ããšããŠããåå©çšå¯èœãªã³ã³ããŒãã³ããäžè¶³ããŠãããããçºçããªãã£ãå¯èœæ§ã®ããå€ãã®åé¡ãçºçããç¶æ³ã«é¥ã£ãŠããŸãããšã¯å®¹æã«èŠéããããŸããã ãããç§ãã¡ã®éã¡ãç¹°ãè¿ããªãã§ãèªåèªèº«ãç¹°ãè¿ããªãã§ãã ãã!
ã¬ããŒããèŠã