一個(gè)理想的用戶接口對(duì)用戶最好是不可見(jiàn)的-僅在用戶需要時(shí)提供選擇,否則并不干涉他們的工作而讓其專注于手頭的工作。然而,這并不是一件容易的事情。如今,我們變得習(xí)慣于通過(guò)并不十分令人滿意的UI進(jìn)行日常工作,直到有人向我們展示一種更好的方法。現(xiàn)在,我們才逐漸認(rèn)識(shí)到我們當(dāng)前的方法在做這些事情時(shí)是多么吃力。
由于用于顯示文檔內(nèi)容的基本web瀏覽器技術(shù)又被推進(jìn)一步進(jìn)而超出以前它們所能及的范圍,所以,如今的互聯(lián)網(wǎng)正在經(jīng)歷著這樣的實(shí)現(xiàn)。
Ajax(異步JavaScript+XML)是一個(gè)非常新的名字,為Adaptive Path的Jesse James Garrett所創(chuàng)建。其中,Ajax的某些部分以前被描述為動(dòng)態(tài)HTML和遠(yuǎn)程腳本。
Ajax的出現(xiàn)不僅僅是一個(gè)新名字的問(wèn)題。從技術(shù)和商業(yè)的角度看,圍繞Ajax還有大量激動(dòng)人心的東西。從技術(shù)上講,Ajax實(shí)現(xiàn)了web瀏覽器技術(shù)中大量的尚未實(shí)現(xiàn)的潛力。從商業(yè)上看,Google和其它一些主要商家正在逐步使用Ajax技術(shù),從而讓公眾認(rèn)識(shí)到一個(gè)web應(yīng)用程序所能做的事情。
以前我們習(xí)慣的典型web應(yīng)用程序如今正在承受著巨大的壓力,因?yàn)橹饾u復(fù)雜的基于萬(wàn)維網(wǎng)的服務(wù)正日趨成熟并開(kāi)始應(yīng)用于互聯(lián)網(wǎng)。各種新技術(shù)爭(zhēng)相涌現(xiàn)出來(lái)以克服這些問(wèn)題,而Ajax僅使用現(xiàn)有的互聯(lián)網(wǎng)技術(shù)就能夠更好地表達(dá)這些思想。
利用Ajax,我們重用了一堆原有技術(shù)但卻擴(kuò)展了它們?cè)瓉?lái)所能及的范圍。我們需要能夠管理這種我們引入的復(fù)雜性。本文將討論怎樣實(shí)現(xiàn)這些技術(shù),而且還要討論一下管理大型Ajax工程的問(wèn)題。我們將介紹Ajax設(shè)計(jì)模式及其怎樣幫助我們完成工作。設(shè)計(jì)模式幫助我們捕獲我們的知識(shí)和經(jīng)驗(yàn),用我們現(xiàn)在的技術(shù)并且使之與其它對(duì)象進(jìn)行通訊。通過(guò)把規(guī)則引入到代碼基之上,它們就能夠方便創(chuàng)建應(yīng)用程序-可以據(jù)變化對(duì)工程加以修改和擴(kuò)展。使用設(shè)計(jì)模式進(jìn)行開(kāi)發(fā)甚至是一種喜悅!
為什么說(shuō)Ajax是豐富的客戶端?
構(gòu)建一個(gè)豐富的客戶端接口比設(shè)計(jì)一個(gè)WEB頁(yè)面要復(fù)雜。那么是東西導(dǎo)致我們這樣做的?好處有哪些?什么是豐富的客戶端?
一個(gè)豐富的客戶端有兩個(gè)關(guān)鍵特點(diǎn):它是豐富的,而且它是一個(gè)客戶端。
讓我稍作解釋。豐富指的是客戶端方式。一個(gè)豐富的客戶端模型-是指它能夠支持各種輸入方法且能夠直觀又非常及時(shí)地作出響應(yīng)。盡管我們稱其為"豐富的",但是它必須與象字處理器和工作表等現(xiàn)代桌面應(yīng)用程序一樣好才真正豐富。下面讓我們看一下為達(dá)此目的所具體要求的實(shí)現(xiàn)技術(shù)。
二、比較用戶體驗(yàn)
在這里,讓我們討論一個(gè)工作表程序的實(shí)例。當(dāng)我在工作表輸入一些簡(jiǎn)單的公式時(shí),我可以有幾種方式與之交互-現(xiàn)場(chǎng)編輯數(shù)據(jù),用鍵盤和鼠標(biāo)導(dǎo)航數(shù)據(jù)和通過(guò)鼠標(biāo)拖動(dòng)重新組織數(shù)據(jù)。
當(dāng)我在操作這些時(shí),軟件給我反饋-鼠標(biāo)光標(biāo)形狀改變,當(dāng)我在按鈕上移動(dòng)時(shí)按鈕高亮,選定的文本改變顏色,高亮的窗口和對(duì)話框以不同形式顯示,等等(圖1)。
![]() 圖1 這個(gè)桌面工作表應(yīng)用程序說(shuō)明了多種用戶交互的可能性。 |
這些是當(dāng)今用戶豐富的交互的主要表現(xiàn)。這樣的工作表應(yīng)用程序就是一個(gè)豐富的客戶端嗎?還不是。
在一個(gè)工作表或類似的桌面應(yīng)用程序中,邏輯和數(shù)據(jù)模型都在一個(gè)封閉的環(huán)境中運(yùn)行-在此它們彼此都能清晰可見(jiàn),但是卻把外界拒之門外(圖2)。我的客戶端定義是一個(gè)程序-它能夠與一個(gè)不同的獨(dú)立的進(jìn)程通訊-典型地它運(yùn)行于一個(gè)服務(wù)器上。傳統(tǒng)地,該服務(wù)器比客戶端更大更強(qiáng)壯并且存儲(chǔ)了海量信息。客戶端允許終端用戶觀看和修改這些信息,并且如果有一些客戶連接到同一個(gè)服務(wù)器上,它允許他們分享該數(shù)據(jù)。圖3顯示出一客戶機(jī)/服務(wù)器架構(gòu)的簡(jiǎn)單圖解。
![]() 圖2 一個(gè)獨(dú)立桌面應(yīng)用程序的圖解架構(gòu)。 |
該應(yīng)用程序運(yùn)行于其自身的進(jìn)程之中-在其內(nèi)數(shù)據(jù)模型和程序邏輯彼此清晰可見(jiàn)。在同一臺(tái)計(jì)算機(jī)上運(yùn)行的該應(yīng)用程序的第二個(gè)實(shí)例除了經(jīng)由文件系統(tǒng)之外無(wú)法存取第一個(gè)實(shí)例的數(shù)據(jù)模型。典型地,全部程序狀態(tài)存儲(chǔ)在單個(gè)的文件中-當(dāng)該應(yīng)用程序運(yùn)行時(shí)它被鎖定以阻止任何信息的同步交換。
![]() 圖3 客戶端/服務(wù)器系統(tǒng)和n層架構(gòu)圖解。 |
該服務(wù)器提供一個(gè)客戶可以用之進(jìn)行交互的可共享的數(shù)據(jù)模型。客戶端仍然維持它們自己的部分?jǐn)?shù)據(jù)模型以達(dá)到快速存取。多個(gè)客戶可以與同一個(gè)服務(wù)器進(jìn)行交互,而此時(shí)在單個(gè)對(duì)象或數(shù)據(jù)庫(kù)行良好粒度級(jí)上控制的資源被鎖定。該服務(wù)器可以是一個(gè)單個(gè)的進(jìn)程,就象在90年代以前的早期的傳統(tǒng)型客戶端/服務(wù)器模型或由若干中間件層、外部web服務(wù)等組成的現(xiàn)代模型。在任何情況下,從客戶的角度來(lái)看,服務(wù)器具有單個(gè)入口點(diǎn)并且可以被認(rèn)為是一個(gè)黑盒子。
當(dāng)然,在一現(xiàn)代的N層架構(gòu)中,服務(wù)器將能與例如數(shù)據(jù)庫(kù)這樣的后端服務(wù)器通訊-這導(dǎo)致了中間件層的出現(xiàn)-它們既充當(dāng)客戶端又充當(dāng)服務(wù)器端。典型地,我們的Ajax應(yīng)用程序位于這個(gè)鏈的一端上-只擔(dān)當(dāng)客戶端,所以我們可能把整個(gè)N層系統(tǒng)看作單個(gè)黑盒子-我們把它標(biāo)記為服務(wù)器,以便于我們當(dāng)前的討論。
我的工作表只專注于它自己的存儲(chǔ)在本地內(nèi)存和本地文件系統(tǒng)上的數(shù)據(jù)。如果它架構(gòu)良好,數(shù)據(jù)層和描述層之間的耦合可能相當(dāng)松散,但是我無(wú)法把它通過(guò)網(wǎng)絡(luò)分解與共享。所以,從我們的描述層目標(biāo)來(lái)看,它不是一個(gè)客戶端。
當(dāng)然,Web瀏覽器是客戶端,它連接web服務(wù)器并從中進(jìn)行頁(yè)面請(qǐng)求。這些瀏覽器具有一些豐富的功能來(lái)管理用戶的web瀏覽,例如后退按鈕、歷史列表和多頁(yè)面存儲(chǔ)多個(gè)文檔。但是如果我們把一個(gè)特定站點(diǎn)的web頁(yè)面看作一個(gè)應(yīng)用程序,那么這些通用瀏覽器控制便不能再關(guān)聯(lián)到應(yīng)用程序,就象Windows開(kāi)始菜單或window列表相關(guān)于我的工作表一樣。
讓我們看一個(gè)現(xiàn)代web應(yīng)用程序。主要因?yàn)槊總€(gè)人可能都聽(tīng)說(shuō)過(guò)它,所以我們將選擇Amazon-在線書(shū)商為例(圖4)。現(xiàn)在,我把自己的瀏覽器指向Amazon站點(diǎn);因?yàn)樵撜军c(diǎn)從我的上次訪問(wèn)能夠記得我是誰(shuí),所以它先給我顯示一個(gè)友好的問(wèn)候、推薦書(shū)列表和關(guān)于我已購(gòu)買書(shū)的歷史信息。
![]() 圖4 Amazon.com首頁(yè)。該系統(tǒng)記得我以前訪問(wèn)過(guò)該站點(diǎn),其中可導(dǎo)航的鏈接是通用信息和私人信息的混合。 |
從建議列表中點(diǎn)擊一個(gè)標(biāo)題將把我導(dǎo)向一個(gè)獨(dú)立的頁(yè)面(也即,該屏幕閃爍一下,于是我就失去了幾分鐘前可以看到的列表)。于是新頁(yè)面中又會(huì)充滿各種上下文信息(見(jiàn)圖5)。
![]() 圖5 Amazon.com站點(diǎn)書(shū)籍詳細(xì)資料頁(yè)面。 |
再一次,大量的結(jié)合有通用和私人信息的超鏈接出現(xiàn)。盡管如此,大量的細(xì)節(jié)與圖4所示極為相同-這,由于web瀏覽器的基于文檔的操作,必須被重新轉(zhuǎn)送到每個(gè)頁(yè)面。
簡(jiǎn)言之,我向你展示了非常豐富的緊密聯(lián)系的信息。而且我與這種信息交互的唯一方式是通過(guò)點(diǎn)按超鏈接并且填寫文本表單。如果我在瀏覽站點(diǎn)時(shí)的鍵盤輸入過(guò)程中睡著了并且第二天才醒來(lái),那么在我刷新全部頁(yè)面之前我不會(huì)知道新的哈里·波特書(shū)已經(jīng)發(fā)行。我不可能帶著我的列表從一個(gè)頁(yè)面轉(zhuǎn)到另一個(gè)頁(yè)面,并且我不可能縮放該文檔的一部分來(lái)一次觀看多處的內(nèi)容。
這并不是在詆毀Amazon,在非常有限的限定內(nèi)它工作得相當(dāng)優(yōu)秀。但是與工作表相比,它所依賴的交互模型毫無(wú)疑問(wèn)相當(dāng)有限。
那么,為什么在現(xiàn)代web應(yīng)用程序中存在這么多的限制呢?目前,存在很多技術(shù)上的原因。因此,現(xiàn)在讓我們作進(jìn)一步分析。
三、網(wǎng)絡(luò)的潛力
互聯(lián)網(wǎng)時(shí)代的偉大就在于世界各地所有的計(jì)算機(jī)互相聯(lián)系,就象在一個(gè)非常大的計(jì)算資源之中。遠(yuǎn)程和本地過(guò)程調(diào)用變得很難區(qū)分,并且發(fā)行者已經(jīng)不再清醒地了解它們?cè)谀男┪锢頇C(jī)器上工作。
不幸的是,遠(yuǎn)程和本地過(guò)程調(diào)用是根本不相同的技術(shù)。
在網(wǎng)絡(luò)上的通訊是昂貴的(它們是慢并且不可靠的)。當(dāng)一部分非網(wǎng)絡(luò)代碼被編譯或解釋時(shí),各種方法和函數(shù)就象在其上操作的數(shù)據(jù)一樣被編碼為存儲(chǔ)在相同的本地內(nèi)存中的指令(圖6)。這樣,把數(shù)據(jù)傳遞給一個(gè)方法并返回結(jié)果就相當(dāng)直接。
![]() 圖6 本地過(guò)程調(diào)用序列圖-在此很少的元素如程序邏輯和數(shù)據(jù)模型都被存儲(chǔ)在本地內(nèi)存并能彼此直接看見(jiàn)。 |
其實(shí)在底層,為了發(fā)送和接收數(shù)據(jù),很多計(jì)算運(yùn)行于一個(gè)網(wǎng)絡(luò)連接的兩端(圖7)。實(shí)際上,這種計(jì)算遠(yuǎn)不如沿著物理線路的運(yùn)行更導(dǎo)致系統(tǒng)的減慢-各級(jí)的編碼與解碼遍及通訊的各個(gè)方面,從沿著線路傳輸?shù)奈锢硇畔ⅲ堰@些信息翻譯為二進(jìn)制的1和0,錯(cuò)誤檢查和重發(fā)送,到重新整合該二進(jìn)制序列。
![]() 圖7 一個(gè)遠(yuǎn)程過(guò)程調(diào)用序列圖。在一臺(tái)機(jī)器上的程序邏輯試圖操作在另外一臺(tái)機(jī)器上的數(shù)據(jù)模型。 |
調(diào)用函數(shù)的請(qǐng)求必須被編碼為一個(gè)稍后將被串行化的對(duì)象(也即,被轉(zhuǎn)換成一個(gè)線性字節(jié)集合)。然后,被串行化的數(shù)據(jù)被傳遞到應(yīng)用程序協(xié)議(現(xiàn)在通常為HTTP)并且通過(guò)物理傳輸發(fā)送。
在遠(yuǎn)程機(jī)器上,該應(yīng)用程序協(xié)議被解碼,并且數(shù)據(jù)的字節(jié)被反串行化以創(chuàng)建該請(qǐng)求對(duì)象的一個(gè)副本。然后,這個(gè)對(duì)象被應(yīng)用到數(shù)據(jù)模型和一個(gè)生成的響應(yīng)對(duì)象上。為了聯(lián)系該響應(yīng)和調(diào)用函數(shù),該串行化和傳輸層必須被再一次導(dǎo)航,最后導(dǎo)致一個(gè)響應(yīng)對(duì)象被返回到調(diào)用函數(shù)。
這些客戶端是復(fù)雜的但是適合于自動(dòng)化實(shí)現(xiàn)。現(xiàn)代的編程環(huán)境例如Java和微軟.NET框架都提供了這種功能的自由使用。盡管如此,當(dāng)產(chǎn)生一個(gè)遠(yuǎn)程過(guò)程調(diào)用(RPC)時(shí),在內(nèi)部有大量的活動(dòng)在進(jìn)行并且如果這樣的調(diào)用太自由的話,性能也會(huì)受到影響。
因此,通過(guò)網(wǎng)絡(luò)的調(diào)用永遠(yuǎn)不會(huì)象調(diào)用本地內(nèi)存中的一個(gè)方法那么富有效率。而且,網(wǎng)絡(luò)的不可靠性(并因此需要重新發(fā)送失去的信息包)也使得這種低效在不斷變化且很難預(yù)測(cè)。在你的本地機(jī)器上的內(nèi)存響應(yīng)性不僅更好一些而且相比之下可以被很好地定義。
這但與可用性有什么關(guān)系呢?已證明,其關(guān)系相當(dāng)大。
一個(gè)成功的計(jì)算機(jī)UI的確需要模仿我們真實(shí)的世界期望。該交互的最基本原則之一是,當(dāng)我們點(diǎn)按某東西時(shí),它能夠立即響應(yīng)。在點(diǎn)按和響應(yīng)之間的輕微的延遲都會(huì)帶給用戶迷惑并使之分神-把用戶的注意力從手頭的任務(wù)轉(zhuǎn)移到UI本身。
必須做所有的額外工作來(lái)穿越網(wǎng)絡(luò)常常就足已減慢一個(gè)系統(tǒng),以至于該延遲變得相當(dāng)引人注意。在一桌面應(yīng)用程序中,我們需要做出糟糕的可用性設(shè)計(jì)決策來(lái)使得應(yīng)用程序感覺(jué)起來(lái)充滿錯(cuò)誤或不具有響應(yīng)性,但是在一個(gè)聯(lián)網(wǎng)應(yīng)用程序中,不需要我們關(guān)心這些!
由于網(wǎng)絡(luò)潛力的不可預(yù)測(cè)性,這種可察覺(jué)的錯(cuò)誤來(lái)來(lái)去去,并且測(cè)試應(yīng)用程序的響應(yīng)性也可能變得更為困難。因此,網(wǎng)絡(luò)潛力是真實(shí)世界應(yīng)用程序具有可憐的交互性的最通常的原因。
四、異步客戶端
在實(shí)際中,我們必須盡量使UI響應(yīng)獨(dú)立于網(wǎng)絡(luò)活動(dòng)。幸好,一段固定時(shí)間的響應(yīng)經(jīng)常就足夠了,只要它是及時(shí)的。讓我們?cè)俅慰匆幌聦?shí)際中的問(wèn)題。我的早上例程的主要任務(wù)之一是喚醒我的孩子們上學(xué)。我可以站在他們上面戳他們直到他們起床并穿上衣服,但這是一相當(dāng)花費(fèi)時(shí)間的方式,留下很長(zhǎng)的一段時(shí)間我?guī)缀鯚o(wú)事可做(圖8)。
![]() 圖8異步響應(yīng)用戶輸入序列圖 |
在這個(gè)序列圖中,時(shí)間的過(guò)渡是垂直的。陰影部分的高度指示了我被阻塞進(jìn)一步輸入的時(shí)間長(zhǎng)度。
我需要弄醒我的孩子,外盯窗戶,并且忽略了貓。孩子們將通知我-這時(shí)他們因要求吃早餐而被正確喚醒。就象服務(wù)器端進(jìn)程一樣,孩子們醒得很慢。如果我使用一個(gè)異步的客戶端模型,我將等待很長(zhǎng)時(shí)間。只要他們能夠咕噥一聲,我就能醒來(lái),然后我就可以繼續(xù)輕松地干別的事情并且在需要時(shí)檢查他們。
用計(jì)算機(jī)術(shù)語(yǔ)來(lái)說(shuō),我在此所做的是在一個(gè)獨(dú)立的線程中激發(fā)一個(gè)異步的過(guò)程。一旦啟動(dòng)它們,我的孩子們就會(huì)在他們自己的線程中自己醒來(lái);而我-父線程,不需要與他們同步,直到他們通知我(通常使用一個(gè)請(qǐng)求)。盡管他們正在醒來(lái),但是我無(wú)法與他們的客戶端進(jìn)行通訊,好象它們已經(jīng)起床并穿好衣服了,但是我能確信它一定會(huì)及時(shí)發(fā)生的(圖9)。
![]() 圖9 一異步響應(yīng)用戶輸入序列圖。如果我使用一個(gè)異步的輸入模型,我能讓孩子們通知我他們開(kāi)始醒來(lái)。然后,當(dāng)醒來(lái)發(fā)生時(shí),我能繼續(xù)我的 另外的活動(dòng)并且有一段很短的時(shí)間保持阻塞。 |
無(wú)論使用任何UI,創(chuàng)建一異步線程來(lái)處理任何冗長(zhǎng)的計(jì)算并且讓它在后臺(tái)運(yùn)行,而用戶繼續(xù)處理其它事情都是一種很好的解決方案。當(dāng)該線程啟動(dòng)時(shí),用戶必然被阻斷,但是這可能在很短的一段可接受時(shí)間之內(nèi)發(fā)生。由于網(wǎng)絡(luò)的潛力,一種不錯(cuò)的實(shí)現(xiàn)是把任何RPC當(dāng)作潛在的冗長(zhǎng)過(guò)程并異步地處理它。
該問(wèn)題和這種解決方案都是良構(gòu)的。網(wǎng)絡(luò)的潛力早已出現(xiàn)在老式的客戶端/服務(wù)器模型中-這使得糟糕設(shè)計(jì)的客戶端在試圖到達(dá)一個(gè)過(guò)載的服務(wù)器時(shí)滯留到令人無(wú)法承受的程度。在當(dāng)今互聯(lián)網(wǎng)時(shí)代,網(wǎng)絡(luò)的潛力使得你的瀏覽器在web頁(yè)面間來(lái)回切換時(shí)經(jīng)歷了巨大的挫敗。我們不可能消除這種潛力;但是我們知道通過(guò)異步地處理遠(yuǎn)程調(diào)用可以處理它,對(duì)不對(duì)?
不幸的是,對(duì)我們絕大多數(shù)web開(kāi)發(fā)者來(lái)說(shuō),并沒(méi)有捕獲到這一點(diǎn)。
HTTP是一個(gè)請(qǐng)求-響應(yīng)協(xié)議,該協(xié)議是單向的。客戶端可以聯(lián)系服務(wù)器,但是服務(wù)器不能與客戶端開(kāi)始一個(gè)通訊。確實(shí),該服務(wù)器不能從一次到另一次的請(qǐng)求中記住客戶端。
多數(shù)使用現(xiàn)代語(yǔ)言如Java、PHP或.NET的web開(kāi)發(fā)者都會(huì)熟悉用戶會(huì)話的概念。HTTP按照它的最初設(shè)計(jì)良好地工作著,而且它已經(jīng)被改編來(lái)實(shí)現(xiàn)更為靈活性的功能。然而,我們的異步回調(diào)解決方案的關(guān)鍵在于客戶端被再次通知:當(dāng)創(chuàng)建線程時(shí)是第一次而當(dāng)線程完成時(shí)是第二次。直接的HTTP和經(jīng)典web應(yīng)用程序模型無(wú)法為我們完成這一點(diǎn)。
如Amazon所使用的經(jīng)典web應(yīng)用軟件模型仍然是基于頁(yè)面概念設(shè)計(jì)的。一文檔被顯示給用戶-包含一個(gè)列表的鏈接和/或表單元素-它們?cè)试S它們提交給進(jìn)一步的文檔。完全有可能以這種方式大規(guī)模地與復(fù)雜數(shù)據(jù)集交互,并且如Amazon和其它站點(diǎn)所展示的-完全可以基于這一經(jīng)驗(yàn)構(gòu)建一種商業(yè)運(yùn)作。
這種客戶端方式已經(jīng)根深蒂固于過(guò)去十多年間的每天的商業(yè)互聯(lián)網(wǎng)之中。友好的WYSIWYG web創(chuàng)作工具把我們的站點(diǎn)可視化為一個(gè)頁(yè)面集合。服務(wù)器端web框架把這種頁(yè)面間的轉(zhuǎn)換建模為狀態(tài)轉(zhuǎn)換圖。經(jīng)典web應(yīng)用程序,在頁(yè)面刷新時(shí),與不可避免的缺乏響應(yīng)緊密結(jié)合,不可能容易地求助于異步處理器解決方案。
但是Amazon基于其網(wǎng)站已經(jīng)取得了商業(yè)上的成功。當(dāng)然,經(jīng)典web應(yīng)用程序不可能象那樣不可用?為了理解為什么web頁(yè)面可以適合于Amazon而不適用于每個(gè)人,我們應(yīng)該考慮一下使用模式的問(wèn)題。
五、長(zhǎng)期與短暫使用模式
軟件可用性專家Alan Cooper對(duì)于使用模式下過(guò)重要的結(jié)論,并且定義了兩個(gè)關(guān)鍵的使用方式:短暫的和長(zhǎng)期的。一個(gè)短暫的應(yīng)用程序可能每天都被使用,但只在是一段時(shí)間內(nèi)且通常只是作為第二活動(dòng)。而相反,一個(gè)長(zhǎng)期的應(yīng)用程序必須每次連續(xù)數(shù)小時(shí)地有效地處理用戶的全部注意力。
許多應(yīng)用程序其實(shí)都是短暫或長(zhǎng)期使用的。一個(gè)作家的字處理器是一長(zhǎng)期的應(yīng)用程序,例如,其中包括了許多短暫的功能,例如文件管理器(經(jīng)常嵌入到字處理器中,如一個(gè)文件保存或打開(kāi)對(duì)話框),一本字典或拼寫檢查程序(經(jīng)常是嵌入的)以及與同事交流的一個(gè)電子郵件程序等。對(duì)一個(gè)軟件開(kāi)發(fā)者來(lái)說(shuō),文本編輯器或集成開(kāi)發(fā)環(huán)境(IDE)則是他們長(zhǎng)期使用的,還有調(diào)試器。
長(zhǎng)期使用的應(yīng)用程序常常也是滿懷激情使用的。請(qǐng)記住,一個(gè)良構(gòu)的UI應(yīng)該是不可見(jiàn)的。這種使用的一個(gè)良好度量是對(duì)用戶UI工作流的影響,這樣就提醒了用戶它的存在。如果我只是簡(jiǎn)單地把文件從一個(gè)文件夾移動(dòng)到另一個(gè)文件夾并遇到一個(gè)2秒鐘的等待,我可能比較高興。如果 我在操作一個(gè)繪圖程序或在一個(gè)繁重調(diào)試會(huì)話中間遇見(jiàn)同樣的一個(gè)2秒鐘等待,我可能變得有點(diǎn)不安。
Amazon是一短暫應(yīng)用程序,eBay和Google以及大多數(shù)的非常大型的公共的基于web的應(yīng)用程序也是這樣的程序。自從出現(xiàn)互聯(lián)網(wǎng)后,權(quán)威專家們已經(jīng)預(yù)言了在基于Web的解決方案的沖擊下傳統(tǒng)型的桌面辦公室套件的歸宿。然而,10年過(guò)去了,它還沒(méi)有發(fā)生。基于Web頁(yè)面的解決方案對(duì)于短暫的使用已經(jīng)足夠了但是對(duì)于長(zhǎng)期的使用卻不夠。
六、忘卻Web
幸好,現(xiàn)代web瀏覽器相似于原來(lái)的針對(duì)遠(yuǎn)程文檔服務(wù)器的客戶端理想-這極相近于瑞士軍刀相似于一種過(guò)時(shí)的電石狩獵工具。在沖向創(chuàng)建最引入注目的瀏覽體驗(yàn)中,交互式小發(fā)明,腳本語(yǔ)言和插件都將/正在猶豫不決中關(guān)門。
可以把Ajax看作一個(gè)針對(duì)于瀏覽器戰(zhàn)爭(zhēng)中被誤解的行為不正常的孩子的康復(fù)中心。通過(guò)提供一些指導(dǎo)和一個(gè)可在其中操作的框架,我們能把JavaScript轉(zhuǎn)換成互聯(lián)網(wǎng)中的一個(gè)有用的模型成員,它能夠提高一個(gè)web應(yīng)用程序的實(shí)用性并且在該過(guò)程中不會(huì)激怒用戶或給瀏覽器顯示需求量等垃圾信息。為此,有一些成熟的、易于理解的工具可用來(lái)幫助我們。設(shè)計(jì)模式就是這樣一種工具-常用于我們的工作中并且在本文中多次參考。
引入一種新技術(shù)是一個(gè)技術(shù)的和社會(huì)的過(guò)程。一旦該技術(shù)出現(xiàn)了,人們就需要弄明白該用它來(lái)干些什么,并且第一步常常是使用它,似乎它是一種原有技術(shù)且更為熟悉。因此,早期的自行車被當(dāng)作是木馬并且沿著地面推著人的腳來(lái)騎。隨著這種技術(shù)為更廣多的用戶所認(rèn)識(shí),又一批革新者將發(fā)現(xiàn)使用這種技術(shù)的一些新的方法-添加了改進(jìn)如踏腳板,制動(dòng)閘,齒輪和充氣輪胎。隨著每次改進(jìn),自行車變得越來(lái)越不象馬了(圖10)。
![]() 圖10現(xiàn)代自行車的發(fā)展 |
相同的過(guò)程也適用于web技術(shù)的發(fā)展。Ajax背后的技術(shù)能夠把web頁(yè)面轉(zhuǎn)換成某種相當(dāng)新的東西。為了從根本上理解Ajax技術(shù)的潛力,我們必須放開(kāi)web頁(yè)面的概念,并且在這樣做時(shí),要忘卻很多以前我們所做的許多假設(shè)。在過(guò)去很短的幾個(gè)月間由于Ajax一詞的出現(xiàn),以前我們所用的很多技術(shù)都要被拋棄了。
凡是有該標(biāo)志的文章,都是該blog博主Caoer(草兒)原創(chuàng),凡是索引、收藏
、轉(zhuǎn)載請(qǐng)注明來(lái)處和原文作者。非常感謝。