名词王国的死刑
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
我真的沒看懂,可能是我沒寫過java吧??
Steve Yegge的大作《Execution in the Kingdom of Nouns》
http://justjavac.iteye.com/blog/1604046
Hello,world!今天我給大家講一個(gè)關(guān)于Java魔鬼國(guó)王和他在全國(guó)范圍內(nèi)驅(qū)逐動(dòng)詞的故事。
注意:這個(gè)故事并沒有什么圓滿結(jié)局。如果你心靈脆弱或者吹毛求疵的話,這個(gè)故事不適合你。 如果你易于動(dòng)怒或喜歡在別人的博客上妄加評(píng)論, 那么請(qǐng)立即停止閱讀。
在我們開始這個(gè)故事之前,先讓我們熟悉一下背景:
溢出的垃圾
所有使用Java的人都喜歡“用例”,所以讓我們以一個(gè)用例開始吧:倒垃圾。就像這樣:“Johnny,快去倒垃圾,他都快溢出來了!”
如何表達(dá)倒垃圾這一活動(dòng)呢?如果你是一個(gè)正常說英語(yǔ)的人,你可以粗略地用以下幾句話來描述它
在水池下取出垃圾袋 帶著垃圾袋去車庫(kù) 把它扔到垃圾桶里 走回來 洗手 坐回沙發(fā)上 繼續(xù)玩你的電視游戲(或者干其他的事)即使你不用英語(yǔ)思考,你也會(huì)想象出一系列類似的動(dòng)作。 不考慮你選擇的語(yǔ)言,或者采取的具體步驟,取決于你采取的行動(dòng),倒垃圾是一系列終止于垃圾在外面,你回到屋子里的動(dòng)作。
我們的思想充斥著各種或勇敢的,或暴躁的,或激昂的動(dòng)作。 我們生活,我們呼吸,我們走路,我們談話,我們笑,我們哭,我們希望,我們害怕,我們吃,我們喝, 我們走,我們聽,我們倒垃圾。 我們能自由地“做”和“行動(dòng)”。假如我們只是石頭,生活沒準(zhǔn)還算好,但是我們不會(huì)自由。因?yàn)槲覀兛梢浴白觥笔?#xff0c;所以才會(huì)自由。
我們的生活也同時(shí)充斥著各種“名詞”。我們吃“名詞”(食物),我們從商店買“名詞”(商品),我們坐在“名詞”(凳子)上。 “名詞”(石頭)可能會(huì)忽然砸到你頭上,在你的“名詞”(頭)上弄一個(gè)“名詞”(大包)。 名詞即事物,想想沒有了事物我們會(huì)怎樣? 但他們僅僅只是事物,比如: 意味著結(jié)束或者結(jié)束本身,或者一些貴重物品,或者我們周圍經(jīng)??吹降氖挛锏拿帧?這是一座建筑,那是一個(gè)石頭。任何一個(gè)小孩子都能指出名詞,僅此而已。 發(fā)生在名詞身上的 “變化”才是最有趣的事情。
變化需要?jiǎng)幼鳌?動(dòng)作是生活的調(diào)料。 動(dòng)作甚至給了調(diào)料以調(diào)料! 畢竟除非你“吃”它,你是不會(huì)感到香這種味道的。 名詞也許無處不在,但是生活一直在變并一直有趣的功勞還是在于動(dòng)詞、
當(dāng)然,除了名詞和動(dòng)詞,我們還有形容詞,介詞,代詞,冠詞,連詞,語(yǔ)氣詞,和許許多多其他讓我們構(gòu)造有趣語(yǔ)言的詞匯。 它們都在語(yǔ)言中扮演著自己的角色,而且每一個(gè)都很重要。 如果它們哪一個(gè)不存在了的話,那是挺遺憾的事情。
那么,如果有一天我們不再用動(dòng)詞了,你是不是感到很奇怪呢?
在下面我要給大家講的故事里,這件事情真的發(fā)生了……
名詞王國(guó)
在Java王國(guó)中,國(guó)王Java以鐵腕統(tǒng)治著他的國(guó)家,而他子民的思考方式也并不和你我一樣。 在這里,你可以看到,名詞是十分重要的并直接服從國(guó)王的命令。 名詞是最重要的居民,它們身穿艷麗的服裝顯得高貴而優(yōu)雅,而這些衣服是由形容詞提供的。 而形容詞哪,也很滿意它們的生活,當(dāng)然,他們不可能像名詞那么高貴, 不過相比于動(dòng)詞來講卻幸運(yùn)得很多。
因?yàn)?#xff0c;動(dòng)詞在Java王國(guó)里的日子,相當(dāng),相當(dāng)?shù)脑愀狻?
奉國(guó)王Java的法令,動(dòng)詞是隸屬于名詞的,但他們不僅僅是寵物而已。 或者說連寵物都不是,在整個(gè)國(guó)家,動(dòng)詞負(fù)擔(dān)起所有的勞力工作。 實(shí)際上,他們是王國(guó)的奴隸,至少是 農(nóng)奴或者契約奴之類的。 Java王國(guó)的居民對(duì)自己的生活還是比較滿意的,他們從來沒有想到會(huì)發(fā)生什么變化。
動(dòng)詞負(fù)責(zé)王國(guó)里的所有工作,但是仍然獲取不到任何尊重,甚至都不允許單獨(dú)出來。 如果一個(gè)名詞被發(fā)現(xiàn)在公共場(chǎng)合出現(xiàn),它會(huì)立即被名詞逮捕。
當(dāng)然“逮捕”也是一個(gè)動(dòng)詞,他也從不被允許單獨(dú)行動(dòng);你必須創(chuàng)造一個(gè)“動(dòng)詞逮捕著”來協(xié)助逮捕。 但是“創(chuàng)造”和“協(xié)助”哪?這樣的話,“創(chuàng)造者”和“協(xié)助者”也各自在這個(gè)工作上 伴隨“創(chuàng)造”和“協(xié)助”起到了重要的作用。
國(guó)王Java,在他的上帝Sun(現(xiàn)在是Oracle了吧...[譯者注])的指引下,時(shí)不時(shí)地威脅要將所有動(dòng)詞驅(qū)逐出王國(guó)。 如果那一天到來了,他們當(dāng)然需要至少一個(gè)動(dòng)詞來做 各種工作,而從國(guó)王殘忍的幽默感上猜測(cè),這個(gè)動(dòng)詞很可能就是“執(zhí)行”。
動(dòng)詞“執(zhí)行”(execute),和它的親戚“運(yùn)行”,“開始”,“走你”,“做”,“就這樣做” 或者相似的什么詞可以通過找到合適的“執(zhí)行者”來替代任何其他的動(dòng)詞。 想等(wait)一下? Waiter.execute().刷(brush)牙(teeth)?ToothBrusher(myTeeth).go().扔(take out)垃圾(garbage)?TrashDisposalPlanExecutor.doIt()。 沒有任何 一個(gè)動(dòng)詞是安全的,一切動(dòng)詞都會(huì)被執(zhí)行的名詞而取代。
在這種精神更加泛濫的角落,名詞已經(jīng)把動(dòng)詞驅(qū)逐干凈。 不仔細(xì)看的話,你會(huì)覺得仍然有動(dòng)詞存在,比如耕種或倒茶壺,但是一旦仔細(xì)觀察, 真相便浮出了水面:名詞可以隨意 命名緊跟在它們后面的動(dòng)詞“執(zhí)行”,而不改變自身的角色。 所以,當(dāng)你看到“耕地者”在“耕地”,“倒茶壺者”在“倒”或者說“注冊(cè)管理者”在“注冊(cè)”, 你真正看到的是魔鬼國(guó)王Java的 “執(zhí)行者”大軍,只不過他們披著所有者的外衣而已。
在其他王國(guó)里的動(dòng)詞
在其他編程語(yǔ)言的王國(guó)中,倒垃圾是一件很直白的事情,和我們用英語(yǔ)表述的十分相似。 在Java王國(guó)中,數(shù)據(jù)實(shí)體是名詞而函數(shù)是動(dòng)詞,而在其他王國(guó)中卻不然:王國(guó)的居民是混在一起的, 而且在能順利完成工作的前提下,只要他們?cè)敢?#xff0c;既可以是名詞也可以是動(dòng)詞。
比如在附近的C的領(lǐng)域,JavaScript的地盤,Perl的地盤和Ruby的地盤, 他們可能會(huì)把倒垃圾這件事分解成一系列的動(dòng)作(或者叫做動(dòng)詞或者函數(shù))。 如果他們將這些 動(dòng)作以適當(dāng)?shù)捻樞驊?yīng)用于適當(dāng)?shù)氖挛?#xff08;拿垃圾,把它帶出去,扔到垃圾桶里等等),倒垃圾的任務(wù)就圓滿成功了。 在這個(gè)過程中根本不需要執(zhí)行者或其他的伴隨者這出現(xiàn)。
在這些王國(guó)里,真的沒有必要?jiǎng)?chuàng)造這么多的包裹器來包裹動(dòng)詞。 他們沒有“垃圾傾倒策略”之類的名詞,或者“垃圾傾倒地點(diǎn)定位者”來只是你倒垃圾的路徑, 也沒有“倒完垃圾后的回調(diào)”來保證你倒垃圾后回到自己的沙發(fā)上。 他們只是寫一些動(dòng)詞來操作名詞,并創(chuàng)建一個(gè)主要的名詞,例如,提出垃圾(take_out_garbage())并把一些需要做的子動(dòng)作放在里面。
在這些王國(guó)中,當(dāng)需求提升的時(shí)候,也通常有一種機(jī)制來生成比較重要的名詞。 如果這些精明的創(chuàng)造者創(chuàng)造出了一個(gè)全新的名詞,比如房子,馬車,或者耕起地來比人還快的機(jī)器, 他們會(huì)被給予一個(gè)統(tǒng)一的概念:類。 而人們會(huì)給類一個(gè)名稱,一個(gè)描述,一些狀態(tài)和一些操作建議。
這些王國(guó)與Java的不同之處在于,動(dòng)詞是允許單獨(dú)出現(xiàn)的,你沒必要?jiǎng)?chuàng)造新的名詞去束縛他們。
Java王國(guó)的人一種輕視的態(tài)度看待他們的鄰居;而這也是程序諸王國(guó)的現(xiàn)狀。
如果你挖個(gè)足夠深的洞...
在世界的另一邊,有一篇貧瘠的居住地。 在那里,動(dòng)詞居民的地位十分之高。 這就是函數(shù)式王國(guó),包括Haskellia,Ocamlica,Schemeria和一些其它的國(guó)家。 因?yàn)楦浇膰?guó)家很少,他們幾乎不與Java王國(guó)何其附近的國(guó)家有接觸。 也正因?yàn)檫@樣,函數(shù)式諸國(guó)們相互輕視,并有事沒事的時(shí)候打一仗以排遣寂寞。
在函數(shù)式王國(guó)里,名詞和動(dòng)詞一般被看做同樣等級(jí)的居民。 但是,名詞,對(duì)是名詞,基本上整天無所事事。 他們的出現(xiàn)在做事或者執(zhí)行任務(wù)的時(shí)候并沒有多大意義,因?yàn)?活躍的動(dòng)詞們基本把能做的事情都做了。 這里也沒有什么奇怪的法律說要?jiǎng)?chuàng)造各種“幫助者”來幫助動(dòng)詞做事,因此在這些王國(guó)中,名詞的數(shù)量和實(shí)際上存在事物的數(shù)量是相同的。
這樣做的結(jié)果是,動(dòng)詞在這片土地上為所欲為(請(qǐng)?jiān)徫业挠迷~)。 如果你是一個(gè)外來人,你很容易產(chǎn)生名詞(函數(shù))是這里最重要的居民的印象。 順便提一句, 這也是為什么這里被叫做函數(shù)式諸國(guó)還不是事物諸國(guó)的原因。
在最為遙遠(yuǎn)的地方,遠(yuǎn)離函數(shù)式諸國(guó),存在著一塊傳說中的土地, “Lamda the Ultimate”(終極lamda?霸氣~[譯者注])。傳說中在那里,沒有名詞,只有動(dòng)詞。 那里有事物,但事物由動(dòng)詞組成。如果傳說不虛,甚至數(shù)字,那里最為流行的貨幣,也是動(dòng)詞! 數(shù)字0被表示為lamda(),數(shù)字1是lamda(lamda()),2是lamda(lamda(lamda())),以此類推。
在這片神奇的土地上,一切事物,別管你是名詞,動(dòng)詞,還是其他什么,都是由最基本的動(dòng)詞lamda組成的。
老實(shí)說,Java王國(guó)中幸福生活著的居民并沒有意識(shí)到另外一個(gè)世界的存在。 你能想象得知此事之后的文化震動(dòng)么?他們可能會(huì)發(fā)明一個(gè)新的名詞(比如“憎惡”)來表達(dá)自己新的感受。
Java王國(guó)中的居民真的快樂么?
你可能覺得Java王國(guó)中的生活有點(diǎn)奇怪,如果糟糕的話還效率還會(huì)變得十分低下。 不過,你能從一個(gè)地方的童謠中看出他們的幸福程度,而Java王國(guó)的童謠,是一群古怪的詩(shī)。 比如,這里的兒童經(jīng)常朗誦的寓言: (這就不翻了[譯者注])
For the lack of a nail,throw new HorseshoeNailNotFoundException("no nails!");For the lack of a horseshoe,EquestrianDoctor.getLocalInstance().getHorseDispatcher().shoot();For the lack of a horse,RidersGuild.getRiderNotificationSubscriberList().getBroadcaster().run(new BroadcastMessage(StableFactory.getNullHorseInstance()));For the lack of a rider,MessageDeliverySubsystem.getLogger().logDeliveryFailure(MessageFactory.getAbstractMessageInstance(new MessageMedium(MessageType.VERBAL),new MessageTransport(MessageTransportType.MOUNTED_RIDER),new MessageSessionDestination(BattleManager.getRoutingInfo(BattleLocation.NEAREST))),MessageFailureReasonCode.UNKNOWN_RIDER_FAILURE);For the lack of a message,((BattleNotificationSender)BattleResourceMediator.getMediatorInstance().getResource(BattleParticipant.PROXY_PARTICIPANT,BattleResource.BATTLE_NOTIFICATION_SENDER)).sendNotification(((BattleNotificationBuilder)(BattleResourceMediator.getMediatorInstance().getResource(BattleOrganizer.getBattleParticipant(Battle.Participant.GOOD_GUYS),BattleResource.BATTLE_NOTIFICATION_BUILDER))).buildNotification(BattleOrganizer.getBattleState(BattleResult.BATTLE_LOST),BattleManager.getChainOfCommand().getCommandChainNotifier()));For the lack of a battle,try {synchronized(BattleInformationRouterLock.getLockInstance()) {BattleInformationRouterLock.getLockInstance().wait();}} catch (InterruptedException ix) {if (BattleSessionManager.getBattleStatus(BattleResource.getLocalizedBattleResource(Locale.getDefault()),BattleContext.createContext(Kingdom.getMasterBattleCoordinatorInstance(new TweedleBeetlePuddlePaddleBattle()).populate(RegionManager.getArmpitProvince(Armpit.LEFTMOST)))) ==BattleStatus.LOST) {if (LOGGER.isLoggable(Level.TOTALLY_SCREWED)) {LOGGER.logScrewage(BattleLogger.createBattleLogMessage(BattleStatusFormatter.format(BattleStatus.LOST_WAR,Locale.getDefault())));}}}For the lack of a war,new ServiceExecutionJoinPoint(DistributedQueryAnalyzer.forwardQueryResult(NotificationSchemaManager.getAbstractSchemaMapper(new PublishSubscribeNotificationSchema()).getSchemaProxy().executePublishSubscribeQueryPlan(NotificationSchema.ALERT,new NotificationSchemaPriority(SchemaPriority.MAX_PRIORITY),new PublisherMessage(MessageFactory.getAbstractMessage(MessageType.WRITTEN,new MessageTransport(MessageTransportType.WOUNDED_SURVIVOR),new MessageSessionDestination(DestinationManager.getNullDestinationForQueryPlan()))),DistributedWarMachine.getPartyRoleManager().getRegisteredParties(PartyRoleManager.PARTY_KING ||PartyRoleManager.PARTY_GENERAL ||PartyRoleManager.PARTY_AMBASSADOR)).getQueryResult(),PriorityMessageDispatcher.getPriorityDispatchInstance())).waitForService();All for the lack of a horseshoe nail.直到今天,這仍然是美好的建議。
盡管在Java王國(guó)的敘述方式和本.富蘭克林的原作大有不同,但是這里的居民覺得他們的重新編排還是有一種不同的魅力在里面。
而最大的魅力在于“架構(gòu)”,是所有人都能看見的。 架構(gòu)被國(guó)王Java授予了之高無上的地位,因?yàn)?#xff0c;架構(gòu)全部是由名詞構(gòu)成的。 正如我們所知的,在Java王國(guó),名詞即事物,事物 的榮耀高于一切的動(dòng)詞。 架構(gòu)由無數(shù)事物構(gòu)成:你可以看或觸摸的事物,給你留下壯觀印象的事物,用棍子刮擦發(fā)出美妙聲音的事物。 國(guó)王Java,十分喜歡刮擦的噪音; 每當(dāng)他新?lián)Q車夫的時(shí)候,踢輪子發(fā)出的美妙聲音讓他覺得很滿意。 不管上面的故事有什么瑕疵,“事物”總是不缺少的。
作為人類,我們的第一本能總是尋找由各宗物體構(gòu)成的庇護(hù)。 庇護(hù)越堅(jiān)固,我們感覺越安全。 在Java王國(guó),有很過堅(jiān)固的東西讓居民們感到安心。 他們感慨如此龐大的架構(gòu) 建造之神奇并認(rèn)為它是“最為堅(jiān)固的設(shè)計(jì)”。 而且每當(dāng)結(jié)構(gòu)變化時(shí),他們就越堅(jiān)信這點(diǎn)。 接著,架構(gòu)的力量也變得強(qiáng)的令人生畏以至于沒有人認(rèn)為可以摧毀他。
除了堅(jiān)固的架構(gòu)之外,在Java王國(guó)中的所有東西很有調(diào)理地組織著:你會(huì)發(fā)現(xiàn)任何名詞都會(huì)呆在適當(dāng)?shù)牡胤健?這里每個(gè)故事都有一個(gè)固定的模式:實(shí)例構(gòu)造在故事的表述中占了主要的篇幅, 因?yàn)槊總€(gè)抽象都會(huì)有一個(gè)管理者(Manager), 而且每個(gè)管理者都有一個(gè)run()方法。 Java居民們覺得他們可以用這種模型表述任何事情。 這是一種“名詞計(jì)算”,只要你愿意, 它可以滿足任何抽象,任何計(jì)算。 你需要的僅僅是足夠的名詞,名詞的構(gòu)造器,獲取器方法,和重要的execute()函數(shù)來實(shí)現(xiàn)你的計(jì)劃。
Java王國(guó)的居民活的不僅僅是幸福,簡(jiǎn)直是迸發(fā)出強(qiáng)烈的自豪感。
面向?qū)ο?
StateManager.getConsiderationSetter("Noun Oriented Thinking", State.HARMFUL).run()或者, 正如外面的世界所說,“面向名詞的思考是有害的”
面向?qū)ο蟮木幊贪衙~放到首位,但是我們?yōu)槭裁捶堑冒衙~捧上神壇以至于讓語(yǔ)句變的如此啰嗦哪? 為什么一種語(yǔ)句成分的低位非得高于另外一種?這并不是好像面向?qū)ο蟮木幊掏蝗皇沟脛?dòng)詞的低位降低,正如我們認(rèn)為的那樣。 這是一種奇怪的認(rèn)識(shí)的扭曲。 正如我的朋友 Jacob Gabrielso一次說到,提倡面向?qū)ο蟮木幊毯帽忍岢嫦蜓澴拥拇┮路绞健?
Java的靜態(tài)類型系統(tǒng),像起他任何類似的語(yǔ)言一樣,有著共同的問題。 但是過分強(qiáng)調(diào)面向名詞的編程思想給人帶來很大的困擾。 任何類型系統(tǒng)都會(huì)要求你重新梳理思路來配合它,但是清除獨(dú)立的動(dòng)詞看起來十分不合情理。
C++并沒有這個(gè)問題。因?yàn)镃++作為C語(yǔ)言的超集允許你定義單獨(dú)的函數(shù)。 此外,C++提供了獨(dú)立的命名空間的概念。 Java的類承載了太多的內(nèi)容:命名空間,用戶自定義類型,句法委托機(jī)制,可見性和作用域機(jī)制,等等。
不要誤解了我的意思。 我并沒有說C++“好”,我只是贊美它至少相比于Java來講靈活的類型系統(tǒng)。 C++出現(xiàn)問題會(huì)讓聽眾抓狂并且想殺了你 (比如,意想不到的段錯(cuò)誤和其他難以發(fā)現(xiàn)的隱患)。 并且在C++你很難找到一個(gè)能描述你的想法的咒語(yǔ)。 但是它靈活地可表述的思想的范圍卻遠(yuǎn)遠(yuǎn)超出了Java。 因?yàn)镃++提供給你了動(dòng)詞,誰想用一個(gè)沒有動(dòng)詞的語(yǔ)言說話哪?
類是Java中唯一提供的建模的工具。 所以當(dāng)一個(gè)新的想法出現(xiàn)在你腦海的時(shí)候,你不得不重塑它,包裝它,甚至弄碎它直到它變成一個(gè)名詞, 即使它開始是一個(gè)動(dòng)作,過程,或者任何其他不是“物”的概念。
我似乎回到了8,9年前一幫搞Perl的家伙對(duì)我說的:“伙計(jì),并不是所有的東西都是對(duì)象的?!?
很奇怪,Java似乎是主流面向?qū)ο笳Z(yǔ)言中唯一一個(gè)完全以名詞為中心的語(yǔ)言。 在Python或者Ruby中,你不會(huì)找到AbstractProxyMediator,NotificationStrategyFactory或者其他類似的東西。 為什么在Java中它們滿地都是? 我敢打賭這是原因出在了動(dòng)詞的身上。 Python,Ruby,JavaScript,Perl當(dāng)然,還有所有的函數(shù)式編程語(yǔ)言允許你聲明并傳遞函數(shù)而不用用類包裝它。
很顯然,動(dòng)態(tài)類型語(yǔ)言的使用更容易; 你可以僅僅傳遞一個(gè)引用給函數(shù),函數(shù)可以用名字獲取它,而函數(shù)的調(diào)用者僅僅用合適的參數(shù)調(diào)用函數(shù)并正確地使用返回的值就可以了。
但是很多靜態(tài)類型的語(yǔ)言同樣也有第一類的函數(shù)。 這包括固定類型的語(yǔ)言比如C和C++,還有類型自動(dòng)推斷的語(yǔ)言比如Haskell和ML。 這些語(yǔ)言僅僅需要一些語(yǔ)法來建立,傳遞和調(diào)用函數(shù)的內(nèi)容就可以了。
Java沒有理由不簡(jiǎn)單地添加第一類函數(shù)并最終實(shí)現(xiàn)一個(gè)成熟的,沒有扭曲的可以讓人自由運(yùn)用動(dòng)詞來實(shí)現(xiàn)他們想法的世界。 實(shí)際上,有一個(gè)基于JVM叫做 The Nice programming language 的語(yǔ)言實(shí)現(xiàn)了一個(gè)非常類似Java的語(yǔ)法, 并包含了一個(gè)非常具有表現(xiàn)力的實(shí)現(xiàn)了使用動(dòng)詞方式:獨(dú)立函數(shù)。 而Java強(qiáng)制你用Callback,Ruunable或其他匿名接口來包裝它為一個(gè)類以便于調(diào)用。
Sun公司甚至沒有打破他們一切函數(shù)都必須被類擁有的信條。 任何匿名的函數(shù)都會(huì)具有一個(gè)隱式的this指針指向定義它的類;問題解決了。
我不知道為什么Sun公司堅(jiān)持Java矗立在名詞王國(guó)。 我懷疑這是低估了他們的民眾;他們添加了泛型,一個(gè)更加復(fù)雜的概念,所以他們不再關(guān)心如何保持他們語(yǔ)法的簡(jiǎn)練。 并且添加動(dòng)詞并不是一件壞事,這是因?yàn)镴ava現(xiàn)今所建立的:為一個(gè)Java程序員提供工具讓他們按自己的想法編程更有意義。
我真心希望Java能修復(fù)這個(gè)缺陷,以便我可以把垃圾帶出去并回來玩游戲或者一切當(dāng)時(shí)在做的事情
轉(zhuǎn)載于:https://my.oschina.net/startphp/blog/105631
總結(jié)
- 上一篇: linux中源码编译安装mysql常见错
- 下一篇: 将jar文件转换成exe可执行文件