〇,簡介
Gavator(Generic Java Functor)試圖探索以普通Java語法進(jìn)行函數(shù)式編程的可行性,并盡可能的保證使用的方便性,良好的可讀性和基本的類型安全性
-
項(xiàng)目信息:http://cosoft.org.cn/projects/gavator/
-
CVS信息:http://cosoft.org.cn/cvs/?group_id=5717,推薦Eclipse直連,模塊名是Gavator
-
下載地址:http://cosoft.org.cn/download.php?g_u_n=gavator&f=Gavator_0.6.zip&file_id=7000
一,功能
所有功能都是類型安全的,無需涉及強(qiáng)制轉(zhuǎn)型
-
提供了若干算法:transform/map, select/filter, accumulate/reduce, foreach/enumerate, findfirst等
-
提供了若干適配器:bind,bind1st, bind2nd等
-
提供了常用控制結(jié)構(gòu)的函數(shù)形式和functor形式:dowhile/whiledo, dountil/untildo, ifelse等
-
提供了常用邏輯運(yùn)算結(jié)構(gòu)的函數(shù)形式和functor形式:and,or,not等
-
提供了常用數(shù)據(jù)結(jié)構(gòu):filter,pipe等
二,結(jié)構(gòu)
Gavator的結(jié)構(gòu)是層次化的
-
最核心的是一組接口:分別定義了Procedure,Predicate,F(xiàn)unction的零元,一元,二元形式
-
基于這些接口,以functor的形式提供了常用概念的實(shí)現(xiàn),包括數(shù)據(jù)結(jié)構(gòu),控制結(jié)構(gòu),適配器等,如Filter/Pipe,Bind,And/Or/Not,WhileDo/IfElse等
-
基于這些結(jié)構(gòu)和適配器,以function的形式實(shí)現(xiàn)了使用方便和可讀性好的包裝,如pipe,bind,and/or/not, ifelse等
三,用法
附帶的測(cè)試用例可用來簡單說明一下用法;其實(shí)所有functor和algorithm都很直觀,看到名稱和參數(shù),即能領(lǐng)會(huì)它的用法;并且代碼量非常少,半個(gè)小時(shí)就能將所有代碼瀏覽一遍
曾經(jīng)聽說ThoughtWorks的敏捷項(xiàng)目中平均每個(gè)函數(shù)代碼控制在三行以下,Gavator中每個(gè)函數(shù)平均只有不到兩行代碼
|
四,擴(kuò)展
使用者可以在Gavator結(jié)構(gòu)的任何一次層次對(duì)Gavator進(jìn)行擴(kuò)充,如擴(kuò)充functor實(shí)現(xiàn)其它設(shè)計(jì)模式和常用概念,或編寫更多的算法,結(jié)合import static,提高客戶代碼的可讀性
目前Gavator to be contributed的是 ContinuationFramework 和 QueryFramework
五,問題
-
Gavator的主要思想來自C++ STL和Apache Common Funtor,我對(duì)純粹的函數(shù)式語言如Scheme,Haskell并沒有太多經(jīng)驗(yàn),因此Gavator最主要的問題是:它做的是否正確?
-
Gavator還不完整,如尚未將Functor實(shí)現(xiàn)為值語義等
-
好的名稱有助于減少文檔,促進(jìn)理解,但同一個(gè)概念在不同的社團(tuán)可能有不同的慣用名稱,如transform和map,select和filter,accumulate和reduce,等等;Gavator選擇了使用STL和Apache Common Functor中的名稱
-
序列操作的參數(shù)應(yīng)該是Collection還是Iterator ?STL和Apache Common Functor選擇了Iterator,我感覺大部分情況下Collection更方便,就用了Collection
-
目前Gavator其實(shí)并不是很實(shí)用,像ifelse等基本是花拳繡腿,關(guān)鍵是要基于Gavator,發(fā)展出專注于某個(gè)應(yīng)用領(lǐng)域的framework,如Continuation和Query
六、其它
Java語言本身的簡單,造成了對(duì)Functional Programming支持的限制,Apache Common Functor至今還是sandbox;這些限制包括:
-
函數(shù)不是first class,不是一等公民,更別提lambda表達(dá)式
-
primitive type與class無法完全統(tǒng)一,你試試能否寫一個(gè)通用的accumulate支持int集合,long集合,double集合的累加就知道了
-
不支持操作符重載,當(dāng)然,這不是本質(zhì)問題
-
使用擦拭法實(shí)現(xiàn)generic,使你不能對(duì)T調(diào)用任意函數(shù),無法特化,沒有typedef,只能用繼承來模擬,任何動(dòng)態(tài)特性都將使generic喪失類型安全性,如序列化后反序列化,反射等
-
甚至不能return void,這使Procedure和Function在實(shí)現(xiàn)上無法統(tǒng)一以減少代碼,雖然在概念上它們是獨(dú)立的
或許Java平臺(tái)上的函數(shù)式編程的支持將使用專門的語言來解決
Gavator起源于去年的一個(gè)項(xiàng)目,在那個(gè)項(xiàng)目里實(shí)現(xiàn)了一個(gè)基于Functor的查詢框架,增加一種條件只需實(shí)現(xiàn)Condition接口,當(dāng)然,Condition是一個(gè)Predicate,然后就可以和已有的各種Condition通過and,or,not等組合出各種復(fù)合查詢,提供服務(wù)的一方通過恒定不變的代碼select(Collection, Condition)來滿足任意的查詢;希望接下來實(shí)現(xiàn)一個(gè)封裝了各種查詢(對(duì)象,SQL,XPath/XQuery等)的QueryFramework
另外對(duì)Continuation的支持也值得一做,希望得到幫助,mailto:ajaxchelsea@163.com