iT邦幫忙

DAY 9
2

Javascript面面觀系列 第 9

Javascript面面觀:核心篇《模式-fluent interface(cascade)》

  • 分享至 

  • xImage
  •  

Fluent Interface也有人稱做Cascade,它其實跟程式技術本身沒有直接關係,不過應用得當時,它可以讓程式看起來更有表現力,甚至好像一種新的語言。
它本身也很簡單,只要一個動作就能實現。

結構:return X
以jQuery為例:

 $('div').css("background", "#c8ebcc")
         .filter(".middle")
         .css("border-color", "red");

像這樣用'.'來繼續操作,就是Fluent Interface。使用它可以做出方便、易閱讀而且一次把要做的事做完的程式碼。要讓Javascript可以這樣使用,其實很簡單,只要在函數的最後回傳適當的物件即可,這通常就是this。當然不是隨便在函數最後回傳this就可以,通常這個this會經過好好的組織與包裝,以達到最佳的重複使用效果。(例如jQuery)另外,有許多時候是回傳同一個型別的物件,只是內容是處理的結果。(例如下面的例子)

應用
以我自己而言,最常去擴充的就是Array物件,給它加入一些方便操作的方法,這些之前也示範過:

 Array.prototype.filter = function(f) {
     var i = 0;
     var ret = [];
     for (;i<this.length; i++) {
         if (f(this[i])) {
             ret.push(this[i]);
         }
     }
     return ret;
 }
 Array.prototype.map = function(f) {
     var i = 0;
     var ret = [];
     for (;i<this.length; i++) {
         ret.push(f(this[i]));
     }
     return ret;
 }

由於他們回傳的是處理過的Array,所以可以串接起來,對結果繼續處理。例如我想從一個數字陣列中過濾出奇數,接著每個數字乘以3,然後做排序:

 var arr = [23, 5, 18, 66, 3, 77, 26, 87, 43, 9, 60, 82, 8, 2, 7];
 var a = arr.filter(function(a){return !(a%2==0);})
            .map(function(a){return a*3;})
            .sort(function(a,b){return a>b;});
 alert(a);

這樣可以很清楚地看出,依序做了哪些動作。如果這些動作的名稱用字恰當,可以讓程式可讀性更好。這方面的經典例子,還是jQuery。所以也有人認為jQuery其實重要性在於創造了一個新的Domain Specific Language。要做到可以這樣順暢地使用,不是技術問題,而是整個framework如何組織,不過小地方用起來也還是很好用啦。


上一篇
Javascript面面觀:核心篇《模式-observer》
下一篇
Javascript面面觀:核心篇《模式-singleton》
系列文
Javascript面面觀30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言