<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Oo緣來是你oO


    posts - 120,comments - 125,trackbacks - 0
    轉自:http://blog.csdn.net/lins/archive/2006/08/18/1090417.aspx

    FP不是一個什么全新的概念,在lisp等語言中被廣泛應用,其設計方法向我們描繪了一個美好的世界,不過在OO的世界里應用卻還是要費一些力氣的。為了更好的應用FP,需要學習一下現有的實踐。
    ?
    一、回顧一下函數式編程的幾個特性:
    1. 閉包計算和高階函數。
    ?? 函數本身是first class對象,閉包是起函數作用并可以像對象一樣操作的。
    ?? 高階函數是可以接受一個函數為參數,并可以返回一個函數。?????
    2. 延遲計算(lazy evaluation)
    ?? 不是在函數綁定時計算,而是在求值時計算。
    3. 遞歸的計算機制????
    4. 引用透明
    ??? 同樣的輸入返回同樣的結果,與上下文無關。????
    5. 沒有副作用
    ??? 賦值后不能更改,既成為constant?????
    ?
    二、OO世界中FP的身影。
    The First:JDK下的FP?
    1.??閉包計算的例子如:BigDecimal.add(…).add(…).multiply(…).substract(…)?
    ?????高階函數一個例子是:Collections和Comparator接口,Comparator的操作是個閉包操作, 而Collections的sort以它為參數。?
    2.??沒有副作用的例子如下:?
    ?????BigDecimal.add(…).add(…).multiply(…).substract(…)?
    ?????String.subString(...)
    ?
    The Second:DDD的Specification?
    DDD一書提出了specification(chapter 10代碼就不貼了),不僅統一了Domain Model中不同的建模概念,而且應用FP的閉包能力在specification讓人耳目一新。
    ?
    The Third:CO編程?
    CO編程的概念是ajoo在javaeye論壇上提出(http://forum.javaeye.com/viewtopic.php?t=15130)?。
    在論戰中舉了logger和action兩個例子,都讓人看到了FP對系統開發的過程和結構巨大作用。?
    ??
    BTW:buaawhl總結了functor的幾種組合情況(http://forum.javaeye.com/viewtopic.php?t=21533, 以下是簡化版,略有修改)?
    1. Functor組合 - Combinator, Pipe?
    ????Functor有多個,參數只有一個。這一類的特點是,Functor移動,參數不動。?
    2. 參數集合 - Visitor, Map, Filter, Reduce?
    ????這一類比較有趣。參數是多個,是一個集合,Functor可以是一個(也可能是多個)。?
    ????這一類的特點是,Functor不動,參數移動。?
    3. Functor組合,參數集合 - Curry, Factory Chain?
    ????最復雜的類型,就是這一類了。Functor移動,參數也移動。?
    ????
    關于Curry,是FP的另一個特性。?
    舉個例子:F(x, y, z) = 2 * x + y - z。?
    F(1, 2, 3) 用Curry的方式寫就是,f(1)(2)(3)。這是FP語法。?
    由于FP下沒有成員變量,只好借用Curry + Closure來積累多個變量。?
    換成類似于c, java, c#的語法來寫,就是Factory Chain的寫法。?
    ?????factory.generate(1).generate(2).generate(3);?
    這里的關鍵是,上一個Functor處理參數的結果產生了下一個Functor,下一個Functor繼續處理下一個參數,產生下一個Functor。?
    如java世界中著名的orm框架hibernate的criteria和Query:SessionFactory.newSession(..).newQuery(…).setParameter(…).setParameter(…)?
    等等形式,都具有Curry, Factory Chain的形式特點。雖然有時候,Functor返回的是自己。
    ?
    The Four and so on?
    還不知道,但相信還有更多。
    ?
    三、回顧小結應用現狀?
    1. JDK和Hibernate的設計提高了開發過程的體驗,還沒有對系統開發有大的影響(或許我的認識還太過于膚淺)?
    2. 而DDD的例子,則實踐了FP的閉包。封裝了對返回值的操作能力,相當于specification的and,or和not包裝了對操作符調用。?
    ??
    BTW:DDD例子中,不同的函數組合后共同操作相同輸入參數。實踐中還會出現不同函數組合在一起,但各自有各自的輸入參數。對于可能存在的Pipe組合,使得操作值和返回值是同一類型,相當于functor包裝了操作符。?
    ??
    3. ajoo的CO例子實踐了FP的高階函數(實踐后看上去像Decorate模式,不過出發點不一樣)。?
    封裝了對流程的控制的能力,提供sequenue和pipe等的計算能力。這樣的設計要求開發者明確了解對高階函數和輸入函數的關系。另外CO沒有提供閉包能力。?
    ??
    無論如何,現有的幾個實踐:JDK,hibernate,ajoo的例子和DDD的例子都說明了:
    基于不同的需求,需要不同的業務行為,函數式編程更多的是一種思路,在OO中沒有也不需要一定的成法。

    不過這些實踐也給了我們實踐一個模式。

    馬嘉楠
    jianan.ma@gmail.com

    posted on 2006-08-24 11:11 馬嘉楠 閱讀(234) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: xx视频在线永久免费观看| 久久久久国产精品免费网站| 久久精品网站免费观看| 亚洲欧洲第一a在线观看| 永久在线观看免费视频| 亚洲日韩乱码中文无码蜜桃臀网站 | 国产免费牲交视频| 国产精品亚洲五月天高清| 日韩精品无码人妻免费视频| 亚洲欧美在线x视频| 国产麻豆免费观看91| 国产精品亚洲综合网站| 免费国产人做人视频在线观看| 国产亚洲精彩视频| 免费看男女下面日出水视频| 日本在线观看免费高清| 亚洲一区AV无码少妇电影☆| 无码午夜成人1000部免费视频| 亚洲伊人久久大香线蕉在观| 麻豆精品国产免费观看| 欧洲美女大片免费播放器视频 | a级毛片毛片免费观看久潮喷 | 区久久AAA片69亚洲| 黄页免费在线观看| 91亚洲精品麻豆| 国产免费小视频在线观看| xxxx日本在线播放免费不卡| 亚洲av无码片在线播放| 亚洲人成无码www久久久| 日韩在线视频播放免费视频完整版| 精品亚洲一区二区三区在线播放| 国产一区二区三区免费| 亚洲av永久综合在线观看尤物| 成在线人永久免费视频播放| WWW国产成人免费观看视频| 亚洲成熟xxxxx电影| 久久久久国色AV免费观看性色| 一级特级女人18毛片免费视频| 亚洲国产精品免费视频| 国产又大又粗又硬又长免费| 久操视频免费观看|