精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

API設計新思維:用流暢接口構造內部DSL

開發 前端
不過普通的API設計方法存在一種天然的陷阱,那就是不管怎樣封裝,大過程雖然比小過程抽象層次更高,但本質上還是過程,受到過程語義的制約。本文將介紹一種被稱為流暢接口(Fluent Interface)的內部DSL設計方法。

程序設計語言的抽象機制包含了兩個最基本的方面:一是語言關注的基本元素/語義;另一個是從基本元素/語義到復合元素/語義的構造規則。在C、C++、Java、C#、Python等通用語言中,語言的基本元素/語義往往離問題域較遠,通過API庫的形式進行層層抽象是降低問題難度最常用的方法。比如,在C語言中最常見的方式是提供函數庫來封裝復雜邏輯,方便外部調用。

不過普通的API設計方法存在一種天然的陷阱,那就是不管怎樣封裝,大過程雖然比小過程抽象層次更高,但本質上還是過程,受到過程語義的制約。也就是說,通過基本元素/語義構造更高級抽象元素/語義的時候,語言的構造規則很大程度上限制了抽象的維度,我們很難跳出這個維度去,甚至可能根本意識不到這個限制。而SQL、HTML、CSS、make等DSL(領域特定語言)的抽象維度是為特定領域量身定做的,從這些抽象角度看問題往往最為簡單,所以DSL在解決其特定領域的問題時比通用程序設計語言更加方便。通常,SQL等非通用語言被稱為外部DSL(External DSL);在通用語言中,我們其實也可以在一定程度上突破語言構造規則的抽象維度限制,定義內部DSL(Internal DSL)。

本文將介紹一種被稱為流暢接口(Fluent Interface)的內部DSL設計方法。Wikipedia上Fluent Interface的定義是:

A fluent interface (as first coined by Eric Evans and Martin Fowler) is an implementation of an object oriented API that aims to provide for more readable code. A fluent interface is normally implemented by using method chaining to relay the instruction context of a subsequent call (but a fluent interface entails more than just method chaining)。

下面將分4個部分來逐步說明流暢接口在構造內部DSL中的典型應用。

1.基本語義抽象

如果要輸出0..4這5個數,我們一般會首先想到類似這樣的代碼:

  1. //Java    
  2. for (int i = 0; i < 5; ++i) {    
  3. system.out.println(i);    
  4. }    

而Ruby雖然也支持類似的for循環,但最簡單的是下面這樣的實現:

  1. //Ruby    
  2. .times {|i| puts i}    

Ruby中一切皆對象,5是Fixnum類的實例,times是Fixnum的一個方法,它接受一個block參數。相比for循環實現,Ruby 的times方式更簡潔,可讀性更強,但熟悉OOP的朋友可能會有疑問,times是否應該作為整型類的方法呢?在OOP中,方法調用通常代表了向對象發送消息,改變或查詢對象的狀態,times方法顯然不是對整型對象狀態的查詢和修改。如果你是Ruby的設計者,你會把times方法放入Fixnum類嗎?如果答案是否定的,那么Ruby的這種設計本質上代表了什么呢?實際上,這里的times雖然只是一個普通的類方法,但它的目的卻與普通意義上的類方法不同,它的語義實際上類似于for循環這樣的語言基本語義,可以被視為一種自定義的基本語義。times的語義從一定程度上跳出了類方法的框框,向問題域邁進了一步!

另一個例子來自Eric Evans的“用兩個時間點構造一個時間段對象”,普通設計:

  1. //Java  
  2. TimePoint fiveOClock, sixOClock;  
  3. TimeInterval meetingTime = new TimeInterval(fiveOClock, sixOClock); 

另一種Evans的設計是這樣:

  1. //Java  
  2. TimeInterval meetingTime = fiveOClock.until(sixOClock); 

按傳統OO設計,until方法本不應出現在TimePoint類中,這里TimePoint類的until方法同樣代表了一種自定義的基本語義,使得表達時間域的問題更加自然。

