Hello其弊,world霍骄!今天我給大家講一個關(guān)于Java魔鬼國王和他在全國范圍內(nèi)驅(qū)逐動詞的故事群嗤。
注意:這個故事并沒有什么圓滿結(jié)局。如果你心靈脆弱或者吹毛求疵的話氏淑,這個故事不適合你勃蜘。如果你易于動怒或喜歡在別人的博客上妄加評論, 那么請立即停止閱讀夸政。
在我們開始這個故事之前,先讓我們熟悉一下背景:
溢出的垃圾
所有使用Java的人都喜歡“用例”榴徐,所以讓我們以一個用例開始吧:倒垃圾守问。就像這樣:“Johnny匀归,快去倒垃圾,他都快溢出來了耗帕!”
如何表達倒垃圾這一活動呢穆端?如果你是一個正常說英語的人,你可以粗略地用以下幾句話來描述它
即使你不用英語思考仿便,你也會想象出一系列類似的動作体啰。不考慮你選擇的語言,或者采取的具體步驟嗽仪,取決于你采取的行動荒勇,倒垃圾是一系列終止于垃圾在外面,你回到屋子里的動作闻坚。
我們的思想充斥著各種或勇敢的沽翔,或暴躁的,或激昂的動作窿凤。我們生活仅偎,我們呼吸,我們走路雳殊,我們談話橘沥,我們笑,我們哭夯秃,我們希望座咆,我們害怕,我們吃寝并,我們喝箫措, 我們走,我們聽衬潦,我們倒垃圾斤蔓。我們能自由地“做”和“行動”。假如我們只是石頭镀岛,生活沒準還算好弦牡,但是我們不會自由。因為我們可以“做”事漂羊,所以才會自由驾锰。
我們的生活也同時充斥著各種“名詞”。我們吃“名詞”(食物)走越,我們從商店買“名詞”(商品)椭豫,我們坐在“名詞”(凳子)上。 “名詞”(石頭)可能會忽然砸到你頭上,在你的“名詞”(頭)上弄一個“名詞”(大包)赏酥。名詞即事物喳整,想想沒有了事物我們會怎樣?但他們僅僅只是事物裸扶,比如: 意味著結(jié)束或者結(jié)束本身框都,或者一些貴重物品,或者我們周圍經(jīng)澈浅浚看到的事物的名字魏保。這是一座建筑,那是一個石頭摸屠。任何一個小孩子都能指出名詞谓罗,僅此而已。發(fā)生在名詞身上的 “變化”才是最有趣的事情餐塘。
變化需要動作妥衣。動作是生活的調(diào)料。動作甚至給了調(diào)料以調(diào)料戒傻!畢竟除非你“吃”它税手,你是不會感到香這種味道的。名詞也許無處不在需纳,但是生活一直在變并一直有趣的功勞還是在于動詞芦倒、
當然,除了名詞和動詞不翩,我們還有形容詞兵扬,介詞,代詞口蝠,冠詞器钟,連詞,語氣詞妙蔗,和許許多多其他讓我們構(gòu)造有趣語言的詞匯傲霸。它們都在語言中扮演著自己的角色,而且每一個都很重要眉反。 如果它們哪一個不存在了的話昙啄,那是挺遺憾的事情。
那么寸五,如果有一天我們不再用動詞了梳凛,你是不是感到很奇怪呢?
在下面我要給大家講的故事里梳杏,這件事情真的發(fā)生了……
名詞王國
在Java王國中韧拒,國王Java以鐵腕統(tǒng)治著他的國家淹接,而他子民的思考方式也并不和你我一樣。在這里叛溢,你可以看到蹈集,名詞是十分重要的并直接服從國王的命令。 名詞是最重要的居民雇初,它們身穿艷麗的服裝顯得高貴而優(yōu)雅,而這些衣服是由形容詞提供的减响。而形容詞哪靖诗,也很滿意它們的生活,當然支示,他們不可能像名詞那么高貴刊橘, 不過相比于動詞來講卻幸運得很多。
因為颂鸿,動詞在Java王國里的日子促绵,相當,相當?shù)脑愀狻?/p>
奉國王Java的法令嘴纺,動詞是隸屬于名詞的败晴,但他們不僅僅是寵物而已≡钥剩或者說連寵物都不是尖坤,在整個國家,動詞負擔起所有的勞力工作闲擦。實際上慢味,他們是王國的奴隸,至少是 農(nóng)奴或者契約奴之類的墅冷。Java王國的居民對自己的生活還是比較滿意的纯路,他們從來沒有想到會發(fā)生什么變化。
動詞負責王國里的所有工作寞忿,但是仍然獲取不到任何尊重驰唬,甚至都不允許單獨出來。如果一個名詞被發(fā)現(xiàn)在公共場合出現(xiàn)罐脊,它會立即被名詞逮捕定嗓。
當然“逮捕”也是一個動詞,他也從不被允許單獨行動萍桌;你必須創(chuàng)造一個“動詞逮捕著”來協(xié)助逮捕宵溅。但是“創(chuàng)造”和“協(xié)助”哪?這樣的話上炎,“創(chuàng)造者”和“協(xié)助者”也各自在這個工作上 伴隨“創(chuàng)造”和“協(xié)助”起到了重要的作用恃逻。
國王Java雏搂,在他的上帝Sun(現(xiàn)在是Oracle了吧...[譯者注])的指引下,時不時地威脅要將所有動詞驅(qū)逐出王國寇损。如果那一天到來了凸郑,他們當然需要至少一個動詞來做 各種工作,而從國王殘忍的幽默感上猜測矛市,這個動詞很可能就是“執(zhí)行”芙沥。
動詞“執(zhí)行”(execute),和它的親戚“運行”浊吏,“開始”而昨,“走你”,“做”找田,“就這樣做”或者相似的什么詞可以通過找到合適的“執(zhí)行者”來替代任何其他的動詞歌憨。想等(wait)一下? Waiter.execute().刷(brush)牙(teeth)?ToothBrusher(myTeeth).go().扔(take out)垃圾(garbage)?TrashDisposalPlanExecutor.doIt()墩衙。沒有任何 一個動詞是安全的务嫡,一切動詞都會被執(zhí)行的名詞而取代。
在這種精神更加泛濫的角落漆改,名詞已經(jīng)把動詞驅(qū)逐干凈心铃。不仔細看的話,你會覺得仍然有動詞存在挫剑,比如耕種或倒茶壺于个,但是一旦仔細觀察,真相便浮出了水面:名詞可以隨意 命名緊跟在它們后面的動詞“執(zhí)行”暮顺,而不改變自身的角色证鸥。所以掺逼,當你看到“耕地者”在“耕地”,“倒茶壺者”在“倒”或者說“注冊管理者”在“注冊”,你真正看到的是魔鬼國王Java的 “執(zhí)行者”大軍祟牲,只不過他們披著所有者的外衣而已起便。
在其他王國里的動詞
在其他編程語言的王國中理澎,倒垃圾是一件很直白的事情琳骡,和我們用英語表述的十分相似。在Java王國中祈纯,數(shù)據(jù)實體是名詞而函數(shù)是動詞令宿,而在其他王國中卻不然:王國的居民 是混在一起的,而且在能順利完成工作的前提下腕窥,只要他們愿意粒没,既可以是名詞也可以是動詞。
比如在附近的C的領(lǐng)域簇爆,JavaScript的地盤癞松,Perl的地盤和Ruby的地盤爽撒,他們可能會把倒垃圾這件事分解成一系列的動作(或者叫做動詞或者函數(shù))。如果他們將這些 動作以適當?shù)捻樞驊?yīng)用于適當?shù)氖挛铮美烊兀阉鼛С鋈ニ段穑拥嚼袄锏鹊龋估娜蝿?wù)就圓滿成功了枫甲。在這個過程中根本不需要執(zhí)行者或其他的伴隨者這出現(xiàn)源武。
在這些王國里,真的沒有必要創(chuàng)造這么多的包裹器來包裹動詞想幻。他們沒有“垃圾傾倒策略”之類的名詞软能,或者“垃圾傾倒地點定位者”來只是你倒垃圾的路徑,也沒有“倒完垃圾后的回調(diào)”來保證你 倒垃圾后回到自己的沙發(fā)上举畸。他們只是寫一些動詞來操作名詞,并創(chuàng)建一個主要的名詞凳枝,例如,提出垃圾(take_out_garbage())并把一些需要做的子動作放在里面抄沮。
在這些王國中,當需求提升的時候岖瑰,也通常有一種機制來生成比較重要的名詞叛买。如果這些精明的創(chuàng)造者創(chuàng)造出了一個全新的名詞,比如房子蹋订,馬車率挣,或者耕起地來比人還快的機器, 他們會被給予一個統(tǒng)一的概念:類露戒。而人們會給類一個名稱椒功,一個描述,一些狀態(tài)和一些操作建議智什。
這些王國與Java的不同之處在于动漾,動詞是允許單獨出現(xiàn)的,你沒必要創(chuàng)造新的名詞去束縛他們荠锭。
Java王國的人一種輕視的態(tài)度看待他們的鄰居旱眯;而這也是程序諸王國的現(xiàn)狀。
如果你挖個足夠深的洞...
在世界的另一邊证九,有一篇貧瘠的居住地删豺。在那里,動詞居民的地位十分之高愧怜。這就是函數(shù)式王國呀页,包括Haskellia,Ocamlica,Schemeria和一些其它的國家。 因為附近的國家很少拥坛,他們幾乎不與Java王國何其附近的國家有接觸赔桌。也正因為這樣供炎,函數(shù)式諸國們相互輕視,并有事沒事的時候打一仗以排遣寂寞疾党。
在函數(shù)式王國里音诫,名詞和動詞一般被看做同樣等級的居民。但是雪位,名詞竭钝,對是名詞,基本上整天無所事事雹洗。他們的出現(xiàn)在做事或者執(zhí)行任務(wù)的時候并沒有多大意義香罐,因為 活躍的動詞們基本把能做的事情都做了。這里也沒有什么奇怪的法律說要創(chuàng)造各種“幫助者”來幫助動詞做事时肿,因此在這些王國中庇茫,名詞的數(shù)量和實際上存在事物的數(shù)量是相同的。
這樣做的結(jié)果是螃成,動詞在這片土地上為所欲為(請原諒我的用詞)旦签。如果你是一個外來人,你很容易產(chǎn)生名詞(函數(shù))是這里最重要的居民的印象寸宏。順便提一句宁炫, 這也是為什么這里被叫做函數(shù)式諸國還不是事物諸國的原因。
在最為遙遠的地方氮凝,遠離函數(shù)式諸國羔巢,存在著一塊傳說中的土地,“Lamda the Ultimate”(終極lamda罩阵?霸氣~[譯者注])竿秆。傳說中在那里,沒有名詞稿壁,只有動詞袍辞。 那里有事物,但事物由動詞組成常摧。如果傳說不虛搅吁,甚至數(shù)字,那里最為流行的貨幣落午,也是動詞谎懦!數(shù)字0被表示為lamda(),數(shù)字1是lamda(lamda())溃斋,2是lamda(lamda(lamda())),以此類推界拦。
在這片神奇的土地上,一切事物梗劫,別管你是名詞享甸,動詞截碴,還是其他什么,都是由最基本的動詞lamda組成的蛉威。
老實說日丹,Java王國中幸福生活著的居民并沒有意識到另外一個世界的存在。你能想象得知此事之后的文化震動么蚯嫌?他們可能會發(fā)明一個新的名詞(比如“憎惡”)來表達自己新的感受哲虾。
Java王國中的居民真的快樂么?
你可能覺得Java王國中的生活有點奇怪择示,如果糟糕的話還效率還會變得十分低下束凑。不過,你能從一個地方的童謠中看出他們的幸福程度栅盲,而Java王國的童謠汪诉,是一群古怪的詩。 比如谈秫,這里的兒童經(jīng)常朗誦的寓言: (這就不翻了[譯者注])
直到今天扒寄,這仍然是美好的建議。
盡管在Java王國的敘述方式和本.富蘭克林的原作大有不同孝常,但是這里的居民覺得他們的重新編排還是有一種不同的魅力在里面。
而最大的魅力在于“架構(gòu)”蚓哩,是所有人都能看見的构灸。架構(gòu)被國王Java授予了之高無上的地位,因為岸梨,架構(gòu)全部是由名詞構(gòu)成的喜颁。正如我們所知的,在Java王國曹阔,名詞即事物半开,事物 的榮耀高于一切的動詞。架構(gòu)由無數(shù)事物構(gòu)成:你可以看或觸摸的事物赃份,給你留下壯觀印象的事物寂拆,用棍子刮擦發(fā)出美妙聲音的事物。國王Java抓韩,十分喜歡刮擦的噪音纠永; 每當他新?lián)Q車夫的時候,踢輪子發(fā)出的美妙聲音讓他覺得很滿意谒拴。不管上面的故事有什么瑕疵尝江,“事物”總是不缺少的。
作為人類英上,我們的第一本能總是尋找由各宗物體構(gòu)成的庇護炭序。庇護越堅固啤覆,我們感覺越安全。在Java王國惭聂,有很過堅固的東西讓居民們感到安心窗声。他們感慨如此龐大的架構(gòu) 建造之神奇并認為它是“最為堅固的設(shè)計”。而且每當結(jié)構(gòu)變化時彼妻,他們就越堅信這點嫌佑。接著,架構(gòu)的力量也變得強的令人生畏以至于沒有人認為可以摧毀他侨歉。
除了堅固的架構(gòu)之外屋摇,在Java王國中的所有東西很有調(diào)理地組織著:你會發(fā)現(xiàn)任何名詞都會呆在適當?shù)牡胤健_@里每個故事都有一個固定的模式:實例構(gòu)造在故事的表述中占了主要的篇幅幽邓, 因為每個抽象都會有一個管理者(Manager)炮温,而且每個管理者都有一個run()方法。Java居民們覺得他們可以用這種模型表述任何事情牵舵。這是一種“名詞計算”柒啤,只要你愿意, 它可以滿足任何抽象畸颅,任何計算担巩。你需要的僅僅是足夠的名詞,名詞的構(gòu)造器没炒,獲取器方法涛癌,和重要的execute()函數(shù)來實現(xiàn)你的計劃。
Java王國的居民活的不僅僅是幸福送火,簡直是迸發(fā)出強烈的自豪感拳话。
StateManager.getConsiderationSetter("Noun Oriented Thinking", State.HARMFUL).run()
或者,正如外面的世界所說种吸,“面向名詞的思考是有害的”
面向?qū)ο蟮木幊贪衙~放到首位弃衍,但是我們?yōu)槭裁捶堑冒衙~捧上神壇以至于讓語句變的如此啰嗦哪? 為什么一種語句成分的低位非得高于另外一種坚俗?這并不是好像面向?qū)ο蟮木幊掏蝗皇沟脛釉~的低位降低镜盯,正如我們認為的那樣。 這是一種奇怪的認識的扭曲猖败。正如我的朋友 Jacob Gabrielso一次說到形耗,提倡面向?qū)ο蟮木幊毯帽忍岢嫦蜓澴拥拇┮路绞健?/p>
Java的靜態(tài)類型系統(tǒng),像起他任何類似的語言一樣辙浑,有著共同的問題激涤。但是過分強調(diào)面向名詞的編程思想給人帶來很大的困擾。 任何類型系統(tǒng)都會要求你重新梳理思路來配合它,但是清除獨立的動詞看起來十分不合情理倦踢。
C++并沒有這個問題送滞。因為C++作為C語言的超集允許你定義單獨的函數(shù)。 此外辱挥,C++提供了獨立的命名空間的概念犁嗅。Java的類承載了太多的內(nèi)容:命名空間,用戶自定義類型晤碘,句法委托機制褂微,可見性和作用域機制,等等园爷。
不要誤解了我的意思宠蚂。我并沒有說C++“好”,我只是贊美它至少相比于Java來講靈活的類型系統(tǒng)童社。C++出現(xiàn)問題會讓聽眾抓狂并且想殺了你 (比如求厕,意想不到的段錯誤和其他難以發(fā)現(xiàn)的隱患)。并且在C++你很難找到一個能描述你的想法的咒語扰楼。 但是它靈活地可表述的思想的范圍卻遠遠超出了Java呀癣。因為C++提供給你了動詞,誰想用一個沒有動詞的語言說話哪弦赖?
類是Java中唯一提供的建模的工具项栏。所以當一個新的想法出現(xiàn)在你腦海的時候,你不得不重塑它蹬竖,包裝它沼沈,甚至弄碎它直到它變成一個名詞, 即使它開始是一個動作案腺,過程庆冕,或者任何其他不是“物”的概念康吵。
我似乎回到了8,9年前一幫搞Perl的家伙對我說的:“伙計劈榨,并不是所有的東西都是對象的』耷叮”
很奇怪同辣,Java似乎是主流面向?qū)ο笳Z言中唯一一個完全以名詞為中心的語言。 在Python或者Ruby中惭载,你不會找到AbstractProxyMediator旱函,NotificationStrategyFactory或者其他類似的東西。 為什么在Java中它們滿地都是描滔?我敢打賭這是原因出在了動詞的身上棒妨。Python,Ruby含长,JavaScript券腔,Perl當然伏穆,還有所有的函數(shù)式編程語言允許你聲明并傳遞函數(shù)而不用用類包裝它。
很顯然纷纫,動態(tài)類型語言的使用更容易枕扫;你可以僅僅傳遞一個引用給函數(shù),函數(shù)可以用名字獲取它辱魁,而函數(shù)的調(diào)用者僅僅用合適的參數(shù)調(diào)用函數(shù)并正確地使用返回的值就可以了烟瞧。
但是很多靜態(tài)類型的語言同樣也有第一類的函數(shù)。 這包括固定類型的語言比如C和C++染簇,還有類型自動推斷的語言比如Haskell和ML参滴。 這些語言僅僅需要一些語法來建立,傳遞和調(diào)用函數(shù)的內(nèi)容就可以了剖笙。
Java沒有理由不簡單地添加第一類函數(shù)并最終實現(xiàn)一個成熟的卵洗,沒有扭曲的可以讓人自由運用動詞來實現(xiàn)他們想法的世界。 實際上弥咪,有一個基于JVM叫做 The Nice programming language 的語言實現(xiàn)了一個非常類似Java的語法过蹂,并包含了一個非常具有表現(xiàn)力的實現(xiàn)了使用動詞方式:獨立函數(shù)。 而Java強制你用Callback聚至,Ruunable或其他匿名接口來包裝它為一個類以便于調(diào)用酷勺。
Sun公司甚至沒有打破他們一切函數(shù)都必須被類擁有的信條。任何匿名的函數(shù)都會具有一個隱式的this指針指向定義它的類扳躬;問題解決了脆诉。
我不知道為什么Sun公司堅持Java矗立在名詞王國。我懷疑這是低估了他們的民眾贷币;他們添加了泛型击胜,一個更加復(fù)雜的概念,所以他們不再關(guān)心如何保持他們語法的簡練役纹。 并且添加動詞并不是一件壞事偶摔,這是因為Java現(xiàn)今所建立的:為一個Java程序員提供工具讓他們按自己的想法編程更有意義。
我真心希望Java能修復(fù)這個缺陷促脉,以便我可以把垃圾帶出去并回來玩游戲或者一切當時在做的事情辰斋。