èšèšãã¿ãŒã³ãšé¢æ°åããã°ã©ãã³ã°ïŒ ããã¯ã©ã®ããã«é¢é£ããŠããŸããïŒ
ãªããžã§ã¯ãæåã®ãã©ãã€ã ã«æ £ããŠããå€ãã®éçºè ã®å¿ã®äžã§ã¯ããœãããŠã§ã¢èšèšèªäœã¯OOPãšå¯æ¥ã«é¢é£ããŠãããä»ã®ãã¹ãŠã¯ç°ç«¯ã§ããããã§ãã äž»ã«OOPã«çŠç¹ãåãããUMLã¯ãèšèšã®ããã®æ®éçãªèšèªãšããŠäœ¿çšãããŠããŸãããããã§ã¯ãããŸããã ãããŠããªããžã§ã¯ãæåããã°ã©ãã³ã°ã®äžçãåŸã ã«ç¯çœªãªãšã³ãžãã¢ãªã³ã°ã®æ·±intoã«çªå ¥ããŠããããšãããããŸãïŒ1ïŒã
ãã®ãããå€ãã®å Žåãããã°ã©ãã³ã°ãã©ãã€ã ãéžæãããšããåé¡ã¯æèµ·ãããŸããã ããã«ããããããããã®è³ªåã¯éåžžã«éèŠã§ãããå€ãã®å Žåãæ£ããçãã¯å€§ããªå©ç¹ãæäŸããŸãïŒ3ïŒã äžè¬çã«èšã£ãŠãããã¯ç§ãã¡ããã¶ã€ã³ãšåŒãã§ãããã®ãè¶ ããŠããŸã-ããã¯å»ºç¯ã®åéããã®è³ªåã§ãã
åæ çãªäœè«ïŒã¢ãŒããã¯ãã£ãèšèšãå®è£ ã®éã
å°ãåã«ãéåžžã«èå³æ·±ãç 究ã«åºäŒããŸãã-ïŒ2ïŒã éå ¬åŒã«æããã䜿çšããããã¢ãŒããã¯ãã£ãããèšèšãããå®è£ ãã®æŠå¿µã圢åŒåããã¿ã¹ã¯ãèæ ®ããŸãã ãããŠãèè ã¯éåžžã«èå³æ·±ãåºæºãæšå®ããããšãã§ããŸãïŒIntension / Localityåºæºã§ãã å²åŠãæ·±ãæãäžããããšã¯ãããåºæºïŒãã®éšåã¯å®éã«ã¯ç¿»èš³ã§ãïŒã®ç°¡åãªèª¬æãšããããã®çµè«ãè¿°ã¹ãŸãã
Intensionããããã£ã¯ãç¹å®ã®ãšã³ãã£ãã£ãç¡éæ°ã®ãªããžã§ã¯ããèšè¿°ããèœåãæå³ããŸããããšãã°ãçŽ æ°ã®æŠå¿µã§ãã æ¡åŒµæ§ã®ç¹æ§ã¯ãããšã¯å察ã§ã-æ¬è³ªã¯ãªããžã§ã¯ãã®æéã»ããã説æããŸããããšãã°ãåœã®æŠå¿µã¯NATOã®ã¡ã³ããŒã§ãã
å±ææ§ããããã£-ãšã³ãã£ãã£ã¯ãã·ã¹ãã ã®å¥ã®éšåã«ã®ã¿åœ±é¿ããŸãã ãããã£ãŠãã°ããŒãã«æ§-æ¬è³ªã¯ã·ã¹ãã å šäœã«åœ±é¿ããŸãã
ãããã£ãŠããããã®2ã€ã®ç¹æ§ãèæ ®ããŠããã®ç 究ã®èè ã¯ãã®ãããªè¡šãç·šéããŸãã
ããã䜿çšãããšãã¢ãŒããã¯ãã£ã®ã¬ãã«ã«é¢é£ãããã®ãããã³èšèšã®ã¬ãã«ã«é¢é£ãããã®ãç°¡åã«å€æã§ããŸãã ãããŠãããã«ç§ã®çµè«ããããŸããããã°ã©ãã³ã°ãã©ãã€ã ããã©ãããã©ãŒã ãããã³èšèªã®éžæã¯ãã¢ãŒããã¯ãã£ã¬ãã«ã§ã®æ±ºå®ã§ãã ãã®éžæã¯ãã°ããŒãã«ïŒã·ã¹ãã ã®ãã¹ãŠã®éšåã«åœ±é¿ïŒããã³ã€ã³ãã³ã·ãïŒãã©ãã€ã ãç¡éã®æ°ã®ã¿ã¹ã¯ã解決ããæ¹æ³ã決å®ããŸãïŒã§ãã
ãããããã®ãããªã°ããŒãã«ãªåé¡ã解決ããããã«ïŒé©åãªãã©ãã€ã ãéžæããããã®åºæºãèŠã€ããããã«ïŒç§ã¯ãŸã äœè£ããããŸããã ãããã£ãŠãæ¢åã®2ã€ã®ã¯ã©ã¹ã®åé¡ãéžæããå€ãã®OOã®éåžžã®ã¢ãããŒãã§ã¯ãªããæè¿ïŒåœç¶ïŒäººæ°ãé«ãŸã£ãŠããæ©èœçãªã¢ãããŒãã䜿çšãã䟡å€ãããããšã瀺ãããšã«ããŸããã
ç°åžžãªæ¹æ³ã§ã¿ã¹ã¯ã®ã¯ã©ã¹ãéžæããŸãã-2ã€ã®ãªããžã§ã¯ãæåèšèšãã¿ãŒã³ã䜿çšããããããå®éã«é¢æ°åããã°ã©ãã³ã°ã®åéã®æŠå¿µã®éå®çãªå®è£ ã§ãã-é«æ¬¡é¢æ°ïŒä»¥äžïŒFVPïŒã§ããããšã瀺ããŸããã 仮説ã¯ããã¿ãŒã³ã¯ç¹å®ã®åé¡ã«å¯Ÿããååã«ç¢ºç«ããã解決çã§ãããåé¡ãšãã®ååã«ç¢ºç«ããã解決çããããããæããã«å æããªããã°ãªããªãããã€ãã®åŒ±ç¹ãšæ¬ ç¹ããããšããããšã§ããã èæ ®ããããã¿ãŒã³ã«ã€ããŠã¯ãããã¯ç¢ºãã«ããã§ãã
ã¡ãªã¿ã«ãåæ§ã®ã¢ãããŒããïŒ5ïŒãšïŒ6ïŒã§äœ¿çšãããŸããã ïŒ6ïŒã§ã¯ãã»ãšãã©ã®ãã¿ãŒã³ã眮ãæããå¯èœæ§ãäžè¬çã«ç€ºãããŸããããåãã¿ãŒã³ã®è©³çŽ°ãªåæã¯è¡ãããŸããã§ããã ïŒ5ïŒã§ã¯ãææ®ãšæŠç¥ã«ã€ããŠã®ãã詳现ãªæ€èšããããŸãããããããã«ç°ãªãåŽé¢ããããŸããã ïŒ6ïŒãããå®çšçã§ãïŒ5ïŒãšã¯ç°ãªãã¢ã¯ã»ã³ãã§äœããããããšã«ããŸããã ããã§ã¯å§ããŸãããã
é«éé¢æ°
äœããã®åœ¢ã®ã»ãŒå šå¡ããã®èãã«ç²ŸéããŠãããšæããŸãã
é«éé¢æ°ã¯ãåŒæ°ãšããŠåãåãããçµæãšããŠå¥ã®é¢æ°ãè¿ãé¢æ°ã§ãã
ããã¯ãé¢æ°åããã°ã©ãã³ã°ã®åºæ¬æŠå¿µã«ãã£ãŠå¯èœã«ãªããŸããé¢æ°ã¯å€ã§ãã é¢æ°åããã°ã©ãã³ã°ã®é¢æ°ãšå€ãæ°åŠã®åæ§ã®æŠå¿µã«å®å šã«å¯Ÿå¿ããŠãããšèšããšããæ£ç¢ºã«å®å šã«å¯Ÿå¿ããŠããããšãæå³ããŸãã ããã¯ãŸã£ããåãã§ãã æ°åŠã§åºãæ®åããŠããFVPã®äŸã¯ã埮åãçµ±åãããã³åæã®æŒç®åã§ãïŒäžè¬çã«ãããã¯æ©èœåæããã®æŒç®åã®æŠå¿µã«è¿ãïŒã åææŒç®åã¯ãæ©èœçãªãã©ãã€ã ããµããŒãããã»ãšãã©ã®èšèªã§çŽæ¥è¡šçŸãããŸãã FïŒã®äŸïŒ
let f = (+) 10 let g = (*) 2 let composition = f << g printfn "%i" <| g 15 printfn "%i" <| f 30 printfn "%i" <| composition 15
çµè«ïŒ
30 40 40
æããã«ãf << gãšããè¡šèšã¯ãfïŒgïŒxïŒïŒãŸãã¯FâGãšããè¡šèšã«å¯Ÿå¿ããŸãã
ãããããããç解ããããã«ãæ§ææŒç®åã®ã¿ã€ãã«æ³šæããããšããå§ãããŸãã
('a -> 'b) -> ('c -> 'a) -> 'c -> 'b
æ¬åŒ§å ã®é¢æ°ã®çš®é¡ã®èª¬æã®éšåãé¢æ°ã®çš®é¡ã§ãã ã€ãŸããåŒæ°ãšããŠåãåãé¢æ°ã§ãã
- ãžã§ããªãã¯åã®å€ãåŒæ°ãšããŠåãåãããžã§ããªãã¯åã®å€ãè¿ãé¢æ°b
- ãžã§ããªãã¯åã®å€ãåŒæ°ãšããŠåãåãããžã§ããªãã¯åã®å€ãè¿ãé¢æ°
- ã¿ã€ã 'cã®å€
ã¿ã€ã 'bã®å€ãè¿ããŸãã å®éã«ã¯ãåŒæ°ãšããŠå 'cã®å€ãåããå' bã®å€ãè¿ãé¢æ°ãã€ãŸã ã¿ã€ãã¯æ¬¡ã®ããã«æžãæããããšãã§ããŸãã
('a -> 'b) -> ('c -> 'a) -> ('c -> 'b)
FVP ã¯ãäžè¬çãªåäœãåºå¥ããããšãã§ããŸã ã ããã«ãããã³ãŒãã®åå©çšæ§ãåäžããŸãã
ããã¯ããŸããŸãªç®çã«äœ¿çšã§ããŸã-ããšãã°ãäŸå€ãåŠçããããã«ã ç¹å®ã®äŸå€ã»ãããåŒãèµ·ããå¯èœæ§ã®ããã³ãŒããå€æ°ãããšããŸãã ãšã©ãŒãèµ·ãããããã³ãŒãèªäœããäŸå€ãåŠçããå¥ã®é¢æ°ã«ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãé¢æ°ã®åœ¢åŒã§èšè¿°ããããšãã§ããŸãã CïŒã®äŸïŒ
private void CalculateAdditionalQuantityToIncreaseGain() { // var unitPrice = ExtractDecimal(gainUnitPriceEdit); var quantityReleased = ExtractDecimal(gainQuantityEdit); ... }
äŸå€ãåŠçããFEPã¯æ¬¡ã®ãšããã§ãã
private static void ExecuteErrorProneCode(Action procedure) { try { procedure(); // } catch (WrongDecimalInputInTextBoxException ex) { MessageBox.Show(ex.Message, " "); } catch (Exception ex) { MessageBox.Show(ex.Message, ""); } }
次ã«ãé¢æ°ã«ãã£ãŠåŒãèµ·ããããäŸå€ãåŠçããã«ã¯ã次ã®ããã«èšè¿°ããã ãã§ååã§ãã
ExecuteErrorProneCode(CalculateAdditionalQuantityToIncreaseGain);
ããã«ãããåãæ¹æ³ã§åŠçããå¿ èŠãããäŸå€ãã¹ããŒã§ããäŸå€ãã³ãã©ãŒãé¢æ°ãå€æ°ããå Žåãã³ãŒããå€§å¹ ã«åæžãããŸãã
ãŸããäžè¬çãªåäœã匷調ããå žåçãªäŸã¯ããœãŒãã®ããã®é«éé¢æ°ã®äœ¿çšã§ãã æããã«ã䞊ã¹æ¿ãã«ã¯ã䞊ã¹æ¿ããããã³ã¬ã¯ã·ã§ã³ã®èŠçŽ ãäºãã«æ¯èŒã§ããå¿ èŠããããŸãã ãœãŒãé¢æ°ã«åŒæ°ãšããŠæž¡ãããé¢æ°ã¯ããã®ãããªãã³ã³ãã¬ãŒã¿ããšããŠæ©èœããŸã-ãããã£ãŠããœãŒãé¢æ°ã¯æ®éæ§ã確ä¿ããããã«FVPã§ãªããã°ãªããŸããã äžè¬ã«ãFEPãäœæããæ©èœã¯ã æœè±¡çãªäžè¬åã¢ã«ãŽãªãºã ã®äœæãç®çãšããäžé£ã®ã¢ã¯ã·ã§ã³ã®éèŠãªãªã³ã¯ã§ã ã
ãšããã§ãFVPã¯ä»ã®é¢æ°ãšåæ§ã«å€ã§ãããããããŒã¿ãè¡šãããã«äœ¿çšã§ããŸãã ããã«ã€ããŠã¯ãæäŒã®ããã©ãŒãã³ã¹ã«é¢ããèšäºãåç §ããŠãã ããã
ã³ãã³ããã¿ãŒã³
æŠç¥ã®ãããªã³ãã³ããã¶ã€ã³ãã¿ãŒã³ã¯ã åäœãã¶ã€ã³ãã¿ãŒã³ãæããŸãã ãã®äž»ãªåœ¹å²ã¯ãç¹å®ã®æ©èœã®ã«ãã»ã«åã§ãã ãã®ãã¿ãŒã³ã«ã¯å€ãã®çšéããããŸãããã»ãšãã©ã®å Žåã次ã®ããšãè¡ãããã«äœ¿çšãããŸãã
- å¥ã®åä¿¡è ã«ãªã¯ãšã¹ããéä¿¡ãã
- ããŒã ã®ç·šæããã°ã®ä¿æããªã¯ãšã¹ãã®ãã£ã³ã»ã«
- åçŽãªãã®ããè€éãªæäœãäœæãã
- å ã«æ»ãïŒæåŸã®ã¢ã¯ã·ã§ã³ãå ã«æ»ãïŒããã³ããçŽãïŒæåŸã«å ã«æ»ããã¢ã¯ã·ã§ã³ãç¹°ãè¿ãïŒã³ãã³ããå®è£ ãã
äžè¬çã«ã次ã®ããã«ãªããŸãã
å ã«æ»ããšããçŽãã®å®è£ ã®äŸãæ€èšããŸã ããã®æ©èœã®å®è£ ã®ã¯ãªãŒã³ãªãªããžã§ã¯ãæåããŒãžã§ã³ãããã§èŠãããšãã§ããŸã ã
ãã®å³ã®åœ¹å²ã®ååžïŒ
ããã§ã Filterã¯Receiver 'yã LoggingInvoker - Invoker ' yã IFilterCommand - ICommandã«å¯Ÿå¿ããŸãã ããã¯ããªãã¬ãŒã·ã§ã³ãåŒã³åºãæ¹æ³ã§ãïŒLoggingInvoker 'sã®
Execute()
ã¡ãœããã«ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãã³ãã³ããšã LoggingInvoker ' eèªäœã§ã³ãã³ããäœæã§ããŸã-éžæã¯ç¹å®ã®ç¶æ³ã«ãã£ãŠç°ãªããŸãïŒã
ãããŠãããã«ãããããã£ã³ã»ã«ããæ¹æ³ããããŸãïŒ
performOpsããã³undoneOpsã¯ãå®è¡ããã³ãã£ã³ã»ã«ãããããŒã ãæ ŒçŽããã¹ã¿ãã¯ã§ãã
ãã ããFEPãæ€èšããåŸãéžæããèšèªããã®æ©èœããµããŒãããŠããã°ããã®ãã¹ãŠã®åäœãFEPã®åœ¢åŒã§å®è£ ã§ããããšã¯æããã§ãã å®éã Invokerãªããžã§ã¯ãã¯FPFã«çœ®ãæããããšãã§ããŸããFPF㯠ãç¹å®ã®æäœã«å¯Ÿå¿ããé¢æ°ãåŒæ°ãšããŠåãåããŸããé¢æ°èªäœã¯å€ã§ããããã Commandãªããžã§ã¯ãã¯äžèŠã«ãªããŸããã ãã®æ©èœã¯ãæ©èœçãã©ãã€ã ããµããŒãããèšèªã®çš®é¡ã®ã·ã¹ãã ã«ãã£ãŠå®è¡ãããŸãã
ãã®ãã¿ãŒã³ããåãæ©èœãå®è¡ã§ããæ©èœçãã©ãã€ã ã®ãã¶ã€ã³ã§çœ®ãæããå³ã次ã«ç€ºããŸãã
æ¬äŒŒã³ãŒãïŒFïŒã«è§ŠçºãããïŒã§ã¯ã察å¿ããæ©èœå®è£ ã¯æ¬¡ã®ããã«ãªããŸãã
// // - type OpType = (DataType -> DataType) * DataType // let performedOps = Stack<OpType>() let undoneOps = Stack<OpType>() // LoggingInvoker - let execute operation data = let res = operation data // performedOps.Push(operation, data) // res // let undo () = if performedOps.Count > 0 then // undoneOps.Push(performedOps.Pop()) // Some (snd undoneOps.Peek()) // 'a option, . (5) (7) else None // let OperationOne data = ... let OperationTwo data = ... // OperationOne let mutable a = execute OperationOne data // let b <- undo ()
å®è¡ããé¢æ°FVP
execute
ãæž¡ããŸãã
execute
é¢æ°ã¯ãå®äºããæäœã®ã¹ã¿ãã¯ããªãŒãããæäœãå®è¡ãããã®å®è¡çµæãè¿ããŸãã å ã«æ»ãæ©èœã¯ãæåŸã«å®è¡ãããæäœããã£ã³ã»ã«ããŸãã
ãã®ã¢ãããŒãã«ã¯ãã³ãã³ããã¿ãŒã³ã䜿çšãããããããã€ãã®å©ç¹ããããŸãã
- çµæã®ã³ãŒãã¯ãããèªç¶ã§ãçããã·ã³ãã«ã§ãã
- ã³ã³ããžã·ã§ã³ãŸãã¯ãã€ãã©ã€ã³åŠçã䜿çšããŠããã¯ããšè€éãªæäœãç°¡åã«äœæã§ããŸãïŒãã€ãã©ã€ã³åŠçã«ã€ããŠã¯ãïŒ5ïŒãŸãã¯ïŒ7ïŒãåç §ïŒç°¡åãªæäœ
- ã¡ãã¥ãŒãåçã«äœæãããªã©ã®æäœãå«ãè€éãªããŒã¿æ§é ãäœæã§ããŸãã
ããã«ããã«ããã©ãã€ã èšèªã䜿çšããå Žåãã³ãã³ããã¿ãŒã³ãšãããã§ç€ºãã¢ãããŒãããªããžã§ã¯ãæåã®ããŸããŸãªå²åã§çµã¿åãããããšãã§ããŸãã
çŸä»£ã®å€ãã®èšèªã¯ãAFPãããçšåºŠãµããŒãããŠããŸãã ããšãã°ãCïŒã«ã¯ããªã²ãŒãã¡ã«ããºã ããããŸãã ããªã²ãŒãã䜿çšããŠåãæ¶ããäœæããåé¡ã解決ããäŸã¯ãïŒ4ïŒã«ãããŸãã
æŠç¥ãã¿ãŒã³
æŠç¥ãã¿ãŒã³ã¯ãã¯ã©ã€ã¢ã³ããåé¡ã解決ããããã®ããã€ãã®å¯èœãªæ¹æ³ã®1ã€ãéžæã§ããããã«èšèšãããŠããŸãã OOPã§ã¯ããã®ããã«æ¬¡ã®æ§é ãäœæãããŸãã
ã³ã³ããã¹ãã¯ã IStrategyã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£ ã®1 ã€ãžã®ãªã³ã¯ãä¿åããŸã;å¿ èŠã«å¿ããŠããã®ä¿åããããªããžã§ã¯ãã®ã¡ãœããã䜿çšããŠç¹å®ã®æäœãå®è¡ããŸãã ãªããžã§ã¯ãã®å€æŽ-ã¡ãœããã®å€æŽã
ãŸããæ©èœçãªã¹ã¿ã€ã«ã«ç°¡åã«å€æã§ããŸãã ä»åã¯ãæ©èœã®ãªã¹ãã䜿çšããŠå¯èœãªæŠç¥ãä¿åã§ããŸãã
æ¬äŒŒã³ãŒãïŒ
let strategyA data = ... let strategyB data = ... let useStrategy strategy data = ... strategy data ... useStrategy strategyA data
é¢æ°
strategyA
ã
strategyB
ã...ã¯ãå¯èœãªæŠç¥ãå®è£ ããé¢æ°ã§ãã é«æ¬¡é¢æ°
useStrategy
ã¯ãéžæãããæŠç¥ãããŒã¿ã«é©çšããŸãã æŠç¥ã¯ãåã«åŒæ°ãšããŠ
useStrategy
é¢æ°ã«
useStrategy
ãŸãã
ã³ãŒããå€§å¹ ã«ç°¡çŽ åããã³ççž®ããããšã«å ããŠããã®ã¢ãããŒãã«ã¯è¿œå ã®å©ç¹ããããŸã-è€æ°ã®æŠç¥ã«ãã£ãŠãã©ã¡ãŒã¿ãŒåãããé¢æ°ãäžåºŠã«ç°¡åã«äœæã§ãããããéåžžã®ãªããžã§ã¯ãæåã¢ãããŒãã§ã¯éåžžã«è€éãªããã°ã©ã æ§é ã«ãªããŸãã å®è£ ãååã«ç°¡åãªå Žåãå¿åé¢æ°ãªã©ã®æ©äŒãå©çšããŠãæŠç¥ã«åå¥ã®ååãæå®ããå¿ èŠã¯ãŸã£ãããªããããããŸããã ããšãã°ãFIã®ããŒã¿ã䞊ã¹æ¿ããã«ã¯ãFVP䞊ã¹æ¿ãã䜿çšããOOPã§è¡ãããŠããããã«æ¯èŒã¡ãœãããå®è£ ããIComparerã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããåã§ã¯ãªããæ¯èŒæäœèªäœãæž¡ãããšãã§ããŸãã
let a = sort (<) data
çµè«
1.解決ããåé¡ã®ã¯ã©ã¹ã«å¿ãããã©ãã€ã ã®æ£ããéžæã¯ãå€ãã®å Žåããã®ãœãªã¥ãŒã·ã§ã³ã®æåã®ããã®éèŠãªèŠå ãšãªããŸãã ã¿ã¹ã¯ãããããã¯ã©ã¹ã«å±ããŠããå Žå è¡åäžå¿ã®å Žåã¯ãæ©èœçãªã¢ãããŒãã®äœ¿çšãæ€èšããå¿ èŠããããŸãã
2.ã³ãã³ãããã³æŠç¥ãã¿ãŒã³ã¯ãé«æ¬¡é¢æ°ã®éå®çãªå®è£ ã§ã
3. FWPã䜿çšãããœãªã¥ãŒã·ã§ã³ã掻çšããããã«ãçŽç²ã«æ©èœçãªèšèªã«åãæ¿ããå¿ èŠã¯ãããŸãããææ°ã®äž»æµèšèªã®ã»ãšãã©ã¯ãããçšåºŠFWPããµããŒãããŠããŸãã
æè¿ããªããžã§ã¯ãæåãšæ©èœçãã©ãã€ã ãåçã«çµã¿åãããå€æ°ã®èšèªãç»å ŽããŸãã;å€ãã®ãªããžã§ã¯ãæåèšèªã¯ãæ©èœçãªèœåãç²åŸãå§ããŸããã ãã®èšäºãã誰ãããæ°ã«å ¥ãã®ããã°ã©ãã³ã°èšèªã®æ°æ©èœããããã䜿çšããã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã é 匵ã£ãŠãã ããïŒ
ãœãŒã¹
1. ç¯çœªã®ãªãŒããŒãšã³ãžãã¢ãªã³ã°
2. ã¢ãŒããã¯ãã£ãèšèšãå®è£ ã ã¢ã ãã³H.ãšãã³ããªãã¯ã«ãºãã³ã ããŒãã©ã³ãïŒB.Sc.2003ã第25åãœãããŠã§ã¢å·¥åŠåœéäŒè°-ICSE
3. éè¡äŒç€Ÿã¯é¢æ°åèšèªã䜿çšããŠéçºã50ïŒ å éããŸãã ãã€ã¯ããœããã®ã±ãŒã¹ã¹ã¿ãã£ã 2010幎3æ
4.ãã·ã§ããããžã¥ãã£ã¹ã CïŒ3.0ãã¶ã€ã³ãã¿ãŒã³ã ã«ãªãã©ã«ãã¢å·ã»ãã¹ããã«ïŒ2008幎ãªã©ã€ãªãŒ
5.ããŒãã¹ã»ãããªãã§ãã¯ããžã§ã³ã»ã¹ããŒãã çŸå®äžçã®é¢æ°åããã°ã©ãã³ã°ã b.mãïŒManning Publicationsã2010幎ã
6. GabrielãRichard P. ãªããžã§ã¯ãã¯ã¹ã©ã€ãã«å€±æããŸãã DreamSongs.comã
7.ã¹ãã¹ãã¯ãªã¹ã ããã°ã©ãã³ã°FïŒã ã«ãªãã©ã«ãã¢å·ã»ãã¹ããã«ïŒO'Reillyã2010幎ã
UDPïŒ
alexeyromã¯éåžžã«æçšãªã³ã¡ã³ããæžãããã圌ã®åæãåŸãŠããããèŠãããšãã§ããããã«æçš¿ã®æ¬æã«å ¥ããã
ããã«ãŠã£ã°ã¯ ã1996幎ã«LispãšDylanã®ãã¿ãŒã³ãèŠãŸãã ã å®éãçµæã¯äŒŒãŠããŸããïŒå€ãã®ãã¿ãŒã³ã¯ç°¡åã«ãªããå€§å¹ ã«åçŽåãããŸãïŒãããè±ããªçŽ æã«ãªããŸãã