自從有了AJAX技術開始,越來越多網站都使用AJAX技術開發,好像沒用Asynchronous (或是event-driven)的方式寫程式就很落伍了,就連最新的WinRT API都加了一大堆Asynchronous API,但我常常看到一堆網站,在點下某個按鈕後,整個畫面變成灰色的,然後有個輪子轉啊轉的,轉個半天什麼事也不能做,這其實跟傳統的Synchronous網頁沒什麼差別啊!只差在有個輪子轉啊轉,讓使用者誤以為server還在(其實早就死了),比較好的方式應該是只Block需要同步的部分,不需要同步的部分應該還是要讓使用者操作吧!GMail在load信件時會把整個頁面block住嗎?不會吧!不然不就失去Asynchronous的好處了嗎?

  自己寫程式倒是很少用Asynchronous方式開發程式,主要的原因跟這篇學長的文章相似:難測!Comic Surfer一直到2.0才有會轉動的輪子,不過,我的設計只封鎖Navigation的事件,其餘動作功能依然能夠使用,ㄟ...這不是重點,有點離題了,2.0核心沒有加任何Asynchronous method,但多了multi-thread,搭配polling的UI,所有會耗比較多時間的動作(載入大張圖片)和要平行處理的事情(快取其他頁面)都是用獨立的thread處理,這些功能原本都是Synchronous method,所以測試上就和傳統的測試一樣:呼叫method,當程式return檢查結果和物件狀態。至於不同thread之間怎麼同步,例如什麼時候該轉圈圈?什麼時候要把畫面上的圈圈拿掉?看情況,有時候用lock,有時候就跟Swing的event dispatch thread機制一樣,送event給等待的thread。

  其實Synchronous和Asynchronous之間的差異沒有像一個是天和一個是地那麼大,把Synchronous method丟到一個獨立的thread執行加上call back method就可以包裝成Asynchronous method,Asynchronous method加上一個busy waiting lock、time out和exception機制就可以包裝成一個在失敗時(time out)會拋出例外的Synchronous method,開發程式時,我個人還是喜歡先寫Synchronous版本,真的有必要,才用thread轉成Asynchronous方式,畢竟測試時,還是Synchronous比較好測!

dbi1463 發表在 痞客邦 PIXNET 留言(0) 人氣()