ããªããããã°ã©ããŒïŒãŸãã¯ããæªãã¢ãŒããã¯ãïŒã§ããå Žåããã®ãããªç°¡åãªè³ªåã«çããããšãã§ããŸãïŒãã¹ãäžå¯èœãªã³ãŒããæžãæ¹æ³ã¯ïŒ ããªãã¯ããã«ã€ããŠèããŸãããïŒ ãã¹ããããŠããªãã³ãŒããå®çŸããããã®å°ãªããšã3ã€ã®æ¹æ³ã«ã»ãšãã©ååãä»ããããªãå Žåã¯ããã®èšäºã圹ç«ã¡ãŸãã
å€ãã®äººãèšãã§ãããïŒãªãç§ã¯ãã¹ããããŠããªãã³ãŒããæžãããç¥ãå¿
èŠãããã®ã§ãããããªãã¯ç§ã«æªãããšãæãããã§ããïŒ ç§ã¯çããŸãïŒãã¹ããããŠããªãã³ãŒãã®å
žåçãªãã¿ãŒã³ãç¥ã£ãŠããã°ãããã§ããã°ããããžã§ã¯ãã§ããããç°¡åã«èŠãããšãã§ããŸãã ãããŠããåç¥ã®ããã«ãåé¡ã®èªèã¯ãã§ã«æ²»çãžã®éã®ååã§ãã ãã®èšäºã¯ããã®ãããªæ²»çãå®éã«ã©ã®ããã«è¡ããããã«ã€ããŠãçããŠããŸãã ç«ããé¡ãããŸãã
ãã®èšäºã§ã¯ç¹å®ã®ããã°ã©ãã³ã°èšèªã«çŠç¹ãåœãŠãããšã¯ããã以äžã¯ãã¹ãŠã®æç¶ãèšèªã«é¢é£ããŠããŸãã ããããç§ã«ãšã£ãŠã¯ããã®èšäºã¯åçãªã€ã³ã¿ãŒããªã¿ãŒèšèªã§ããã°ã©ã ãã人ã«ãšã£ãŠç¹ã«æçšã§ãããåä»ãã³ã³ãã€ã«èšèªã®éçºã«æ¬æ Œçãªçµéšã¯ãªãã£ãããã§ãã ãã®ã«ããŽãªã®éçºè
ã®ã³ââãŒãã§ã以äžã«èª¬æãããã¿ãŒã³ã«æãé »ç¹ã«æ°ã¥ããŸããã äŸã¯ãJavaãCïŒãããã³TypeScriptã«äŒŒãæ¬äŒŒã³ãŒãã«ãªããŸãã
ãã®èšäºã§ã¯ããã¹ãã®æžãæ¹ã®åé¡ã«ã€ããŠã¯è§ŠããŠããŸããã ãã®ããŒãã«é¢ããå€ãã®èšäºããããŸãã ã³ãŒããç°¡åãã€çŸãããã¹ãã§ããããã«ããããã®ã³ãŒãã®æžãæ¹ã®åé¡ãæ€èšããçµæãšããŠåŸããããã¹ãã¯ã·ã³ãã«ã§ä¿å®å¯èœã«ãªããŸãã ããã«ããã¹ããšããçšèªã¯çŸãããã¯ãªãŒã³ãªåäœãã¹ããæå³ããããŸããŸãªããã¯ãªãã§ãäŸåé¢ä¿ããªã³ã¶ãã©ã€ã§å€æŽããããã®è¿œå ã®ãããžãã¯ãã©ã€ãã©ãªãããã³ãã¹ãã®èªã¿åããšãµããŒããå°é£ã«ãããã®ä»ã®ããšãªãæžãããŠããŸãã ããã¯ãèšèã®æé«ã®æå³ã§ã®ãã¹ãã§ãã
ã¡ãã£ãšããå²åŠã ãã¹ããæžãã¹ãã§ããïŒ ç§ã®æèŠïŒéçºãããããžã§ã¯ããäœæããå Žåã¯ããã¹ãã ããå¿
èŠã§ãã ãã¹ããçŽæ¥çãªæ©èœãå®è¡ãããšããäºå®ïŒã³ãŒããèŠä»¶ã«æºæ ããŠãããã©ããã確èªã§ããïŒã«å ããŠãå¯äœçšãšããŠã¯ã©ã¹èšèšãããŸã£ããã«ãããŸãã ããã¯ããæ²ãã£ãããã¶ã€ã³ã®ã¯ã©ã¹ã§ã¯ãã¹ããèšè¿°ã§ããªãããã§ãããããã£ãŠããã¹ã容ææ§ãå®çŸããã«ã¯ãã¯ã©ã¹ããªãã¡ã¯ã¿ãªã³ã°ããå¿
èŠããããŸãã ãŸãã¯ãã³ãŒãã®åã«ãã¹ããèšè¿°ãããŠããå Žåãã¯ã©ã¹èšèšã¯ããã«çãŸããŸãã ãã¹ã察象ã®ã³ãŒãã¯åå©çšå¯èœã§ãããã¹ãã§åå©çšã§ããããã§ãã ãŸããåå©çšæ§ã¯é©åãªã¯ã©ã¹èšèšã®éèŠãªåºæºã§ãã ãŸãããã¹ãã¯ãå¿
ãããã§ã¯ãããŸãããããããããã¢ããªã±ãŒã·ã§ã³å
šäœã®ã¢ãŒããã¯ãã£ãæ¹åããŸãã 誰ããããææããããã«ãã¯ã©ã¹èšèšã¯ããã®ã¯ã©ã¹ãåäœãã¹ãã§ãã¹ãã§ããçšåºŠã«ããåªããŠããŸããã
ãã¹ããããã³ãŒãã®äž»ãªãã©ãŒã®ãªã¹ãïŒ
ç¥èãã€ãã³ã°
ç¥èã®æœåºã¯ãã¡ãœããã1ã€ã®åŒæ°ã»ãããå¿
èŠãšããããããçŽæ¥äœ¿çšãããä»ã®ãªããžã§ã¯ãã®æ€çŽ¢ã§ãããã®åŒæ°ããéžæããå§ãããšãã«çºçããŸãã å
žåçãªã·ããªãªïŒ
- ã¡ãœããã¯ãªããžã§ã¯ããè€æ°ã®ãã€ã³ãïŒãïŒã§ãŠã©ãŒã¯ããŸã
- ã¡ãœããã¯åŒæ°ãçŽæ¥äœ¿çšããŸããïŒä»ã®æ
å ±ãååŸããããã«äœ¿çšããŸãïŒ
ã¡ãœãããŸãã¯ã³ã³ã¹ãã©ã¯ã¿ãŒã«ã¯ãå®éã«åäœããããã«å¿
èŠãªãã®ãå¿
èŠã§ãã 圌ã¯ãããããçš®é¡ã®ä»äºãããªãããããããã¹ãŠãååŸ/èšç®ããæ¹æ³ãæ°ã«ããå¿
èŠã¯ãããŸããã äœæ¥ã«ã¯ãæäœéå¿
èŠãªåŒæ°ã®ã»ãããå¿
èŠã§ãã
人çã®äŸïŒåºã§è³Œå
¥ä»£éãæ¯æãããã«æ±ããããããäœãããŸããïŒè²¡åžãæž¡ããã¬ãžä¿èªèº«ããããããéãåãåãããã«ããŸããããããšããéãäžããŸããïŒ é¡æšã¯æããã ãšæããŸã-ã¬ãžä¿ã¯ãèšç®æ¹æ³ãå
¥åããããã«ããŠã©ã¬ããã®ã¯ã©ã¹ã§ã¯ãªããã¯ã©ã¹ã®ãéãå¿
èŠãšããã¹ãã§ãã
ããã€ãã®äŸãèŠãŠã¿ãŸãããã
åïŒãã¹ããããŠããªãã³ãŒãclass DiscountCard { DiscountCard(UserContext userContext) { this.user = userContext.getUser(); this.level = userContext.getLevel(); this.order = userContext.getOrder(); }
DiscountCardã¯userContextãçŽæ¥äœ¿çšããŸããã userContextã«ã¯åæåã®ããã«å€æ°ã®ãªããžã§ã¯ããå«ããããšãã§ããããããã¹ããäœæãã人ã¯ãDiscountCardã¯ã©ã¹ã®ããã€ã¹ã調ã¹ãŠãããã§æ¬åœã«å¿
èŠãªãªããžã§ã¯ããç解ããå¿
èŠããããŸãã ãããŠãããã¯äœãééã£ãããšãããæéãšãªã¹ã¯ã§ããããã®çµæããã¹ããäžæ£ç¢ºã«ãªãå¯èœæ§ããããŸãã æ¬åœã«å¿
èŠãªãã®ãDiscountCardã«èŠæ±ãããŸãããïŒ
åŸïŒãã¹ãã³ãŒã class DiscountCard { DiscountCard(User user, PlanLevel level, Order order) { this.user = user; this.level = level; this.order = order; }
ãã®äŸã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®äŸåé¢ä¿ãä¿åããæåãª
ServiceLocatorãã¿ãŒã³ãæå³çã«ç€ºããŠããŸãã ãã®ããããã®ãããªãã¿ãŒã³ã¯ã¢ã³ããã¿ãŒã³ãšèŠãªãããŸãã ãããé¿ããããã«ããŠãã ããã
ç¥èæœåºã®å¥ã®äŸãèããŠã¿ãŸãããã
åïŒãã¹ããããŠããªãã³ãŒã class SalesTaxCalculator { TaxTable taxTable; SalesTaxCalculator(TaxTable taxTable) { this.taxTable = taxTable; } float computeSalesTax(User user, Invoice invoice) {
ãã¹ãã§ã¯ãUserã¯ã©ã¹ãäœæããå¿
èŠããããŸãããããããã¯ã¢ãã¬ã¹ã®ã¿ãå¿
èŠã§ãã Invoiceã¯ã©ã¹ã«ã€ããŠãåãããšãèšããŸãã ç¹°ãè¿ããŸããããã¹ããæžãã人ãããSalesTaxCalculatorã³ãŒãããã¹ãã£ã³ãããŠãããã§æ¬åœã«å¿
èŠãªãã®ãèŠã€ãåºãå¿
èŠããããŸãã é¢åãªå Žæã
ãŸããSalesTaxCalculatorã¯ãUserã¯ã©ã¹ãšInvoiceã¯ã©ã¹ãæããªãå¥ã®ãããžã§ã¯ãã§åå©çšã§ããŸããã
åŸïŒãã¹ãã³ãŒã class SalesTaxCalculator { TaxTable taxTable; SalesTaxCalculator(TaxTable taxTable) { this.taxTable = taxTable; } float computeSalesTax(Address address, float amount) { return amount * taxTable.getTaxRate(address); } }
ããã§ãã¯ã©ã¹ã¯å¿
èŠãªãã®ã ããå¿
èŠãšãããã¹ãã¯ééçã«ãªããŸãã
ããžãã¹ã³ãŒãã®æ°ãããªãã¬ãŒã¿ãŒ
ããããããã®ãã¿ãŒã³ã«ã¯ããã¹ããããŠããªãã³ãŒããäœæããããã®éã¡ãã«ãäžããããšãã§ããŸãã
ç°¡åãªäŸãã解æãå§ããŸãããïŒ
åïŒãã¹ããããŠããªãã³ãŒã class House { Kitchen kitchen; Bedroom bedroom = new Bedroom(); House() { this.kitchen = new Kitchen(new Refrigerator()); }
ãã®ã³ãŒãã®ãã¹ãŠãæªãã§ãã Houseã¡ãœãããåŒã³åºããšããããã³ããããã«ãŒã ã®åŒã³åºããçºçããããããå¶åŸ¡ããªãããããã¹ãã§ããŸããã ããŒã¿ããŒã¹ãšéä¿¡ãããããããã¯ãŒã¯ã«ãªã¯ãšã¹ããéä¿¡ãããšããã¹ãã¯çµäºããŸãã ããªã¢ãŒãã£ãºã ã®å©ããåããŠããããã³ããããã«ãŒã ã亀æããããšã¯äžå¯èœã§ãããç§ãã¡ã®å®¶ã¯ç¹å®ã®ã¯ã©ã¹ã«å³å¯ã«çµã³ã€ããŠããŸãã ã³ãŒãããã¹ãå¯èœã«ããæ¹æ³ã¯ïŒ
åŸïŒãã¹ãã³ãŒã class House { Kitchen kitchen; Bedroom bedroom; House(Kitchen kitchen, Bedroom bedroom) { this.kitchen = kitchen; this.bedroom = bedroom; }
çŸåšãHouseã¯ã©ã¹ã§ã¯ããã¶ã€ããŒãä»äºã«å¿
èŠãªãã®ããã¹ãŠå¿
èŠãšããŠããŸãã ãããŠã圌ã¯ãããã©ãããæ¥ããæ°ã«ããŸããã ãã¹ãŠã®ããžãã¹ã¯ã©ã¹ã¯ããã®ã³ã³ã¹ãã©ã¯ã¿ã§äŸåé¢ä¿ã®æ¢è£œã®ã€ã³ã¹ã¿ã³ã¹ãå¿
èŠãšããå¿
èŠããããŸãããããäž»ãªååã§ãã
ããããèªè
ã®äžã«ã¯ããã¡ãã£ãšåŸ
ã£ãŠãã ããã ã³ã³ã¹ãã©ã¯ã¿ãŒã§ãã¹ãŠã®äŸåé¢ä¿ãèŠæ±ããå¿
èŠãããå Žåããæ·±ããåã¯ã©ã¹ïŒã¢ããªã±ãŒã·ã§ã³äŸåé¢ä¿ã°ã©ãã®æ·±ãã«ããã¯ã©ã¹ïŒãäœæããããã«ããã®ã¯ã©ã¹ã®ãã¹ãŠã®äŸåé¢ä¿ã芪ã¯ã©ã¹ãéããŠè»¢éããå¿
èŠããããŸãã ãããŠãããã¯ããäžäœãã¯ã©ã¹ïŒäŸåé¢ä¿ã°ã©ãã®å
é ã«è¿ãã¯ã©ã¹ïŒã®èšèšè
ãããããããã®ã®ã¯ã©ã¹ã¿ãŒã«å€ãããšããäºå®ã«ã€ãªãããŸãã äŸãšããŠãããã¯ã
æ°ããHouseãäœæããã¯ã©ã¹ããããã³ãšãããã«ãŒã ã®ã³ã³ã¹ãã©ã¯ã¿ãŒèªäœãèŠæ±ããå¿
èŠãããããšãæå³ããŸãã ãããããªã圌ã¯ãããã«ã€ããŠç¥ãå¿
èŠããããŸããïŒ ããã¯ãã³ã»ã³ã¹ã§ããã
ãã®æšè«ã«ã®ã¿1ã€ã®ééãããããŸãã äžèšã®ååã«åŸã£ãŠãHouseãäœæããã¯ã©ã¹ã¯ãŸã£ããäœæãã¹ãã§ã¯ãããŸããã çµå±ã®ãšãããååã«ããã°ã圌èªèº«ãèªåã«å¿ããŠäžé¢ãèŠæ±ããã¹ãã§ãã ããããæåŸã«ãHouseã¯ã©ã¹ã¯ã©ãããæ¥ãã®ã§ããããïŒ ã¢ããªã±ãŒã·ã§ã³ã®éå§æã«äœæãããŸãïŒããŠã¹ã®ã©ã€ãã¿ã€ã ãã¢ããªã±ãŒã·ã§ã³ã®ã©ã€ãã¿ã€ã ãšäžèŽããå ŽåïŒãŸãã¯å·¥å Žã«ãã£ãŠäœæãããŸãïŒããŠã¹ã®ã©ã€ãã¿ã€ã ãã¢ããªã±ãŒã·ã§ã³ã®ã©ã€ãã¿ã€ã ããçãå ŽåïŒïŒ
ã¯ã©ã¹ããŠã¹ã®äœæ class HouseFactory { House build() { Kitchen kitchen = new Kitchen(new Refrigerator()); Bedroom bedroom = new Bedroom(); return new House (kitchen, bedroom); } }
ããããåã³å察ãã人ãããŸãããã§ã¯ãã¯ã©ã¹ããšã«ãã¡ã¯ããªãäœæããã³ãŒãéã2åã«å¢ãããŸããïŒ ããã¯ãã³ã»ã³ã¹ã§ããã å®éã1ã€ã®ãã¡ã¯ããªãŒãåãã©ã€ãã¿ã€ã ãæã€ã¯ã©ã¹ãäœæããŠé¢é£ä»ããŸãã ãŸããå®éã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãåç¶æéã®ç°ãªã倧éã®ã³ãŒãã¯ãããŸããã ããšãã°ãããŸããŸãªã©ã€ãã¿ã€ã ã§åé¡ããããªããžã§ã¯ãã®ã¿ã€ããWebã¢ããªã±ãŒã·ã§ã³ã«ååšããããšãèããŠã¿ãŸãããã
- é·çããããªããžã§ã¯ãïŒã¢ããªã±ãŒã·ã§ã³ã®éå§æã«äœæãããïŒ
- ã»ãã·ã§ã³ãªããžã§ã¯ã
- ãªã¯ãšã¹ããªããžã§ã¯ã
- ãªã¯ãšã¹ãããã©ã€ãã¿ã€ã ãçããªããžã§ã¯ãã¯ãã£ãã«ãããŸãã
äžè¬çãªWebã¢ããªã±ãŒã·ã§ã³ã«ã¯4ã€ã®ãã¡ã¯ããªãŒãååã«ããããšãããããŸãã ãããã£ãŠãããããæããŠã¯ãããŸããïŒãããŠçµè«ãšããŠãå·¥å ŽããŸã£ããæžããªãæ¹æ³ã瀺ãããŸãïŒã
ãããã£ãŠã2ã€ã®ã°ã«ãŒãã®ã³ãŒããåºå¥ã§ããŸãã
- ããžãã¹ã³ãŒãã°ã«ãŒã
- ããã«ãŠã§ã¢ã°ã«ãŒã
ããžãã¹ã³ãŒã-ããžãã¹ããžãã¯ãåæ ããã³ãŒãã顧客ã®èŠä»¶ãå€åãããšå€æŽãããã³ãŒãã ããã¯ã³ãŒãã®äž»èŠãªã«ããŽãªã§ããããããã³ãŒããèšè¿°ããŠããçç±ã§ãã
ãã€ã³ãã£ã³ã°ã³ãŒã-ããžãã¹ã³ãŒããçžäºã«äœçšããäžç·ã«ãã€ã³ãã§ããããã«ããã³ãŒãã ãã³ãã£ã³ã°ã³ãŒãã«ã¯ããžãã¹ããžãã¯ã¯å«ãŸããŸããã ããã«ã¯ãå·¥å Žãã¢ããªã±ãŒã·ã§ã³ã®èµ·åãã€ã³ããããã³ãã®ä»ã®ã¿ã€ãã€ã³ããå«ãŸããŸãã ãªã³ã¯ã³ãŒãã«ã¯å€ãã®
æ°ããæŒç®åããããŸãã
ã³ãŒãã2ã€ã®ã°ã«ãŒãã«åå²ãããã®ã¢ãããŒãã«ãããã¢ããªã±ãŒã·ã§ã³ããžãã¯ãšã¢ããªã±ãŒã·ã§ã³ã®ãªããžã§ã¯ãã°ã©ãã®äœæãæ··åšãããããšãåé¿ã§ããŸãã ãããã£ãŠãåžžã«newæŒç®åã䜿çšãããšãã¯ãã³ãŒãã®ã°ã«ãŒãã§äœ¿çšãããã©ãããæ€èšããŠãã ããã
äŸå€ïŒ
newæŒç®åãããžãã¹ã³ãŒãã§äœ¿çšããŠãåäœãå«ãŸãªãã¹ãã¬ãŒãžãªããžã§ã¯ãïŒHashMapãArrayãªã©ïŒãäœæã§ããŸãã
次ã®äŸã®å¥ã®äžè¬çãªã±ãŒã¹ãæ€èšããŠãã ããã
åïŒãã¹ããããŠããªãã³ãŒã class DocumentActions { Network network; DocumentModel documentModel; DocumentActions(Network network, DocumentModel documentModel) {
åã¡ãœããã®DocumentActionsã¯ã©ã¹ã¯Revisionã¯ã©ã¹ãäœæãããã®ã¯ã©ã¹ã®å®è£
ãmokeeã«çœ®ãæããæ©èœã®ãã¹ãã奪ããŸãã ããã«æªãããšã«ãDocumentActionsã§ã¯ã䜿çšããªãã³ã³ã¹ãã©ã¯ã¿ãŒã®ã¯ã©ã¹ãå¿
èŠã§ãã ããããRevisionãäœæããããã«ãäºåã«ç¥ãããŠããªã3çªç®ã®åŒæ°textOffsetãæ¯åäžããå¿
èŠãããå Žåã¯ã©ãã§ããããïŒ çµäºïŒãªããžã§ã³ãäœæããæ¹æ³ã®ç¥èãåŒãç¶ãã¯ã©ã¹ãäœæããŸãã ãããŠãããã¯å·¥å Žã«éããŸããïŒ
åŸïŒãã¹ãã³ãŒã class DocumentActions { RevisionFactory revisionFactory; DocumentActions(RevisionFactory revisionFactory) { this.revisionFactory = revisionFactory; } changeTextStyle(int textOffset, TextStyle style) { Revision revision = this.revisionFactory.build(textOffset); revision.updateTextStyle(style); revision.apply(); } insertParagraph(int textOffset, ParagraphProps props, ParagraphStyle style) { Revision revision = this.revisionFactory.build(textOffset); revision.addParagraph(props); revision.updateParagraphStyle(style); revision.apply(); }
å·¥å Žã¯ããªããžã§ã³ãäœæããããã«NetworkãšDocumentModelã絶察ã«å¿
èŠã§ããããšãç¥ã£ãŠããŸãã ãããã£ãŠã圌女èªèº«ããããã®ã¯ã©ã¹ãèªåã§å¿
èŠãšããŸãã ãŸããRevisionãäœæããããã®ãã¹ãŠã®åçãã©ã¡ãŒã¿ãŒïŒtextOffsetïŒã¯ããã¡ã¯ããªãã«ãã¡ãœããã®åŒæ°ãšããŠå¿
èŠã«ãªããŸãã
å°æ¥ãRevisionã¯ã©ã¹ãã³ã³ã¹ãã©ã¯ã¿ãŒã«å¥ã®å®æ°åŒæ°ãå¿
èŠãšããå ŽåãRevisionFactoryããããã«ä¿®æ£ããããšã¯é£ãããªããDocumentActionsã¯ã©ã¹ã¯ãŸã£ããå€æŽãããŸããã
ã°ããŒãã«å€æ°ãšã·ã³ã°ã«ããŒã³
ã°ããŒãã«å€æ°ã¯æªã§ããããšã«èª°ããåæãããšæããŸãã ããããæ¬è³ªçã«ã¯ãã¹ãŠãåãã°ããŒãã«å€æ°ã§ããã«ãããããããå€ãã®äººã¯ã·ã³ã°ã«ãã³ã«åé¡ã¯ãããŸããã ã§ã¯ããªãã·ã³ã°ã«ãã³ãæªãã®ã§ããããïŒ ä»¥äžã«2ã€ã®çç±ã瀺ããŸãïŒãã ãããããã§ãååã§ãïŒã
1ïŒã·ã³ã°ã«ããŒã³ã䜿çšããå Žåã®åé¡ã¯ãã³ãŒãã«ç·å¯ãªæ¥ç¶æ§ãå°å
¥ãããããšã§ãã ã·ã³ã°ã«ãã³ãäœæãããšããã¯ã©ã¹ã¯ã·ã³ã°ã«ãã³ãæäŸããåäžã®å®è£
ã®ã¿ã§æ©èœãããšèšããŸãã 亀æããæ©äŒã¯ãããŸããã ãã¹ãã®æ§è³ªäžãå®è£
ãå¥ã®å®è£
ã«çœ®ãæããæ©èœãå¿
èŠãªãããã¯ã©ã¹ãã·ã³ã°ã«ãã³ããåé¢ããŠãã¹ãããããšã¯å°é£ã§ãã ãã®èšèšãå€æŽãããŸã§ãã¯ã©ã€ã¢ã³ãããã¹ãããããã«é©åã«åäœããããã«ã·ã³ã°ã«ãã³ã«é Œããªããã°ãªããŸããã
2ïŒã·ã³ã°ã«ãã³ãååšãããšããèŠããªããäŸåé¢ä¿ãäœæããããããã¯ã©ã¹ã®äŸåé¢ä¿ãåã«ãªããŸãã ã¯ã©ã¹ã®å®éã®äŸåé¢ä¿ãç解ããã«ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒ/ã¡ãœããã®äŸåé¢ä¿ã®ãªã¹ããèŠãã ãã§ãªãããã®ã³ãŒããå®å
šã«èªãå¿
èŠããããŸãã ãããŠé
ããæ©ãããããã¯ãã¹ããé ãããã°ããŒãã«ãªç¶æ
ãä»ããŠäºãã«åœ±é¿ãåãŒãå§ãããšããäºå®ã«ã€ãªãããŸãã
äž¡æ¹ã®åé¡ãããã«èª¬æããå®è·µã®äŸïŒWebã¢ããªã±ãŒã·ã§ã³ã§ã¯ããŠãŒã¶ãŒã¢ã¯ã·ã§ã³ããã°ã«èšé²ããå¿
èŠãçããŸããã ãã®ããã«ãå€ãã®ã¯ã©ã¹ã§äœ¿çšãããã·ã³ã°ã«ãã³ãäœæãããŸããã ã·ã³ã°ã«ãã³ãjQueryã䜿çšããŠDOMãã詳现æ
å ±ãååŸããããšã«èšåããŸãã ã¢ããªã±ãŒã·ã§ã³ã®ããŒãããŒãžã§ã³ã§ã¯ã©ã¹ã®äžéšãåå©çšããå¿
èŠããããŸã§ããã¹ãŠãããŸããããŸããã ãã®ããŒãžã§ã³ã¯ããã¹ãäžã«å®æçã«èœã¡å§ããŸããã ã·ã³ã°ã«ãã³ãã¬ãŒã䜿çšããã¯ã©ã¹ããã®ããŒãžã§ã³ã«ãªããããŒãã«DOMããªãããšãå€æããŸããã ãããã®ã¯ã©ã¹ã¯ãèŠããªããäŸåé¢ä¿ïŒçç±2ïŒã䜿çšããŠããŸããããã®çµæããã®ç¶æ³ãçºçããŸããã ãã¬ãŒãå¥ã®ãã¬ãŒã«çœ®ãæããæ©äŒã¯ãããŸããã§ããïŒçç±1ïŒããã®ãããäžéšã®ã¯ã©ã¹ãããçŽãå¿
èŠããããŸããã
ãæå³çã«ã·ã³ã°ã«ãã³ã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³å
šäœã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã1ã€ã ãã«ããããšèšã人ãããŸãã ãã ããã·ã³ã°ã«ãã³ãäœæããå Žåãã¢ããªã±ãŒã·ã§ã³å
šäœã§ã¯ãªããã³ãŒãå®è¡ã¹ããŒã¹å
šäœïŒJavaã®jvmãrhinoãŸãã¯V8ã®javascriptïŒã«åºæã®ã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã ã»ãšãã©ã®å Žåãã³ãŒãå®è¡ã¹ããŒã¹å
ã«ã¢ããªã±ãŒã·ã§ã³ã¯1ã€ãããªãããããã®ã¹ããŒã¹ã¯äžèŽããŠããããšãããããŸãã ããããããã¯ãã¹ãã®å Žåã§ã¯ãããŸããã åãã¹ãã¯ãä»ã®ãã¹ããšåãå®è¡ã¹ããŒã¹ã§å®è¡ãããã¢ããªã±ãŒã·ã§ã³ã®äžéšã§ãã
ããã¢ããªã±ãŒã·ã§ã³ã®å€ãã¯ãåäžã®ããããã®ãªãã·ã³ã°ã«ããŒã³ãååšãã1ã€ã®å®è¡ã¹ããŒã¹ã«äœã¿å§ããŸãã ããã¯ããã¹ããçžäºã«åœ±é¿ãåãŒãå§ãããšãã«ã·ã³ã°ã«ãã³ã®å¯äœçšãçŸããå Žæã§ãã
ããã«ããããããã€ãã¯ã1ã€ã®ã³ãŒãå®è¡ã¹ããŒã¹ã«ã¢ããªã±ãŒã·ã§ã³ãŸãã¯ãã®äžéšã®è€æ°ã®ã³ããŒãå¿
èŠã«ãªãã§ãããã ãã®å Žåãã¢ããªã±ãŒã·ã§ã³ã¹ããŒã¹ã¯ã³ãŒãå®è¡ã¹ããŒã¹ãšçãããªããŸããã ãããŠãã·ã³ã°ã«ãã³ãåãé€ã以å€ã«äœãããããšã¯ãããŸããã
ãã®äŸãèããŠã¿ãŸããããPhoneAccountã¯ã©ã¹ããã¹ãããããã«æ瀺ãããŸããPhoneAccountã¯ã©ã¹ã¯ãé»è©±ã¢ã«ãŠã³ãã®æäœãæ
åœããŸãã èãçŽãããšãªãã次ã®ããã«æžããŸãã
è©Šè¡1 PhoneAccount phoneAccount = new PhoneAccount('79008001020'); phoneAccount.addMoney(100); expect(phoneAccount.getBalance()).toBe(100);
ãã¹ããåç¬ã§å®è¡ããå®è¡æã«nullã¢ã¯ã»ã¹ãšã©ãŒãååŸããŸãã äœãæªãã£ãã®ã§ããïŒ ãã®ã¯ã©ã¹ãæžããååã«å°ããŸãã 圌ã¯é·ãéèããã·ã³ã°ã«ãã³ã¯ã©ã¹PhoneAccountTransactionProcessorãåæåããå¿
èŠãããããšãæãåºããŸãã ããªãã¯æãïŒããã®åã«ã©ã®ããã«æšæž¬ãã¹ãã ã£ãã®ãïŒã 次ã«ãè¿œå ããŸãïŒ
è©Šè¡2 PhoneAccountTransactionProcessor.init(...); PhoneAccount phoneAccount = new PhoneAccount('79008001020'); phoneAccount.addMoney(100); expect(phoneAccount.getBalance()).toBe(100);
ãã ããèµ·åæã«ãnullã¢ã¯ã»ã¹ãšã©ãŒãçºçããŸãã å°æããŠãããªãã¯åã³ååã«å°ããŸãïŒãç§ã¯äœãééã£ãŠããã®ã§ããïŒã ããã©ã³ã¶ã¯ã·ã§ã³ãã¥ãŒ-AccountTransactionQueueãåæåããŸãããïŒããšããçããåãåããŸãã å°ãã€ã©ã€ã©ããŠã³ãŒããè¿œå ããŸããããããã§åé¡ã¯çµããã§ã¯ãªãããçµéšã®ãããååããé¢ããªãããã«é Œãããšãã§ããŸãã
è©Šè¡3 AccountTransactionQueue.start(...); PhoneAccountTransactionProcessor.init(...); PhoneAccount phoneAccount = new PhoneAccount('79008001020'); phoneAccount.addMoney(100); expect(phoneAccount.getBalance()).toBe(100);
ãããŠãŸãééãã ãããã質åããæéãããåã«ãååãããã©ã³ã¶ã¯ã·ã§ã³ããŒã¿ããŒã¹ã«æ¥ç¶ããªãã£ãïŒã ããã«ãæ·±åŒåžãããŠãã ããïŒ
è©Šè¡4 TransactionsDataBase.connect(...) AccountTransactionQueue.start(...); PhoneAccountTransactionProcessor.init(...); PhoneAccount phoneAccount = new PhoneAccount('79008001020'); phoneAccount.addMoney(100); expect(phoneAccount.getBalance()).toBe(100);
æåŸã«ããã¹ãã«åæ ŒããŸãã
ããªãã¯ãã§ã«ãã®ã³ãŒãã®äœãåé¡ãªã®ããããçš®ã®é»éè¡ãç解ããŠãããšæããŸãã 3ã€ã®ã¯ã©ã¹ã¯äŸåé¢ä¿ã«ãããŸãããåæåã®é åºã¯ãŸãã«ããã§ããå¿
èŠããããŸãããã³ãŒãã¯ãã®é åºãæ£ç¢ºã«æ瀺ããŸããã
ããããã·ã³ã°ã«ããŒã³ããªããåã¯ã©ã¹ãã³ã³ã¹ãã©ã¯ã¿ãŒã§åäœããããã«å¿
èŠãªãã¹ãŠãå¿
èŠãšããå Žåã¯ã©ãã§ããããïŒ
æ£ããã³ãŒã TransactionsDataBase db = new TransactionsDataBase(...); AccountTransactionQueue transactionQueue; transactionQueue = new AccountTransactionQueue(db); PhoneAccountTransactionProcessor transactionProcessor; transactionProcessor = PhoneAccountTransactionProcessor(transactionQueue); PhoneAccount phoneAccount = new PhoneAccount('79008001020', transactionProcessor); phoneAccount.addMoney(100); expect(phoneAccount.getBalance()).toBe(100);
ä»ã§ã¯ãéæ³ãã¯ã©ã¹éã®ã³ãã¥ãã±ãŒã·ã§ã³ã®é ãããã£ã³ãã«ããããŸããã ããŒã ã®æ°ããã¡ã³ããŒã¯ããã¹ãŠã®äŸåé¢ä¿ãããã«ç¢ºèªã§ããããããã®ãããªãã¹ããç¬èªã«äœæã§ããŸãã ã³ãŒãèªäœãåæåã®é åºãæ瀺ãããããå¥ã®æ¹æ³ã§å®è¡ããããšã¯ã§ããŸããã å®éã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã¯ã©ã¹ã®åæåã§äœåè¡ãããå¯èœæ§ããããããããã¯å€§ããªãã©ã¹ã§ãã ãããŠãã1ã€ã®éèŠãªçµè«ïŒãã®ãããªã³ãŒãã§ã¯ãã¯ã©ã¹ã®ä»£ããã«nullãæž¡ãïŒå¯èœãªå ŽåïŒããã¯ã©ã¹ãmochã«çœ®ãæããããšãã§ããŸãã ã·ã³ã°ã«ãã³ã³ãŒãã§ã¯ãããã¯äžå¯èœã§ããã
å¥ã®äŸïŒ
åïŒãã¹ããããŠããªãã³ãŒã class LoginService { private static LoginService instance; private LoginService() {}; static LoginService getInstance() { if (instance == null) { instance = new RealLoginService(); } return instance; }
ã·ã³ã°ã«ãã³ãä¿®æ£ããŸãã
LoginServiceãç°¡åãã€ç°¡åã«çœ®ãæããããšãã§ããããã¹ãå°çšãã®ã¡ãœããã¯å¿
èŠãããŸããã
ã·ã³ã°ã«ãã³ãåŒãç¶ã䜿çšã§ããå Žåã®äŸå€ïŒ
- ã·ã³ã°ã«ãã³ã¯ãäžå€ãªããžã§ã¯ããã€ãŸããã¢ããªã±ãŒã·ã§ã³ã®åç¶æéãéããŠå€åããªããªããžã§ã¯ãã«äœ¿çšã§ããŸãã äŸïŒå®æ°èšå®
- ã·ã³ã°ã«ãã³ã¯ãæ
å ±ãæã€ãªããžã§ã¯ããã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããŠããªãå Žåã«äœ¿çšã§ããŸãã ããšãã°ããã¬ãŒãŸãã¯Googleã¢ããªãã£ã¯ã¹ã ã¢ããªã±ãŒã·ã§ã³ã¯æ
å ±ãæžã蟌ãã ãã§ãèªã¿åãããšã¯ã§ããŸããã ãã®ãããªã·ã³ã°ã«ããŒã³ã¯ã°ããŒãã«ãªç¶æ
ãæããªãããã«èŠãããããã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠå®å
šã§ããããã¯ã©ããžããã€ãã«éããŸããã ãã ãããã®ã³ã°ãå®éã«è¡ãããŠããããšããã¹ãããå¿
èŠãããå Žåã¯ãäŸåé¢ä¿ãå€æŽãããã¬ãŒãã³ã³ã¹ãã©ã¯ã¿ãŒã«äžããå¿
èŠããããŸãã
ãŸããäžéšã®ã·ã¹ãã ãªããžã§ã¯ãã«ã¯ã
math.randomã
new DateïŒïŒãªã©ã®é衚瀺ã®ã°ããŒãã«å€æ°ããããŸãã ãã®ãããªãªããžã§ã¯ãã䜿çšããã¯ã©ã¹ããã¹ãããå Žåã¯ããããã眮ãæããããã«ç¬èªã®ã©ãããŒãäœæããå¿
èŠããããŸãã
ããã©ã³ã®ã³ã³ã¹ãã©ã¯ã¿ãŒ
ããã©ã³ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãã¯ã©ã¹ã®ãã£ãŒã«ããåæåãã以å€ã®ããšãè¡ãã³ã³ã¹ãã©ã¯ã¿ãŒã§ãã å³å¯ã«èšãã°ããã¶ã€ããŒã¯ã¯ã©ã¹ã®ãã£ãŒã«ããåæåããããšã®ã¿ã«è²¬ä»»ãããããã®ä»ã®äœæ¥ã¯åäžè²¬ä»»ååã«éåããŸãã ã³ã³ã¹ãã©ã¯ã¿ãŒã§ã®ãã®ãããªãäœåãªãäœæ¥ã¯ããã¹ãããã¹ãããã¯ã©ã¹ã«äŸåæ§ã¹ã¿ããæž¡ãããšãã§ããªãããããã¹ããå°é£ã«ããŸãã çç·Žãããã¶ã€ããŒã®å
žåçãªãã¿ãŒã³ã¯æ¬¡ã®ãšããã§ãã
æåŸã®3ã€ã®ãã¿ãŒã³ã¯ãèšèšè
ã ãã§ãªããäžèšã®äžè¬çãªã±ãŒã¹ã§èæ
®ãããç¹åŸŽçãªãã®ã§ãã
ã³ã³ã¹ãã©ã¯ã¿ãŒåŒæ°ã®åæå
åïŒãã¹ããããŠããªãã³ãŒã class Metro { TicketPrices ticketPrices; Metro(TicketPrices ticketPrices) { this.ticketPrices = ticketPrices; ticketPrices.setCostCalculator(new MoscowCostCalculatorWithVerySlowConstructor()); } }
Metroã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãã®çŸ©åãæãããŸãã-åŒæ°ãåæåããŸãã ãã®ã³ãŒãã¯å€ãã®çç±ã§æªãã§ããããã¹ãå¯èœæ§ã«èå³ããããŸãã åæåãé
ãå ŽåãMetroã§ã®ãã¹ãŠã®ãã¹ãã«æéãããããŸãã
åŸïŒãã¹ãã³ãŒã class Metro { TicketPrices ticketPrices; Metro(TicketPrices ticketPrices) { this.ticketPrices = ticketPrices; } } class TicketPricesFactory { TicketPrices build() { TicketPrices ticketPrices = new TicketPrices(); ticketPrices.setCostCalculator(new VerySlowMoscowCostCalculator()); return ticketPrices; } }
ããã§ããã¹ãã§ã¯ããã¹ãã«å¿
èŠã®ãªãã¯ã©ã¹ãäœæã§ããªããªãããããŒã«çœ®ãæããããŸãã TicketPricesã®äœæãšåæåã®ããžãã¯ã¯ããã¡ã¯ããªãŒã«ç§»è¡ããŸããã
æ¡ä»¶ãšãµã€ã¯ã«
åïŒãã¹ããããŠããªãã³ãŒã class Car { IEngine engine; Car() { if (FLAG_ENGINE.get()){ this.engine = new V8Engine(); } else { this.engine = new V12Engine(); } } }
ãã¹ãã¯ç¹å®ã®ãã©ã°ã«é¢é£ä»ããããŠããŸãã å
éšçã«ã2ã€ã®ãšã³ãžã³ãªãã·ã§ã³ã®ã¿ããã¹ãã§ããŸãã
: class Car { IEngine engine; Car(IEngine engine) { this.engine = engine; } } class EngineFactory { IEngine build(boolean isV8) { if (isV8){ return new V8Engine(); } else { return new V12Engine(); } } }
åïŒãã¹ããããŠããªãã³ãŒã class Voicemail { User user; private List<Call> calls; Voicemail(User user) { this.user = user; } init(Server server) { this.calls = server.getCallsFor(this.user); }
init, , . init , calls init. , , . . â . . init. , init, initialize, setup , . Voicemail (server.getCallsFor). Voicemail:
: class Voicemail { List<Call> calls; Voicemail(List<Call> calls) { this.calls = calls; }
ãããã«
, ( new , ), ,
Dependency Injection .
IoC , â (), . IoC . IoC â .
, IoC ( ), , Dependency Injection. , .
, . ( ), ( «» angular
Miško Hevery ), .