雖然上面的兩個簡單例子和普通設計相比看不出太大的優勢,但它卻為我們理解流暢接口打下了基礎。重要的是應該體會到它們從一定程度上跳出了語言基本抽象機制的束縛,我們不應該再用類職責劃分、迪米特法則(Law of Demeter)等OO設計原則來看待它們。

2.管道抽象

在Shell中,我們可以通過管道將一系列的小命令組合在一起實現復雜的功能。管道中流動的是單一類型的文本流,計算過程就是從輸入流到輸出流的變換過程,每個命令是對文本流的一次變換作用,通過管道將作用疊加起來。在Shell中,很多時候我們只需要一句話就能完成log統計這樣的中小規模問題。和其他抽象機制相比,管道的優美在于無嵌套。比如下面這段C程序,由于嵌套層次較深,不容易一下子理解清楚:

  1. //C  
  2. min(max(min(max(a,b),c),d),e) 

而用管道來表達同樣的功能則清晰得多:

  1. #!/bin/bash  
  2. max a b | min c | max d | min e 

我們很容易理解這段程序表達的意思是:先求a,b的最大值;再把結果和c取最小值;再把結果和d求最大值;再把結果和e求最小值。

jQuery的鏈式調用設計也具有管道的風格,方法鏈上流動的是同一類型的jQuery對象,每一步方法調用是對對象的一次作用,整個方法鏈將各個方法的作用疊加起來。

  1. //Javascript  
  2. $('li').filter(':event').css('background-color', 'red'); 

3.層次結構抽象

除了管道這種“線性”結構外,流暢接口還可用于構造層次結構抽象。比如,用Javascript動態創建創建下面的HTML片段:

  1. <div id="’product_123’" class="’product’"> 
  2. <img src="’preview_123.jpg’" alt="" /> 
  3. <ul> 
  4.     <li>Name: iPad2 32G</li> 
  5.     <li>Price: 3600</li> 
  6. </ul> 
  7. </div> 

若采用Javascript的DOM API:

  1. //Javascript  
  2. var div = document.createElement('div');  
  3. div.setAttribute(‘id’, ‘product_123’);  
  4. div.setAttribute(‘class’, ‘product’);  
  5.    
  6. var img = document.createElement('img');  
  7. img.setAttribute(‘src’, ‘preview_123.jpg’);  
  8. div.appendChild(img);  
  9.    
  10. var ul = document.createElement('ul');  
  11. var li1 = document.createElement('li');  
  12. var txt1 = document.createTextNode("Name: iPad2 32G");  
  13. li1.appendChild(txt1);  
  14. …  
  15. div.appendChild(ul); 

而下面流暢接口API則要有表現力得多:

  1. //Javascript  
  2. var obj =  
  3. $.div({id:’product_123’, class:’product’})  
  4.     .img({src:’preview_123.jpg’})  
  5.     .ul()  
  6.         .li().text(‘Name: iPad2 32G’)._li()  
  7.         .li().text(‘Price: 3600’)._li()  
  8.     ._ul()  
  9.  ._div(); 

和Javascript的標準DOM API相比,上面的API設計不再局限于孤立地看待某一個方法,而是考慮了它們在解決問題時的組合使用,所以代碼的表現形式特別貼近問題的本質。這樣的代碼是自解釋的(self-explanatory)在可讀性方面要明顯勝于DOM API,這相當于定義了一種類似于HTML的內部DSL,它擁有自己的語義和語法。需要特別注意的是,上面的層次結構抽象和管道抽象有著本質的不同,管道抽象的方法鏈上通常是同一對象的連續傳遞,而層次抽象中方法鏈上的對象卻在隨著層次的變化而變化。此為,我們可以把業務規則也表達在流暢接口中,比如上面的例子中,body()不能包含在div()返回的對象中,div().body()將拋出”body方法不存在”異常。

4.異步抽象

