靈魂-放水

          為學(xué)日益,為道日損。

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            296 Posts :: 10 Stories :: 274 Comments :: 0 Trackbacks
          (譯者按:?? 今年7月份舉行的RailsConf 2006上,David Heinemeier Hasson作了一個(gè)主題演講,很清楚地講了Rails 1.2中對(duì)于REST的設(shè)計(jì),以及REST風(fēng)格給Web應(yīng)用設(shè)計(jì)思想所帶來的革新。我第一次看到這個(gè)視頻,就認(rèn)為這可能是對(duì)Web服務(wù)端開發(fā)具有歷史意義的一次演講。當(dāng)時(shí)有一點(diǎn)時(shí)間,就一邊聽一邊記,把這個(gè)演講的開頭翻譯出將近3000字的內(nèi)容,大約占整個(gè)演講篇幅的1/4。后來我忙了起來,就沒有時(shí)間把這個(gè)翻譯做完。這個(gè)稿件在我硬盤上爬了兩個(gè)多月,扔掉也不是,放出來又不完整。現(xiàn)在Rails 1.2已經(jīng)發(fā)布了,我想越來越多的Web開發(fā)者都會(huì)回過頭關(guān)心這個(gè)演講的內(nèi)容,所以突然生出一個(gè)想法,能不能把這個(gè)不完整的翻譯稿放到自己的blog上,請(qǐng)有時(shí)間和精力的網(wǎng)友把翻譯工作接力下去?

          ??? 所以,我已經(jīng)將自己翻譯完成的開頭部分(錄像的1、2小節(jié))放到這里,請(qǐng)有興趣和熱情的朋友對(duì)照錄像內(nèi)容把翻譯接力下去,為國(guó)內(nèi)的Web開發(fā)者介紹關(guān)于Web開發(fā)思想的這一重大革新。)

          錄像地址: 在這里

          幻燈片地址:在這里


          大家好,今晚我的演講題目是《在Rails中探索資源的世界》。不過在我發(fā)表這個(gè)有點(diǎn)教程式的演講之前,我想花幾分鐘來展示一下自己的傲慢。我總是要發(fā)表一些讓人們不舒服的言論,現(xiàn)在這幾乎已經(jīng)是個(gè)傳統(tǒng)了。

          這次的會(huì)議展示了過去6個(gè)月以來世界各地的Rails開發(fā)者們發(fā)現(xiàn)的最令人興奮的東西,現(xiàn)在看來,我們這個(gè)小圈子之外的人們也終于開始關(guān)注Rails社群了,這當(dāng)然很酷。但同時(shí)我們也必須想清楚,我們何以會(huì)獲得如此的關(guān)注?我聽到了Thomas昨天和今天的發(fā)言,當(dāng)然他的很多想法和建議是非常棒的,不過在同時(shí)應(yīng)該記住,之所以今天我們會(huì)在這里聚會(huì),之所以Rails是今天的Rails,恰恰因?yàn)槲覀儗?duì)很多事情說了“不”,恰恰是因?yàn)槲覀儗⒑芏嗳司苤T外。如今Rails被越來越多的人接受,但我并不認(rèn)為因此我們就可以背離先前的原則。所以,盡管我毫無疑問地支持Thomas的很多實(shí)用的建議,但對(duì)他的論調(diào)則不以為然。我不認(rèn)為Rails應(yīng)該向外部世界屈服,恰恰相反,Rails正在有力地讓外部世界向我們屈服。在這個(gè)演講里,我正是要好好談?wù)勈澜绲膯栴}。我是說,現(xiàn)實(shí)的世界。你們中的很多人大概都知道,我這個(gè)人從不覺得現(xiàn)實(shí)世界是個(gè)很舒服的地方,倒是對(duì)于理想世界情有獨(dú)鐘。Rails很大程度上就是生活在一個(gè)理想世界里,在這里,Rails沒有那些該死的現(xiàn)實(shí)世界里的枷鎖??上?,人們必須生活在現(xiàn)實(shí)世界里,而生活在現(xiàn)實(shí)世界實(shí)在是相當(dāng)悲哀。在現(xiàn)實(shí)世界里,你會(huì)被沿襲了數(shù)十年的陳規(guī)陋習(xí)拖入深淵,這決不是Rails的成長(zhǎng)之道,也不會(huì)是它未來的命運(yùn)。我稍后會(huì)回到這個(gè)觀點(diǎn)。

          還是先來報(bào)報(bào)喜。我最近去了一趟日本,那里發(fā)生的事情讓我很感興趣。在這里,我們有大約三、五百人聚在一起,代表西方世界的Rails用戶群。而在日本,Ruby的用戶群數(shù)量龐大,熱情高漲,他們做了大量的Ruby和Rails相關(guān)的工作,其中有很多我聞所未聞,比我們這個(gè)小房間里的人們所做的工作要多得多。他們正在創(chuàng)建更好幾個(gè)理想的世界,大大超越我曾經(jīng)夢(mèng)想的那個(gè)世界。Thomas和我寫的那本書自去年發(fā)行以來,已經(jīng)買出5萬多冊(cè),這經(jīng)常被我們用來標(biāo)志Rails的成功。而在日本,這本書剛剛翻譯出版幾個(gè)月,已經(jīng)銷售7千多冊(cè),他們還有3本日文書即將出版。在英語世界,到年底的時(shí)候大約還會(huì)有十本書上市,這都令人感到興奮。從那些長(zhǎng)時(shí)間使用Rails的團(tuán)隊(duì)那里得來的消息同樣令人興奮。我多次提到的43things.com團(tuán)隊(duì),他們大規(guī)模應(yīng)用了Rails,并且在面向公眾的站點(diǎn)平臺(tái)上進(jìn)行了高負(fù)載量的測(cè)試。上次我問他們的時(shí)候,他們的Rails應(yīng)用每天要產(chǎn)生350萬動(dòng)態(tài)網(wǎng)頁,這已經(jīng)是很了不起的事情!當(dāng)然,這個(gè)演講并不打算花更多的時(shí)間來自吹自擂,這個(gè)演講的主題是有關(guān)CRUD的。

          CRUD -- Create,Read,Update和Delete。這幾個(gè)詞匯概括了我們的主要的工作,這幾個(gè)基本的概念概括了我們對(duì)對(duì)象空間中對(duì)象或者數(shù)據(jù)庫(kù)表wrapper所能夠的主要操作。但CRUD是有問題的。有什么問題呢?CRUD的問題是它的名字起得不好。不光名字起得不好,名聲也不太好。他們是怎么說CRUD的呢?首先,他們說CRUD太簡(jiǎn)單,僅靠這四個(gè)操作,別指望能做出什么有趣的事情,世界太復(fù)雜了,不是這四個(gè)動(dòng)詞所能夠描述的,所以CRUD太簡(jiǎn)單。正因?yàn)镃RUD太簡(jiǎn)單,所以它們無法勝任真實(shí)工作。如果你只是用CRUD的話,你不可能把事情做到位。CRUD不是一種令人滿意的方式,它不能夠把人類了不起的智慧充分發(fā)揮出來。他們說,這不值得,你不應(yīng)該把你的精力浪費(fèi)在這四個(gè)動(dòng)詞上,它們太簡(jiǎn)單了。用CRUD應(yīng)該感到羞愧。

          我要說的是,他們錯(cuò)了。我今天的演講就是要消除大家對(duì)CRUD的擔(dān)憂,并且讓大家像我一樣學(xué)會(huì)愛上CRUD。

          在對(duì)象的世界里,我們CRUD。而在數(shù)據(jù)庫(kù)的世界里,我們也有四種基本操作,SELECT,INSERT,UPDATE,DELETE。不過數(shù)據(jù)庫(kù)世界中的這四種操作存在已經(jīng)好多年了,而且關(guān)于CRUD過于簡(jiǎn)單的說法,很大程度上就是在跟數(shù)據(jù)庫(kù)這四大操作的對(duì)比中產(chǎn)生的。所以這并沒有使我深入的思考CRUD問題。促使我深入思考CRUD的是HTTP。

          近年來,我們經(jīng)歷了一次文藝復(fù)興(Renaissance),一次HTTP的文藝復(fù)興,HTTP有四個(gè)動(dòng)詞,GET,POST,PUT和DELETE,從而在上面的這個(gè)CRUD棧之上添加了嶄新的一層。然而我們大多數(shù)人只使用GET和POST來思考HTTP和Web,而沒有進(jìn)而想到,HTTP的四個(gè)動(dòng)詞已經(jīng)使之成為CRUD的一種新形式。我本人對(duì)此深感內(nèi)疚,因?yàn)槎嗄陙砦易云燮廴说卣J(rèn)為HTTP只有GET和POST。正因?yàn)榇耍也艜?huì)占用各位一小時(shí)來講述下面的內(nèi)容。

          <第8頁>

          請(qǐng)看,這是現(xiàn)在一個(gè)CRUD應(yīng)用程序?qū)ν獗┞豆δ艿姆绞健.?dāng)你想創(chuàng)建某個(gè)東西,你想一個(gè)特定的URL地址POST;當(dāng)你想獲取對(duì)象的內(nèi)容,就把相關(guān)資源的位置放到URL里,然后GET;當(dāng)你想改變這個(gè)對(duì)象,就用POST,有些人也用GET操作做這件事,其實(shí)這很不好。再有就是刪除操作,也是用POST。

          看著這樣一幅圖,有時(shí)我會(huì)覺得有點(diǎn)抓狂。我們?cè)赗ails中的一個(gè)宗旨是DRY,決不做重復(fù)的工作。你看看這里的動(dòng)詞,GET, POST,再看看這里的URL,我們所做的不正是重復(fù)性工作嗎?看看第二行,我們說要GET第1個(gè)people,但是這個(gè)people的URL中包含show,GET和show,這兩者不正是同樣的意思嗎?顯然我們把一些事情做錯(cuò)了。之所以會(huì)把這些事情做錯(cuò),根本上是因?yàn)槲覀儧]有把HTTP提供的CRUD操作利用好。如果我們能利用好,我們完全可以把事情做得清爽、漂亮,像這樣:<第9頁>

          現(xiàn)在,URL只是標(biāo)識(shí)了我們所關(guān)注的那個(gè)對(duì)象本身,而我們要對(duì)對(duì)象所做的操作則用四個(gè)動(dòng)詞來表達(dá)。之前,我們把操作和操作的對(duì)象混在一起,現(xiàn)在則明確地分開。這顯然漂亮多了,但是為什么我們先前沒有這么做呢?為什么HTTP的這部分能力一直被遺忘在角落里呢?這自然是有原因的。原因就是,要這么做會(huì)很痛苦,因?yàn)镠TML以及Web世界里的其他現(xiàn)存的東西都沒有欣賞到HTTP中已經(jīng)存在的這種美,更沒有為此做出相應(yīng)的設(shè)計(jì)實(shí)現(xiàn)。既然Rails框架的目標(biāo)把這些累贅東西踢走,是深埋于下的美妙的概念暴露在世人面前,那么為什么我們不能夠試著來解決這個(gè)問題?這就是我今天要講的東西,如何把上面那樣重復(fù)的累贅的形式變成下面這個(gè)清爽漂亮的形式。事實(shí)上,這不僅僅是一個(gè)URL漂亮與否的問題。

          在Rails 1.2中,如果你想把某個(gè)資源暴露出來,使客戶能夠用那種清爽的URL的方式去訪問和操作資源,你只需要做這樣的事情:<第10頁>

          這一語句將person作為一個(gè)資源,允許上述那種URL直接被映射到對(duì)應(yīng)的方法。

          (之下有一段幻燈片內(nèi)容的解釋,略過)。

          怎么做到這一點(diǎn)呢?首先要增加PUT并將其傳遞給控制器的能力。但正如我之前所說,由于HTML天然地沒有PUT的能力,所以這不太容易。沒關(guān)系,我們要修正這一點(diǎn)。

          <第11頁>

          首先是POST和GET,跟以前一樣,所以沒什么要特別說出的。有趣的部分是Update和Destroy。在Update部分,我們要找到一種方法告訴Rails,這個(gè)表單的action不是一個(gè)常規(guī)的POST方法,而是一個(gè)PUT。這里展示的是這個(gè)操作應(yīng)該的模樣。如果HTML表單支持PUT方法的話,我們本該這樣寫來著。很不幸,事實(shí)并非如此(HTML表單不支持PUT action),所以我們只能用POST來偽造一個(gè)PUT。在Rails中,當(dāng)你這樣寫的時(shí)候,產(chǎn)生出來的表單里包含了一個(gè)隱藏的域,稱為underscored method(下劃線方法),這個(gè)下劃線方法會(huì)去調(diào)用真正干事的那個(gè)方法。我們這么做就能讓Rails相信,這個(gè)POST實(shí)際上是個(gè)PUT。

          (以上翻譯是錄像1、2節(jié)內(nèi)容,請(qǐng)熱心網(wǎng)友接力翻譯后面的內(nèi)容)

          ?

          Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1413933

          posted on 2006-11-27 20:04 放水老倌 閱讀(302) 評(píng)論(0)  編輯  收藏 所屬分類: 讀書筆記
          主站蜘蛛池模板: 泊头市| 浠水县| 黄龙县| 腾冲县| 呼和浩特市| 交口县| 宜兰县| 繁昌县| 娄烦县| 渑池县| 伊宁市| 龙门县| 和田市| 葫芦岛市| 禹城市| 南木林县| 习水县| 洛阳市| 攀枝花市| 张掖市| 同心县| 富蕴县| 花莲市| 会泽县| 崇州市| 永顺县| 巴彦县| 华亭县| 莆田市| 南涧| 扶风县| 武城县| 丰宁| 资溪县| 延长县| 佛学| 中方县| 全州县| 达日县| 彰武县| 双柏县|