ãã®ç©èªã¯ããã§ãŒã³ãœãŒã®ä»£ããã«é¢æ°åããã°ã©ãã³ã°ã䜿çšããŠãããªãã¿ã®ããã«èŠãããããããŸããã åé¡ã¯å®å šã«æ°ããããã°ã©ãã³ã°ãã©ãã€ã ã§ãããæ°ããèšèªãåŠã¶ããšã§ã¯ãããŸããã ããã«ãèšèªã®æ§æã¯åãªã詳现ã§ãã å šäœã®åŸ®åŠãã¯ãç°ãªãèãæ¹ãåŠã¶ããšã§ãã ãããç§ãããã«ãã©ãçããçç±ã§ã-ãã§ãŒã³ãœãŒãšã³ãžã³ãšãæ©èœçãªãããã°ã©ããŒã
æ©èœçæèãžããããã ãã®ã·ãªãŒãºã¯ãé¢æ°åããã°ã©ãã³ã°ã®äž»é¡ãæ¢æ±ããŸãããé¢æ°åèšèªãèšè¿°ãããšããæä»çãªæšåã¯æã¡ãŸããã åŸã§èª¬æããããã«ãæ©èœçãªã¹ã¿ã€ã«ã§ã³ãŒããèšè¿°ããããšã¯ãèšèšã劥åãããŸããŸãªåå©çšå¯èœãªã³ãŒãã«é¢ä¿ããä»ã®æšæž¬ã®åºç€ãšããŠæ©èœããŸãã å¯èœãªéããJavaïŒãŸãã¯Javaã«è¿ãèšèªïŒã®é¢æ°åããã°ã©ãã³ã°ã®æŠå¿µã瀺ããä»ã®èšèªã«ç§»åããŠãçŸåšJavaã§ã¯å©çšã§ããªãå¯èœæ§ã匷調ããŠã¿ãŸãã ç§ã¯ãžã£ã³ã°ã«ã«ããã«ã¯å ¥ããŸããããã¢ããã®ãããªããªãçããããšã«ã€ããŠè©±ããŸãã ããã©ããããç§ã¯åŸã ã«ããªããæ°ããèãæ¹ã§å°ããŸãã
ãã®ããŒããšä»¥äžã®ããã€ãã®ããŒãã¯ãåºæ¬çãªæŠå¿µãå«ãé¢æ°åããã°ã©ãã³ã°ã«é¢é£ããäž»é¡ã®ã¯ã€ãã¯ãã¢ãŒãšããŠæ©èœããŸãã ãããã®æŠå¿µã®äžéšã«ã€ããŠã¯ã以äžã§ããã«è©³ãã説æããŸãããã·ãªãŒãºå šäœã§ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ããåŸã ã«æ¡åŒµããŠãããŸãã ãã¢ãŒã®åºçºç¹ãšããŠãåé¡ã®è§£æ±ºçã®2ã€ã®ç°ãªãå®è£ ã玹ä»ããŸãã 1ã€ã¯åœä»€åã¹ã¿ã€ã«ã§èšè¿°ããããã1ã€ã¯ããã€ãã®æ©èœçç¹åŸŽãåããŠããŸãã
çªå·åé¡å
ããŸããŸãªã¹ã¿ã€ã«ã®ããã°ã©ãã³ã°ã«ã€ããŠäŒè©±ãå§ããã«ã¯ãæ¯èŒããã³ãŒããå¿ èŠã§ãã æåã®äŸãšããŠã1ã€ã®åé¡ã®ããªãšãŒã·ã§ã³ã瀺ããŸããããã«ã€ããŠã¯ãç§ã®èæžãçç£çããã°ã©ã㌠ããšã ãã¹ãé§åèšèšã® 第1éšãšç¬¬2éšã§èª¬æããŠããŸãã ãããã®2ã€ã®åºçç©ã§ã¯éåžžã«æ·±ãèããããŠãããããå°ãªããšããã®ã³ãŒããéžæããŸããã ãããã®èšäºã§ç§°è³ããããã¶ã€ã³ã«ã¯äœãåé¡ã¯ãããŸããããå¥ã®ã¢ãããŒãã®åççãªæ£åœæ§ã以äžã«ç€ºããŸãã
èŠä»¶ã®æ¬è³ªã¯ãæ£æ°ã1ãè¶ ããå ¥åã«å°éããå Žåããããå®å š ïŒå®å šïŒã è±å¯ ïŒéå°ïŒããŸãã¯äžè¶³ ïŒäžååïŒã«åé¡ããå¿ èŠããããšããããšã§ãã å®å šãªæ°ãšã¯ããã®é€æ°ïŒé€æ°ãšããŠã®åœŒèªèº«ãé€ãïŒãåèšã§åœŒã«çãããã®ã§ãã åæ§ã«ãéå°ãªæ°ã®çŽæ°ã®åèšã¯èªåãã倧ãããäžååãªæ°ã¯å°ãªããªããŸãã
åœä»€åçªå·åé¡åš
äžèšã®èŠä»¶ãæºããå¿ é ã¯ã©ã¹ã以äžã«ç€ºããŸãã
ãªã¹ã1. NumberClassifierãåé¡ã®å¿ é 解決ç
public class Classifier6 { private Set<Integer> _factors; private int _number; public Classifier6(int number) { if (number < 1) throw new InvalidNumberException( "Can't classify negative numbers"); _number = number; _factors = new HashSet<Integer>>(); _factors.add(1); _factors.add(_number); } private boolean isFactor(int factor) { return _number % factor == 0; } public Set<Integer> getFactors() { return _factors; } private void calculateFactors() { for (int i = 1; i <= sqrt(_number) + 1; i++) if (isFactor(i)) addFactor(i); } private void addFactor(int factor) { _factors.add(factor); _factors.add(_number / factor); } private int sumOfFactors() { calculateFactors(); int sum = 0; for (int i : _factors) sum += i; return sum; } public boolean isPerfect() { return sumOfFactors() - _number == _number; } public boolean isAbundant() { return sumOfFactors() - _number > _number; } public boolean isDeficient() { return sumOfFactors() - _number < _number; } public static boolean isPerfect(int number) { return new Classifier6(number).isPerfect(); } }
ãã®ã³ãŒãã§æ³šæãã¹ãããã€ãã®ãã€ã³ãïŒ
- ãŠããããã¹ãã®å€§èŠæš¡ãªã»ãããå¿ èŠã§ãïŒTDDã®åŽé¢ã§ã®è°è«ã®ããã«ãããæžãããšããäºå®ã®ããïŒ
- ã¯ã©ã¹ã¯å€æ°ã®é¢é£ã¡ãœããã§æ§æããããã®åœ¢åŒã§ã¯TDDã§äœ¿çšããããã®å¯äœçšã§ã
- ããã©ãŒãã³ã¹æé©åã®çµã¿èŸŒã¿calculateFactorsïŒïŒã¡ãœããã ãã®ã¯ã©ã¹ã®æ¬è³ªã¯ãé€æ°ããŸãšããŠæçµçã«åé¡ããããã®é€æ°ã®ã³ã¬ã¯ã·ã§ã³ã§ãã é€æ°ã¯ãã€ã§ããã¢ã«ã§ããŸãã ããšãã°ãå ¥åçªå·ã16ã®å Žåãé€æ°2ã決å®ãããšãã2 * 8 = 16ãªã®ã§8ã䜿çšããŸãã é€æ°ããã¢ã§åéããå Žåãåé¡ã®æ°å€ã®å¹³æ¹æ ¹ãæ§æããé€æ°ã確èªããå¿ èŠããããŸããããã¯ã calculateFactorsïŒïŒã¡ãœãããè¡ãããšãšãŸã£ããåãã§ãã
ïŒããå°ãïŒæ©èœçãªåé¡åš
åãTDDææ³ã䜿çšããŠãåé¡åã®ä»£æ¿ããŒãžã§ã³ãäœæããŸããïŒãªã¹ã2ãåç §ïŒã
ãªã¹ã2.å°ãæ©èœçãªæ°å€åé¡å
public class NumberClassifier { static public boolean isFactor(int number, int potential_factor) { return number % potential_factor == 0; } static public Set<Integer> factors(int number) { HashSet<Integer> factors = new HashSet<Integer>(); for (int i = 1; i <= sqrt(number); i++) if (isFactor(number, i)) { factors.add(i); factors.add(number / i); } return factors; } static public int sum(Set<Integer> factors) { Iterator it = factors.iterator(); int sum = 0; while (it.hasNext()) sum += (Integer) it.next(); return sum; } static public boolean isPerfect(int number) { return sum(factors(number)) - number == number; } static public boolean isAbundant(int number) { return sum(factors(number)) - number > number; } static public boolean isDeficient(int number) { return sum(factors(number)) - number < number; } }
åé¡åšã®2ã€ã®ããŒãžã§ã³ã®éãã¯ã»ãšãã©èªèã§ããŸããããéåžžã«éèŠã§ãã äž»ãªéãã¯ãã³ãŒãããå ±æç¶æ ãæå³çã«åé€ããããšã§ãã ãããåãé€ãããšã¯ãé¢æ°åããã°ã©ãã³ã°ã®éèŠãªæ©èœã®1ã€ã§ãã ã¡ãœããéã§ç¶æ ãäžéçµæã®åœ¢ã§åå²ãã代ããã«ïŒãªã¹ã1ã®ããã¡ã¯ã¿ãŒããã£ãŒã«ãïŒãã¡ãœãããçŽæ¥åŒã³åºããŸããããã«ããããããåãé€ãããšãã§ããŸãã èšèšã®èŠ³ç¹ããã¯ã factorsïŒïŒã¡ãœããã¯é·ããªããŸãããfactorsãã£ãŒã«ããã¡ãœããããæŒããã®ãé²ããŸãã ãŸãã2çªç®ã®ããŒãžã§ã³ãéçã¡ãœããã®ã¿ã§æ§æãããŠããããšã«ã泚æããŠãã ããã ã¡ãœããããšã«å€æ°ã环ç©ããããšã¯ãããŸãããããã«ããã ã¹ã³ãŒãã³ã°ã«ããã«ãã»ã«åã®å¿ èŠæ§ãåãé€ãããšãã§ããŸã ã å¿ èŠãªã¿ã€ãã®ãã©ã¡ãŒã¿ãŒãå ¥åã«éä¿¡ãããšããããã®ã¡ãœããã¯ãã¹ãŠæ£åžžã«æ©èœããŸãã ïŒããã¯çŽç²ãªé¢æ°ã®äŸã§ããã次ã®ããŒãã§èª¬æããæŠå¿µã§ãïŒã
æ©èœ
é¢æ°åããã°ã©ãã³ã°ã¯ãã³ã³ãã¥ãŒã¿ãŒãµã€ãšã³ã¹ã§åºãæ¥éã«çºå±ããŠããåéã§ãããé¢å¿ãé«ãŸã£ãŠããŸãã JVMã«ã¯æ°ããæ©èœèšèªïŒScalaãClojureãªã©ïŒãšãã¬ãŒã ã¯ãŒã¯ïŒFunctional JavaãŸãã¯AkkaïŒãããããšã©ãŒã®çºçãå°ãªããçç£æ§ãé«ããèªã¿ããããé åœã倧ãããªã©ã®èšè¿°ããããŸãã é¢æ°åããã°ã©ãã³ã°ã®äž»é¡å šäœãããã«åãäžããã®ã§ã¯ãªããããã€ãã®éèŠãªæŠå¿µã«çŠç¹ãåœãŠãèå³æ·±ãçµè«ã§ã¹ããŒãªãŒãå®æãããŸãã
é¢æ°åããã°ã©ãã³ã°ã®äžå¿ã«ã¯é¢æ°ïŒãã©ã ããŒã«ãµãŠã³ãïŒããããã¯ã©ã¹ãšåæ§ã«ããªããžã§ã¯ãæåããã°ã©ãã³ã°ïŒOOPïŒã®äž»èŠãªæœè±¡åã§ãã é¢æ°ã¯åŠçã®ããã®ããã«ãã£ã³ã°ãããã¯ãã圢æããåŸæ¥ã®åœä»€åèšèªã«ã¯ãªãããã€ãã®æ©èœãåããŠããŸãã
é«éé¢æ°
é«éé¢æ°ã¯ãä»ã®é¢æ°ãåŒæ°ãšããŠäœ¿çšããçµæãšããŠè¿ãããšãã§ããŸãã Javaã«ã¯ãã®ãããªæ§é ã¯ãããŸããã æãè¿ãæ¹æ³ã¯ãå®è¡ã«å¿ èŠãªã¡ãœããã®ã©ãããŒãšããŠã¯ã©ã¹ïŒéåžžã¯å¿åã¯ã©ã¹ïŒã䜿çšããããšã§ãã Javaã«ã¯ã¹ã¿ã³ãã¢ãã³ã®é¢æ°ïŒãŸãã¯ã¡ãœããïŒããªããããä»ã®ãŠãŒã¶ãŒããè¿ããããããã©ã¡ãŒã¿ãŒãšããŠæž¡ããããããããšã¯ã§ããŸããã
ãã®æ©èœã¯ãå°ãªããšã2ã€ã®çç±ã§é¢æ°åèšèªã§ã¯éèŠã§ãã ãŸããé«éé¢æ°ã䜿çšããæ©èœã«ãããèšèªã®äžéšãã©ã®ããã«å ±æãããããæšæž¬ã§ããŸãã ããšãã°ããªã¹ãããã€ãã¹ããŠåèŠçŽ ã«1ã€ä»¥äžã®é«æ¬¡é¢æ°ãé©çšããå ±éã®ã¡ã«ããºã ãæ§ç¯ããããšã«ãããã¯ã©ã¹éå±€å ã®ã¡ãœããã®ãã¹ãŠã®ã«ããŽãªãåãé€ãããšãã§ããŸãã ïŒãã®ãããªæ§é ã®äŸãããã«ç€ºããŸããïŒæ¬¡ã«ãé¢æ°ãæ»ãå€ãšããŠäœ¿çšããæ©èœã«ãããéåžžã«åçã§é©å¿å¯èœãªã·ã¹ãã ãæ§ç¯ããããã®åªããæ©äŒãäœæããŸãã
é«éé¢æ°ã䜿çšããŠè§£æ±ºãããåé¡ã¯ãé¢æ°åèšèªã«åºæã®ãã®ã§ã¯ãããŸããã ãã ãããæ©èœçã«ãèãå§ãããšãåé¡ã解決ããã¢ãããŒããç°ãªããŸãã ããŒã¿ãžã®å®å šãªã¢ã¯ã»ã¹ãæäŸãããªã¹ã3ã®ã¡ãœããã®äŸïŒãã倧ããªã³ãŒãããåŒãæãããïŒã«æ³šç®ããŠãã ããã
ãªã¹ã3.åå©çšå¯èœãªã³ãŒããã³ãã¬ãŒã
public void addOrderFrom(ShoppingCart cart, String userName, Order order) throws Exception { setupDataInfrastructure(); try { add(order, userKeyBasedOn(userName)); addLineItemsFrom(cart, order.getOrderKey()); completeTransaction(); } catch (Exception condition) { rollbackTransaction(); throw condition; } finally { cleanUp(); } }
ãªã¹ã3ã®ã³ãŒãã«ã¯åæåãå«ãŸããäœããã®äœæ¥ãè¡ããæåããå Žåã¯ãã©ã³ã¶ã¯ã·ã§ã³ãå®äºããŸããããã§ãªãå Žåã¯ãããŒã«ããã¯ããŠãªãœãŒã¹ã解æŸããŸãã ãã¡ããããã®ã³ãŒãã®ãã³ãã¬ãŒãéšåã¯åå©çšã§ããŸãããååãšããŠãæ§é ãäœæããããšã§OOPã§ãããå®è£ ããŸãã ç§ãã¡ã®å Žåã2ã€ã®ã ã®ã£ã³ã°ã®4ã€ã®ãã¶ã€ã³ãã¿ãŒã³ ããã¿ãŒã³ãçµã¿åãããŸãã ãã³ãã¬ãŒãã¡ãœãããšã³ãã³ããã¿ãŒã³ã§ãã ãã³ãã¬ãŒãã¡ãœããã¯ãåã¯ã©ã¹ã®ã¢ã«ãŽãªãºã ã®å®è£ ãæ®ããŠãç¹°ãè¿ãéå±€ã®ã³ãŒããç¶æ¿éå±€ã«ç§»åããå¿ èŠããããšæ³å®ããŠããŸãã ãã³ãã³ãããã¿ãŒã³ã䜿çšãããšãããç¥ãããŠããå®è¡ã»ãã³ãã£ã¯ã¹ã䜿çšããŠåäœãã¯ã©ã¹ã«ã«ãã»ã«åã§ããŸãã ãªã¹ã4ã¯ãããã2ã€ã®ãã¿ãŒã³ããªã¹ã3ã®ã³ãŒãã«é©çšããçµæã瀺ããŠããŸãã
ãªã¹ã4.ãªãã¡ã¯ã¿ãªã³ã°ããã泚æã³ãŒã
public void wrapInTransaction(Command c) throws Exception { setupDataInfrastructure(); try { c.execute(); completeTransaction(); } catch (Exception condition) { rollbackTransaction(); throw condition; } finally { cleanUp(); } } public void addOrderFrom(final ShoppingCart cart, final String userName, final Order order) throws Exception { wrapInTransaction(new Command() { public void execute() { add(order, userKeyBasedOn(userName)); addLineItemsFrom(cart, order.getOrderKey()); } }); }
ãªã¹ã4ã§ã¯ãã³ãŒãã®äžè¬çãªéšåãwrapInTransactionïŒïŒã¡ãœããã«åŒãåºãïŒã»ãã³ãã£ã¯ã¹ã¯Springãã¬ãŒã ã¯ãŒã¯ã®TransactionTemplateã®ç°¡æããŒãžã§ã³ã«åºã¥ããŠããŸãïŒãCommandãªããžã§ã¯ããå®è¡ããã³ãŒããšããŠæž¡ããŸãã addOrderFromïŒïŒã¡ãœããã®æ¬è³ªã¯ã å¿åã®å éšã¯ã©ã¹ãå®çŸ©ããŠãããã€ãã®åŒãã©ããããããšã§ã³ãã³ãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããããšã«ãããŸãã
ããŒã ã¯ã©ã¹ã§ç®çã®åäœãã©ããããããšã¯ããã®åäœãåé¢ããæ©èœãå«ãŸãªãçŽç²ãªJavaã¢ãŒãã£ãã¡ã¯ããã¶ã€ã³ã§ãã Javaã®ãã¹ãŠã®åäœã¯ãã¯ã©ã¹å ã«é 眮ããå¿ èŠããããŸãã èšèªèšèšè ã§ããããã®ãããªèšèšã®æ¬ é¥ãããã«çºèŠããŸãããéå»ãæ¯ãè¿ã£ãŠã¿ããšãã¯ã©ã¹ã«çµã³ä»ããããŠããªãæ¯ãèãã®ååšã®äžå¯èœæ§ã«ã€ããŠèããã®ã¯å°ãçŽ æŽã§ãã JDK 1.1ã¯ãå¿åã®å éšã¯ã©ã¹ãè¿œå ããããšã§ãã®æ¬ é¥ãä¿®æ£ããŸãããå°ãªããšããå éšæ§é ã¯ã©ã¹ã§ã¯ãªããããããªæ©èœã¡ãœããã§å€æ°ã®å°ããªã¯ã©ã¹ãäœæããããã®æ§æã·ã¥ã¬ãŒãè¿œå ããŸãã Javaã®ãã®åŽé¢ã«é¢ããé¢çœããšãã»ã€ãšããŠã ãåè©ã®çåœã§ã®å®è¡ãïŒSteve YeggeïŒããå§ãããŸãã
Javaã¯ã1ã€ã®ã¡ãœãããå®çŸ©ãããã ãã§ããCommandã¯ã©ã¹ãã€ã³ã¹ã¿ã³ã¹åããããã«åŒ·å¶ããŸãã ã¯ã©ã¹èªäœã«ã¯å©ç¹ã¯ãããŸããããã£ãŒã«ããã³ã³ã¹ãã©ã¯ã¿ãŒïŒæšæºã®ã³ã³ã¹ãã©ã¯ã¿ãŒãèæ ®ããªãïŒããŸãã¯ç¶æ ãå«ãŸããŠããŸããã ããã¯ãã¡ãœããå ã«å®è£ ãããåäœã®åãªãã©ãããŒã§ãã é¢æ°åèšèªã§ã¯ãããã¯é«éé¢æ°ã䜿çšããŠè§£æ±ºãããŸãã
ä»ã®ãšããJavaãé¢ããããšã«ããå Žåã ã¯ããŒãžã£ãŒã䜿çšããé¢æ°åããã°ã©ãã³ã°ã®çæ³ã«è¿ã¥ããŸãã ãªã¹ã5ã¯åããªãã¡ã¯ã¿ãªã³ã°ã®äŸã瀺ããŠããŸãããJavaã®ä»£ããã«Groovyã䜿çšããŠããŸãã
ãªã¹ã5.ã³ãã³ãã¯ã©ã¹ã®ä»£ããã«Groovyã¯ããŒãžã£ãŒã䜿çšãã
def wrapInTransaction(command) { setupDataInfrastructure() try { command() completeTransaction() } catch (Exception ex) { rollbackTransaction() throw ex } finally { cleanUp() } } def addOrderFrom(cart, userName, order) { wrapInTransaction { add order, userKeyBasedOn(userName) addLineItemsFrom cart, order.getOrderKey() } }
Groovyã§ã¯ãäžæ¬åŒ§{}å ã®ãã¹ãŠããã©ã¡ãŒã¿ãŒãšããŠæž¡ãããã³ãŒãã®ãããã¯ã§ãããé«éé¢æ°ãæš¡å£ããŠããŸãã èå°è£ã§ã¯ãGroovyã¯Teamãã¿ãŒã³ãå®è£ ããŸãã Groovyã®åã¯ããŒãžã£ãŒãããã¯ã¯ãå®éã«ã¯ãã¯ããŒãžã£ãŒã€ã³ã¹ã¿ã³ã¹ãæãå€æ°ã®åŸã«æ¬åŒ§ïŒïŒã眮ããããšãã«èªåçã«å®è¡ãããcallïŒïŒã¡ãœãããå«ãç¹å¥ãªClosureã¿ã€ãã®ã€ã³ã¹ã¿ã³ã¹ã§ãã Groovyã§ã¯ãé©åãªããŒã¿æ§é ãæ§ç¯ããèšèªã«æ§æç³è¡£ãè¿œå ããããšã§ããæ©èœãåäœã«å¹æµãããã®ãå®è£ ã§ããŸãã 次ã®ããŒãã§èª¬æããããã«ãGroovyã«ã¯Javaã®å¢çãè¶ ããä»ã®é¢æ°åããã°ã©ãã³ã°æ©èœãå«ãŸããŠããŸãã ãŸããå°æ¥çã«ã¯ãã¯ããŒãžã£ãŒãšé«éé¢æ°ã®èå³æ·±ãæ¯èŒã®ããã«æ»ã£ãŠããŸãã
äžæµã®æ©èœ
é¢æ°åèšèªã®é¢æ°ã¯ãæåã®ã¯ã©ã¹ã®ãªããžã§ã¯ããšèŠãªãããŸããã€ãŸããä»ã®èšèªæ§æèŠçŽ ïŒå€æ°ãªã©ïŒã䜿çšããŠãå¯èœãªéãé¢æ°ã衚瀺ã§ããŸãã ãããã®ååšã«ãããããªãçããæ©èœã䜿çšããããšãã§ããæœåšçãªè§£æ±ºçã«ã€ããŠç°ãªãèãæ¹ãããããã«ä¿ãããŸãã ããšãã°ãæ¯èŒçäžè¬çãªæäœïŒãã¥ã¢ã³ã¹ã䌎ãïŒãæšæºããŒã¿æ§é ã«é©çšããå Žåã ããã¯ãé¢æ°åèšèªã®èãæ¹ã«æ ¹æ¬çãªå€åããããããŸã-äžé段éã§ã¯ãªãçµæã«çŠç¹ãåœãŠãŸãã
åœä»€åããã°ã©ãã³ã°èšèªã§ã¯ãã¢ã«ãŽãªãºã ã®ãã¹ãŠã®åºæ¬çãªã¹ãããã«ã€ããŠèããå¿ èŠããããŸãã ãªã¹ã1ã®ã³ãŒãã¯ããã瀺ããŠããŸãã æ°å€ã®åé¡åãå®è£ ããã«ã¯ãé€æ°ã®åéæ¹æ³ãæ£ç¢ºã«æ±ºå®ããå¿ èŠããããŸããã€ãŸããé€æ°ã®æ°ã決å®ãããµã€ã¯ã«ãå®è¡ããããã«ç¹å®ã®ã³ãŒããèšè¿°ããå¿ èŠããããŸãã ããããåã¢ã€ãã ã®æäœãå«ãã¯ããŒã«ãªã¹ãã¯ãããªãäžè¬çãªãã®ã®ããã§ãã ãªã¹ã6ã§ãFunctional Javaãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠãªãŒããŒã©ã€ããããçªå·åé¡åã³ãŒããèŠãŠãã ããã
ãªã¹ã6.é¢æ°çªå·åé¡å
public class FNumberClassifier { public boolean isFactor(int number, int potential_factor) { return number % potential_factor == 0; } public List<Integer> factors(final int number) { return range(1, number+1).filter(new F<Integer, Boolean>() { public Boolean f(final Integer i) { return number % i == 0; } }); } public int sum(List<Integer> factors) { return factors.foldLeft(fj.function.Integers.add, 0); } public boolean isPerfect(int number) { return sum(factors(number)) - number == number; } public boolean isAbundant(int number) { return sum(factors(number)) - number > number; } public boolean isDeficiend(int number) { return sum(factors(number)) - number < number; } }
ãªã¹ã6ãšãªã¹ã2ã®äž»ãªéãã¯ã2ã€ã®ã¡ãœããsumïŒïŒãšfactorïŒïŒã§ãã sumïŒïŒã¯ãFunctional Javaã®Listã¯ã©ã¹ã«é¢ããŠfoldLeftïŒïŒã¡ãœãããå©çšããŸãã ãã®ç¹å®ã®çš®é¡ã®ãªã¹ãæäœã¯ã«ã¿ã¢ã«ãã£ãºã ãšåŒã°ãã ãªã¹ãã®æãããã¿ã®äžè¬åã§ãã ãã®å Žåãããªã¹ãã®æãããã¿ããšã¯æ¬¡ã®ããšãæå³ããŸãã
- åæå€ãååŸããæå®ãããæäœããªã¹ãã®æåã®èŠçŽ ãšçµã¿åãããŠé©çšããŸã
- çµæãååŸãã次ã®èŠçŽ ãšãšãã«åãæäœãé©çšããŸã
- ãªã¹ãã®æåŸã«éãããŸã§ç¹°ãè¿ããŸãã
ããã¯ãèŠçŽ ã®ãªã¹ããèŠçŽãããšãã«è¡ãããšãšãŸã£ããåãã§ããããšã«æ³šæããŠãã ããã0ããéå§ããæåã®èŠçŽ ãè¿œå ããŠçµæãååŸãããªã¹ãå šäœãå·¡åãããŸã§2çªç®ã®èŠçŽ ãè¿œå ããŸãã é¢æ°åJavaã§ã¯ãé«éé¢æ°ïŒãã®äŸã§ã¯Integers.addïŒã䜿çšã§ããããã䜿çšããŸãã ïŒééããªããJavaã«ã¯å®éã«ã¯é«éé¢æ°ã¯ãããŸããããããŒã¿æ§é ãŸãã¯ãã®ã¿ã€ãã«ãã£ãŠå¶éã課ããããå Žåã«åªããé¡äŒŒç©ãæžãããšãã§ããŸãã
ãªã¹ã6ã®ãã1ã€ã®èå³æ·±ãæ¹æ³ã¯factorïŒïŒã§ã ãããã¯ããäžéã¹ãããã§ã¯ãªããçµæã«çŠç¹ãåœãŠãããšããã¢ããã€ã¹ã瀺ããŠããŸãã æ°ã®é€æ°ã決å®ããåé¡ã®æ¬è³ªã¯äœã§ããïŒ èšãæããã°ãèæ ®ãããçªå·ã®åã«å¯èœãªãã¹ãŠã®çªå·ã®ãªã¹ããäžããããå Žåããã®é€æ°ã§ããçªå·ãšããããåºå¥ããã«ã¯ã©ãããã°ããã§ããïŒ ããã¯ããã£ã«ã¿ãªã³ã°æäœã®äœ¿çšã瀺åããŠããŸã-æ°å€ã®å®å šãªãªã¹ãããã£ã«ã¿ãŒã§é€å€ã§ããŸãããã ããåºæºã«åããªããã®ã¯é€å€ããŸãã éåžžãèªã¿åããŸãïŒ1ããåé¡ã®çªå·ãŸã§ã®ç¯å²ãåãã fïŒïŒã¡ãœããå ã®ã³ãŒãã§ãªã¹ãããã£ã«ã¿ãŒåŠçããŸããããã¯ãç¹å®ã®ã¿ã€ããšæ»ãå€ãæã€ã¯ã©ã¹ãäœæã§ããFunctional Javaã®æ¹æ³ã§ãã
ãã®ã³ãŒãã¯ãããã°ã©ãã³ã°èšèªå šè¬ã®åŸåãªã©ãã¯ããã«å€§ããªæŠå¿µã瀺ããŠããŸãã éå»ã«ã¯ãéçºè ã¯ã¡ã¢ãªå²ãåœãŠãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããã€ã³ã¿ãŒãªã©ã®å€ãã®è¿·æãªããšãåŠçããå¿ èŠããããŸããã æéãçµã€ã«ã€ããŠããããã®èšèªãšã©ã³ã¿ã€ã ã®å€ããèªåãã¡ã®é¢åãèŠãŠããŸããã ã³ã³ãã¥ãŒã¿ãŒããŸããŸã匷åã«ãªãã«ã€ããŠãèšèªãšã©ã³ã¿ã€ã ã§æ¥åžžçãªèªååãããã¿ã¹ã¯ãåãé€ããŸãã Javaéçºè ãšããŠãç§ã¯èšèªã«ãã¹ãŠã®ã¡ã¢ãªã®åé¡ãäžããããšã«æ £ããŠããŸãã é¢æ°åããã°ã©ãã³ã°ã¯ããããã®æ©èœãæ¡åŒµããŠãããå ·äœçãªè©³çŽ°ãå«ããããã«ããŸãã æéãçµã€ã«ã€ããŠãåé¡ã解決ããããã«å¿ èŠãªæé ã®ã±ã¢ã«è²»ããæéãæžããããã»ã¹ã®çšèªãããæ·±ãèããããã«ãªããŸãã ã·ãªãŒãºãéããŠãããã®å€ãã®äŸã瀺ããŸãã
ãããã«
é¢æ°åããã°ã©ãã³ã°ã¯ãããŒã«ãèšèªã®ã»ãããšãããããèãæ¹ã§ãã ãã®æåã®éšåã§ã¯ãåçŽãªèšèšäžã®æ±ºå®ããéå¿çãªåé¡ã®åèãŸã§ãé¢æ°åããã°ã©ãã³ã°ã®ããã€ãã®ãããã¯ã«ã€ããŠèª¬æãå§ããŸããã åçŽãªJavaã¯ã©ã¹ãæžãçŽããŠããããæ©èœçãã«ããåŸãé¢æ°åããã°ã©ãã³ã°ã¹ã¿ã€ã«ãšåŸæ¥ã®åœä»€åã¹ã¿ã€ã«ãåºå¥ãããããã¯ã«é£ã³èŸŒã¿ãŸããã
ããã§ã¯ã2ã€ã®éèŠãªææãªæŠå¿µãæ€èšããŸããã ãŸããæé ã§ã¯ãªãçµæã«éäžããŸãã é¢æ°åããã°ã©ãã³ã°ã¯ã解決çãèŠã€ããã®ã«åœ¹ç«ã€ããŸããŸãªããã«ãã£ã³ã°ãããã¯ããæã«ãããããåé¡ãç°ãªã芳ç¹ããæ瀺ããããšããŸãã ãã®ã·ãªãŒãºãéããŠç§ã瀺ã2çªç®ã®åŸåã¯ãããã°ã©ãã³ã°èšèªãšã©ã³ã¿ã€ã ãžã®åçŽãªãã®ã®å§ä»»ã§ãããããã°ã©ãã³ã°ã®åé¡ã®ãŠããŒã¯ãªåŽé¢ã«éäžããããšãã§ããŸãã 次ã®éšåã§ã¯ãä»æ¥ã®ãœãããŠã§ã¢éçºã«ãããé¢æ°åããã°ã©ãã³ã°ãšãã®å¿çšã®åºæ¬çãªåŽé¢ãåŒãç¶ãæ€èšããŸãã
PS翻蚳ãã¬ãã¥ãŒããŠãããCheatExã«æè¬ããŸãã ãããããç¶ç¶ããã...