流暢接口不僅可以構造復雜的層次抽象,還可以用于構造異步抽象。在基于回調機制的異步模式中,多個異步調用的同步和嵌套問題是使用異步的難點所在。有時一個稍復雜的調用和同步關系會導致代碼充滿了復雜的同步檢查和層層回調,難以理解和維護。這個問題從本質上講和上面HTML的例子一樣,是由于多數通用語言并未把異步作為基本元素/語義,許多異步實現模式是向語言的妥協。針對這個問題,我用Javascript編寫了一個基于流暢接口的異步DSL,示例代碼如下:

  1. //Javascript  
  2. $.begin()  
  3.     .async(newTask('task1'), 'task1')  
  4.     .async(newTask('task2'), 'task2')  
  5.     .async(newTask('task3'), 'task3')  
  6. .when()  
  7.     .each_done(function(name, result) {  
  8.         console.log(name + ': ' + result);})  
  9.     .all_done(function(){ console.log('good, all completed'); })  
  10.     .timeout(function(){  
  11.         console.log('timeout!!');  
  12.         $.begin()  
  13.             .async(newTask('task4'), 'task4')  
  14.         .when()  
  15.             .each_done(function(name, result) {  
  16.                 console.log(name + ': ' + result); })  
  17.         .end();}  
  18.         , 3000)  
  19. .end(); 

上面的代碼只是一句Javascript調用,但從另一個角度看它卻像一段描述異步調用的DSL程序。它通過流暢接口定義了begin when end的語法結構,begin后面跟的是啟動異步調用的代碼;when后面是異步結果處理,可以選擇each_done, all_done, timeout中的一種或多種。而begin when end結構本身是可以嵌套的,比如上面的代碼在timeout處理分支中就包含了另一個begin when end結構。通過這個DSL,我們可以比基于回調的方式更好地表達異步調用的同步和嵌套關系。

上面介紹了用流暢接口構造的4種典型抽象,出此之外還有很多其他的抽象和應用場合,比如:不少單元測試框架就通過流暢接口定義了單元測試的DSL。雖然上面的例子以Javascript等動態語言居多,但其實流暢接口所依賴的語法基礎并不苛刻,即使在Java這樣的靜態語言中,同樣可以輕松地使用。流暢接口不同于傳統的API設計,理解和使用流暢接口關鍵是要突破語言抽象機制帶來的定勢思維,根據問題域選取適當的抽象維度,利用語言的基本語法構造領域特定的語義和語法。

原文:http://www.cnblogs.com/weidagang2046/

【編輯推薦】

  1. 開發者免費調用谷歌地圖API時代正式結束
  2. WCF Web API輕松實現REST
  3. 新浪微博API開發簡介之用戶授權(PHP基礎篇)
  4. 谷歌拼音輸入法擴展API開發指南
  5. 教你如何構建簡單Web API
責任編輯:陳貽新 來源: Todd的博客
相關推薦

2015-10-27 16:15:15

數據中心設計新思維

2009-12-15 17:45:00

浪潮中科院基因

2015-07-01 11:20:44

數據中心數據中心設計

2015-01-14 10:33:20

瞻博網絡

2018-12-06 12:34:51

2010-08-26 10:43:34

馬云阿里

2013-12-10 13:41:23

創造力設計

2009-02-02 14:59:26

2014-08-31 19:32:00

用友用友醫療HRP

2015-08-14 13:17:55

大數據攻擊

2010-04-02 13:58:40

數據中心

2018-01-26 15:15:21

2015-04-20 11:09:55

2017-03-07 14:48:53

應用運維CMDB

2009-11-13 19:37:46

IBM智慧的地球DI

2017-04-12 13:58:24

互聯網法治政府

2023-09-16 19:28:02

for 循環C++

2024-03-04 10:53:08

RAIIC++開發

2016-11-25 09:10:39

運維管理新思維

2010-09-15 16:10:33

點贊
收藏

51CTO技術棧公眾號

