天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

jQuery is DSL (Part 1 - DSL)

  jQuery剛剛出來的時候,我沒有太多關注它,覺得這不過是Yet Another JavaScript Library。早期的jQuery專注于DOM節點的篩選與操作,不提供眾多的基礎類擴展,更不提供UI組件,因此體積能夠做到很小。然而,我實在看不出它和我熟悉的Prototype比有什么明顯的優勢——jQuery能做的各項獨立的操作,Prototype都能做。

  后來用jQuery的人越來越多,并且大家都愛用它的鏈式方法調用,甚至還把這種寫法推廣到其它語言中去。例如ASP.NET MVP Omar AL Zabir就把他的服務器端C#組件設計為支持鏈式方法調用的。這時候我才開始關注jQuery,并且逐漸喜歡上了鏈式方法調用的寫法,也在我自己的JavaScript組件中實現類似的API(參考AsyncOverload)。最后,我突然明白到,這其實就是一種Internal DSL嘛!

  在這篇文章里,我準備先討論Internal DSL,在下一篇文章里面再解釋為什么jQuery是Internal DSL。現在我們就從最根本的問題開始吧——

什么是Internal DSL?

  DSL是指Domain Specific Language,也就是用于描述和解決特定領域問題的語言。例如說,我們有專門描述字符串特征的正則表達式,有專門描述數據庫查詢的SQL,有專門描述XML結構的DTD和XSD,甚至有專門描述XML變換的XSLT,這些都是DSL。

當然,并非我們關注的領域都有現成的DSL,這時候我們有三個選擇:

  1. 使用通用語言描述該領域的問題(non-DSL)
  2. 發明一門全新的語言描述該領域的問題(External DSL
  3. 在一門現成語言內實現針對領域問題的描述(Internal DSL

例如說,我們現在要描述一個很簡單的金融領域問題,“我在花旗銀行存款$200”這樣一句話對應的三種法寫法可能是:(假設已經存在I和CitiBank兩個實體實例)

  1. I.DepositTo(new USD(200), CitiBank); /* C# */
  2. I deposit 200USD to CitiBank /* E-DSL */
  3. I.deposit(200.USD()).to(CitiBank); /* I-DSL */

第1種做法的成本最低,你只需要有OO的思想就可以了,你總能把實體類設計出來,但可能和人類描述此領域問題的思維方式有一定偏差(為什么USD可以new?為什么不是deposit [something] to [somewhere]?)。

 

第2種做法的成本最高,你需要寫一個全新的解釋器,至少是寫一組全新的規則,然后讓YACC這類工具幫你生成一個解釋器,但這樣出來的語法最貼近人類思維方式,甚至就如同自然語言一樣流暢。

第3種做法術語上述兩者的折中方案,如果語法不太復雜可以使用Builder模式實現語法分析,寫出來的語法相當貼近自然語言,但還是有學習門檻。由于腳本語言有相當的靈活性,所以現在很多人傾向于選擇在腳本語言內實現Internal DSL。

如何構造Internal DSL?

常見的兩種Internal DSL實現方法是Method ChainingFunction Sequence。如果我們需要描述一臺機器的硬件組成,兩種實現方式的代碼分別如下:

/* Method Chaining */
computer()
  .processor()
    .cores(2)
    .i386()
  .disk()
    .size(150)
  .disk()
    .size(75)
    .speed(7200)
    .sata()
  .end();

/* Function Sequence */
computer();
  processor();
    cores(2);
    processorType(i386);
  disk();
    diskSize(150);
  disk();
    diskSize(75);
    diskSpeed(7200);
    diskInterface(SATA);

無論是哪一種寫法,中間都必須寫一個分析器層。就如同語法分析器需要使用狀態機一樣,Internal DSL的實現也必須內置一個狀態機,以記錄當前執行到什么狀態了,并且接下來可以轉移到哪些有效狀態。

由于這不是一篇專門講語法分析器和狀態機實現的文章,所以我們把關注點保持在API層面就可以了,不深入討論其實現細節和成本。我們知道鏈式方法調用能夠實現Internal DSL就夠了,至于jQuery是如何利用好這一點的,我們在下一篇文章里再作討論。

小結

在這篇文章里,我們了解了Internal DSL與External DSL之間的區別,同時還了解到實現Internal DSL的具體方式,這為我們接下來討論jQuery的Internal DSL式接口做好了鋪墊。在下一篇文章里,我們將深入地來看看為什么jQuery的接口要如此設計,它能為用戶帶來了怎樣的便利,同時它自身的實現上又有什么優勢。

    it知識庫jQuery is DSL (Part 1 - DSL),轉載需保留來源!

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

    主站蜘蛛池模板: 国产成人精品男人的天堂网站 | 国产精品久久久久秋霞影视 | 国语自产视频在线不卡 | 亚洲午夜久久久精品影院 | 狠狠狠狠狠狠干 | 乡村教师电影完整版在线观看 | 国产在线观看www鲁啊鲁免费 | 久久综合中文字幕佐佐木希 | 成年视频xxxxxx在线 | 99热成人精品国产免男男 | 国产AV电影区二区三区曰曰骚网 | 亚洲精品九色在线网站 | 国产婷婷午夜精品无码A片 国产婷婷色综合AV蜜臀AV | 在线播放性xxx欧美 在线播放午夜理论片 | 动漫AV纯肉无码AV电影网 | 欧美在线看欧美视频免费 | 美女网站免费久久久久久久 | 亚洲国产高清在线 | 国产午夜精品理论片影院 | 美女张开腿让我了一夜 | 在线观看免费视频a | 国产人妻午夜无码AV天堂 | 欧美亚洲精品午夜福利AV | 九九免费精品视频 | 国产成人综合在线观看网站 | 午夜福利92看看电影80 | 三级aa久久 | 99久久国产综合精品国 | 亚洲高清一区二区三区电影 | 青娱乐国产精品视频 | 国产欧美日韩亚洲第一页 | 岳打开双腿开始配合日韩视频 | 琪琪SEE色原网色原网站18 | 色欲天天婬色婬香影院 | 国产综合18久久久久久软件 | 东北老妇人70OLDMAN | 国产亚洲tv在线观看 | 无码人妻丰满熟妇啪啪网不卡 | 亚洲精品久久AV无码蜜桃 | 秋霞伦理手机在线看片 | 亚洲午夜久久影院 |