亚洲免费久久| 欧美黑人xxxⅹ高潮交| 欧美极品欧美精品欧美图片| 成人在线免费视频| 韩国精品久久久| 久久免费观看视频| 精品无人区无码乱码毛片国产| 99九九久久| 一区二区三区国产| 欧美下载看逼逼| av在线亚洲天堂| 亚洲一区国产一区| 经典三级在线| 欧美在线aaa| 久久九九有精品国产23| 精品卡一卡二| 国产三级理论片| 综合精品久久| 亚洲欧美日韩成人| 成人啪啪18免费游戏链接| 午夜欧美巨大性欧美巨大 | 国产一区视频在线| 国产精品1234区| 91涩漫在线观看| 欧亚一区二区| 亚洲一区视频在线观看视频| 日韩精品国内| 亚洲三区在线播放| 国产精品一区二区91| 国产精品欧美一区二区| 久久草视频在线| 永久亚洲成a人片777777| 亚洲欧美变态国产另类| 国产高潮视频在线观看| 成人污版视频| 欧美主播一区二区三区| 成 年 人 黄 色 大 片大 全| 1769在线观看| 久久午夜羞羞影院免费观看| 懂色中文一区二区三区在线视频 | av在线免费播放| 久久欧美一区二区| 精品国产免费久久久久久尖叫| 99久久精品免费看国产交换| 日本三级亚洲精品| 日本在线精品视频| 久久国产视频播放| 亚洲激情社区| 高清视频欧美一级| 久久久久久久久久99| 中文字幕人成人乱码| 日韩中文在线视频| 国产一区第一页| 久久国产亚洲| 色婷婷久久一区二区| 最近中文字幕在线mv视频在线| 日韩av不卡一区| 日韩精品视频三区| 91精彩刺激对白露脸偷拍| 色综合www| 亚洲精品永久免费| 免费看黄色的视频| 欧美亚洲国产精品久久| 在线看国产精品| 国产亚洲精品久久久久久豆腐| 日韩久久视频| 久久亚洲春色中文字幕| 男人操女人的视频网站| 欧美日韩福利| 97免费视频在线播放| 国产精品视频久久久久久久| 美日韩精品视频| 国产成人精品免高潮在线观看 | а√天堂中文在线资源8| 亚洲成人tv网| 黑森林福利视频导航| 久九九久频精品短视频| 欧美性猛交xxxx黑人交| 天天操狠狠操夜夜操| 欧美一区一区| 亚洲成色www8888| 国产精品亚洲无码| av在线不卡顿| 色在人av网站天堂精品| 日韩精品一卡二卡| 久久只有精品| 91欧美激情另类亚洲| 黑人操亚洲女人| 国产午夜亚洲精品不卡| 国产免费色视频| 超碰在线中文字幕| 欧美色图12p| 在线xxxxx| 成人无号精品一区二区三区| 九九热这里只有精品6| 亚洲欧美偷拍一区| 国产在线观看免费一区| 国产日韩久久| 18视频免费网址在线观看| 亚洲狠狠爱一区二区三区| 欧美黄色免费影院| 宅男噜噜噜66国产精品免费| 欧美精品一区男女天堂| 精品在线观看一区| 国产精品婷婷| 5566av亚洲| 黄色片在线看| 亚洲va韩国va欧美va| 男人添女人下面免费视频| **爰片久久毛片| 中文字幕亚洲专区| 天天操天天摸天天干| 国产一区二区免费视频| 日韩欧美视频一区二区| 成人av影院在线观看| 欧美日韩国产成人在线免费| 中文字幕在线免费看线人| 欧美 日韩 国产精品免费观看| 国产成人中文字幕| 天堂8在线视频| 亚洲欧美另类综合偷拍| 黄色片在线免费| 99香蕉久久| 欧美成人精品影院| 91tv国产成人福利| 欧美激情一区三区| 欧美成人免费高清视频| 久久久久久久久久久久久久久久久久久久| 中文字幕亚洲欧美一区二区三区 | 久久精品日产第一区二区| 51国产成人精品午夜福中文下载| av在线之家电影网站| 黑人巨大精品欧美一区二区| 美女露出粉嫩尿囗让男人桶| 永久亚洲成a人片777777| 国产噜噜噜噜久久久久久久久| 黄色片免费在线| 色综合中文字幕| 香港三日本8a三级少妇三级99 | 精品99在线视频| 国产精品久久久久久久久久白浆| 欧美大胆在线视频| 国产毛片一区二区三区va在线| 国产精品入口麻豆九色| 99热手机在线| 日本精品三区| 国产精品一区二区久久精品| 亚洲乱亚洲乱妇| 欧美中文字幕一二三区视频| 国产综合精品久久久久成人av| 久久精品官网| 青青草国产精品| 91精品论坛| 国产亚洲美女精品久久久| 在线精品免费视| 国产亚洲成av人在线观看导航 | a∨色狠狠一区二区三区| 国产一区二区三区日韩欧美| 成人黄色激情视频| 欧美激情一区二区三区四区| 亚洲这里只有精品| 99久久精品网站| 91精品久久久久久久久青青| av片在线观看免费| 日韩免费高清视频| 日操夜操天天操| 久久久综合激的五月天| 性欧美极品xxxx欧美一区二区| 成人在线丰满少妇av| 国产美女精品视频| 成人影欧美片| 亚洲成人国产精品| 天堂在线免费观看视频| 欧美国产精品v| 男人操女人下面视频| 亚洲三级色网| 日韩国产在线一区| 婷婷丁香久久| 欧美激情综合色综合啪啪五月| 人成网站在线观看| 91国产丝袜在线播放| 黄色精品视频在线观看| 成人午夜视频在线观看| 日韩精品一区二区三区色欲av| 成人羞羞网站入口| y111111国产精品久久婷婷| 国模精品视频| 中文国产亚洲喷潮| 亚洲爆乳无码一区二区三区| 大桥未久av一区二区三区| 国产传媒在线看| 国产成人av电影在线| 国产又大又硬又粗| 自拍日韩欧美| 日本三级中国三级99人妇网站| 亚洲欧美在线人成swag| 91av视频导航| www免费在线观看| 亚洲老头老太hd| 国产www免费观看| 日本精品一区二区三区高清| 男人操女人的视频网站| 国产亚洲精品久| 无码人妻丰满熟妇啪啪网站| 日韩精品一卡二卡三卡四卡无卡| 50度灰在线观看| 欧美先锋资源| 精品视频在线观看| 日本高清精品| 国产精品羞羞答答| 中文一区一区三区高中清不卡免费| 久久久91精品| av大片在线观看| 国产视频亚洲精品| 午夜免费福利视频| 欧美日产国产精品| 国产精品久久久久久久久久精爆| 洋洋成人永久网站入口| 免费黄色激情视频| 国产网站一区二区| 中文字幕av观看| 成人在线综合网站| 福利视频999| 日本vs亚洲vs韩国一区三区| 国产男女在线观看| 亚洲欧洲一区| 只有这里有精品| 国产精品99一区二区三| 午夜精品福利一区二区| 小嫩嫩12欧美| 久久96国产精品久久99软件| 97色成人综合网站| 91亚洲精华国产精华| 国产精品美女午夜爽爽| 国产第一区电影| av高清不卡| 秋霞成人午夜鲁丝一区二区三区| 91福利在线免费| 97碰在线观看| 国产高清中文字幕在线| 久久久久女教师免费一区| 91三级在线| 欧美国产日韩一区二区三区| av免费在线免费| 欧美成人一二三| 羞羞的视频在线观看| 久久国产精品久久久久久久久久 | 肉色超薄丝袜脚交| 麻豆视频一区二区| 91女神在线观看| 久久精品国产99| 手机在线成人免费视频| 美女任你摸久久| 久久精品亚洲天堂| 国产一区999| 亚洲成人精品在线播放| 成人精品国产一区二区4080| 精品人妻一区二区免费视频| 成人小视频在线| 制服丝袜第二页| 国产欧美精品一区二区色综合| 国产又大又粗又爽的毛片| 国产欧美精品在线观看| 美女三级黄色片| 亚洲精品视频在线看| 久草免费新视频| 欧美日韩亚洲91| 国产成人av免费| 欧美一级淫片007| 老牛影视av牛牛影视av| 亚洲免费av网址| 永久免费av在线| 欧美黑人性生活视频| 中文在线中文资源| 国产欧美va欧美va香蕉在线| 动漫一区二区三区| 国产欧美一区二区视频| 国产欧美日韩精品一区二区三区| 亚洲一区二区高清视频| 综合久久久久| 亚洲美免无码中文字幕在线 | 成人性生活免费看| 久久久久久久久久久久久女国产乱 | 精品欧美日韩精品| 亚洲一区二区三区在线视频 | 欧美日韩成人影院| 国产一区深夜福利| 国内精品麻豆美女在线播放视频 | 色屁屁www国产馆在线观看| 久久久噜噜噜久噜久久| 丁香六月综合| 91丨九色丨国产在线| 欧美jizz19性欧美| 伊人精品久久久久7777| av成人黄色| 182午夜在线观看| 91在线观看一区二区| 欧美xxxooo| 日韩欧美国产网站| 国产黄色免费大片| 一本大道久久加勒比香蕉| 黄色羞羞视频在线观看| 国产精品美女主播在线观看纯欲| 中文无码日韩欧| 亚洲 国产 日韩 综合一区| 一区在线视频| 亚洲色图偷拍视频| 91美女片黄在线观看91美女| 欧美成人国产精品高潮| 欧美这里有精品| 香港一级纯黄大片| 欧美成人免费小视频| 成人免费毛片嘿嘿连载视频…| 国产精品自拍首页| 国产二区精品| 亚洲男人天堂色| 91色视频在线| 国产性生活网站| 久久精品男女| 555www成人网| 激情视频亚洲| 亚洲欧美影院| 久久综合狠狠| 亚洲成人日韩在线| 亚洲高清免费视频| 精品人妻一区二区三区浪潮在线| 一本大道亚洲视频| 69久成人做爰电影| 国产一区二区三区四区五区加勒比| 一区二区三区网站| 最新免费av网址| 国产精品私房写真福利视频| 黄色av网站免费| 亚洲男人av电影| 午夜欧美激情| 久久国产手机看片| 日韩一级在线| 亚洲调教欧美在线| 亚洲h精品动漫在线观看| 亚洲狼人综合网| 久久久久久999| 一区三区自拍| 国产女教师bbwbbwbbw| 国产成人aaa| 欧美成人精品一区二区免费看片| 911国产精品| 免费黄网站在线| 91久久久久久久久久久| 亚洲天天影视网| 在线观看欧美一区二区| 一二三四社区欧美黄| 亚洲AV午夜精品| 国语自产精品视频在线看| 韩国女主播一区二区三区| www.99热这里只有精品| 91视频国产观看| 中文字幕av第一页| 日韩一区二区av| 麻豆一区在线| 国产玉足脚交久久欧美| 99久久er热在这里只有精品15| 国产精品成人网站| 亚洲精品按摩视频| 日韩精品99| 亚洲资源视频| 国产成人精品一区二| 青娱乐免费在线视频| 日韩美女一区二区三区在线观看| 欧美高清性hdvideosex| 欧美日韩精品在线观看视频| 日韩限制级电影在线观看| av在线官网| 国产精品亚洲综合| 久久影院一区| 日韩免费av在线| 国产精品一线天粉嫩av| 久热精品在线播放| 亚洲色图欧美偷拍| 欧日韩在线视频| 国产精品激情av电影在线观看| 香蕉综合视频| 日韩无码精品一区二区| 91国模大尺度私拍在线视频| 国产三区在线观看| 国产传媒一区二区三区| 久久国产日韩| 人妻少妇精品一区二区三区| 亚洲高清一二三区| 亚洲精品国产av| 久久精品99国产精品| 六月婷婷激情综合| 久久久久亚洲蜜桃| 78色国产精品| 欧美一区二区三| 亚洲国产精品第一页| 一本色道久久综合狠狠躁的推荐| 久久久久久久久免费视频| 激情小说综合区| 久久99在线观看| 国产精品视频123|