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

jQuery is DSL (Part 1 - DSL)

  jQuery剛剛出來(lái)的時(shí)候,我沒(méi)有太多關(guān)注它,覺(jué)得這不過(guò)是Yet Another JavaScript Library。早期的jQuery專(zhuān)注于DOM節(jié)點(diǎn)的篩選與操作,不提供眾多的基礎(chǔ)類(lèi)擴(kuò)展,更不提供UI組件,因此體積能夠做到很小。然而,我實(shí)在看不出它和我熟悉的Prototype比有什么明顯的優(yōu)勢(shì)——jQuery能做的各項(xiàng)獨(dú)立的操作,Prototype都能做。

  后來(lái)用jQuery的人越來(lái)越多,并且大家都愛(ài)用它的鏈?zhǔn)椒椒ㄕ{(diào)用,甚至還把這種寫(xiě)法推廣到其它語(yǔ)言中去。例如ASP.NET MVP Omar AL Zabir就把他的服務(wù)器端C#組件設(shè)計(jì)為支持鏈?zhǔn)椒椒ㄕ{(diào)用的。這時(shí)候我才開(kāi)始關(guān)注jQuery,并且逐漸喜歡上了鏈?zhǔn)椒椒ㄕ{(diào)用的寫(xiě)法,也在我自己的JavaScript組件中實(shí)現(xiàn)類(lèi)似的API(參考AsyncOverload)。最后,我突然明白到,這其實(shí)就是一種Internal DSL嘛!

  在這篇文章里,我準(zhǔn)備先討論Internal DSL,在下一篇文章里面再解釋為什么jQuery是Internal DSL?,F(xiàn)在我們就從最根本的問(wèn)題開(kāi)始吧——

什么是Internal DSL?

  DSL是指Domain Specific Language,也就是用于描述和解決特定領(lǐng)域問(wèn)題的語(yǔ)言。例如說(shuō),我們有專(zhuān)門(mén)描述字符串特征的正則表達(dá)式,有專(zhuān)門(mén)描述數(shù)據(jù)庫(kù)查詢(xún)的SQL,有專(zhuān)門(mén)描述XML結(jié)構(gòu)的DTD和XSD,甚至有專(zhuān)門(mén)描述XML變換的XSLT,這些都是DSL。

當(dāng)然,并非我們關(guān)注的領(lǐng)域都有現(xiàn)成的DSL,這時(shí)候我們有三個(gè)選擇:

  1. 使用通用語(yǔ)言描述該領(lǐng)域的問(wèn)題(non-DSL)
  2. 發(fā)明一門(mén)全新的語(yǔ)言描述該領(lǐng)域的問(wèn)題(External DSL
  3. 在一門(mén)現(xiàn)成語(yǔ)言?xún)?nèi)實(shí)現(xiàn)針對(duì)領(lǐng)域問(wèn)題的描述(Internal DSL

例如說(shuō),我們現(xiàn)在要描述一個(gè)很簡(jiǎn)單的金融領(lǐng)域問(wèn)題,“我在花旗銀行存款$200”這樣一句話對(duì)應(yīng)的三種法寫(xiě)法可能是:(假設(shè)已經(jīng)存在I和CitiBank兩個(gè)實(shí)體實(shí)例)

  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的思想就可以了,你總能把實(shí)體類(lèi)設(shè)計(jì)出來(lái),但可能和人類(lèi)描述此領(lǐng)域問(wèn)題的思維方式有一定偏差(為什么USD可以new?為什么不是deposit [something] to [somewhere]?)。

 

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

第3種做法術(shù)語(yǔ)上述兩者的折中方案,如果語(yǔ)法不太復(fù)雜可以使用Builder模式實(shí)現(xiàn)語(yǔ)法分析,寫(xiě)出來(lái)的語(yǔ)法相當(dāng)貼近自然語(yǔ)言,但還是有學(xué)習(xí)門(mén)檻。由于腳本語(yǔ)言有相當(dāng)?shù)撵`活性,所以現(xiàn)在很多人傾向于選擇在腳本語(yǔ)言?xún)?nèi)實(shí)現(xiàn)Internal DSL。

如何構(gòu)造Internal DSL?

常見(jiàn)的兩種Internal DSL實(shí)現(xiàn)方法是Method ChainingFunction Sequence。如果我們需要描述一臺(tái)機(jī)器的硬件組成,兩種實(shí)現(xiàn)方式的代碼分別如下:

/* 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);

無(wú)論是哪一種寫(xiě)法,中間都必須寫(xiě)一個(gè)分析器層。就如同語(yǔ)法分析器需要使用狀態(tài)機(jī)一樣,Internal DSL的實(shí)現(xiàn)也必須內(nèi)置一個(gè)狀態(tài)機(jī),以記錄當(dāng)前執(zhí)行到什么狀態(tài)了,并且接下來(lái)可以轉(zhuǎn)移到哪些有效狀態(tài)。

由于這不是一篇專(zhuān)門(mén)講語(yǔ)法分析器和狀態(tài)機(jī)實(shí)現(xiàn)的文章,所以我們把關(guān)注點(diǎn)保持在API層面就可以了,不深入討論其實(shí)現(xiàn)細(xì)節(jié)和成本。我們知道鏈?zhǔn)椒椒ㄕ{(diào)用能夠?qū)崿F(xiàn)Internal DSL就夠了,至于jQuery是如何利用好這一點(diǎn)的,我們?cè)谙乱黄恼吕镌僮饔懻摗?/p>

小結(jié)

在這篇文章里,我們了解了Internal DSL與External DSL之間的區(qū)別,同時(shí)還了解到實(shí)現(xiàn)Internal DSL的具體方式,這為我們接下來(lái)討論jQuery的Internal DSL式接口做好了鋪墊。在下一篇文章里,我們將深入地來(lái)看看為什么jQuery的接口要如此設(shè)計(jì),它能為用戶(hù)帶來(lái)了怎樣的便利,同時(shí)它自身的實(shí)現(xiàn)上又有什么優(yōu)勢(shì)。

    it知識(shí)庫(kù)jQuery is DSL (Part 1 - DSL),轉(zhuǎn)載需保留來(lái)源!

    鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

    主站蜘蛛池模板: 亚洲精品午夜aaa级久久久久 | 久久亚洲精选 | 亚洲国产在线观看免费视频 | 国产XXXXXX农村野外 | 成人影片下载网站 | 亚洲综合中文字幕无线码 | jjzz韩国| 国内精品伊人久久久影院 | 国产普通话精品久久 | 伊人久久大香线蕉综合影 | 翁熄性放纵交换300章 | xxww69 | 久草在线草a免费线看 | 欧美兽交YOYO| 亚洲国产精品无码中文字幕 | 日本邪恶全彩工囗囗番海贼王 | 久久99re热在线观看视频 | 男生扒开美女尿口戳戳 | WWW国产精品内射熟女 | 麻豆官网md.pub | 国产精品成人网 | 37大但人文艺术A级都市天气 | 国偷自产视频一区二区久 | 99精品国产免费久久久久久下载 | 后式大肥臀国产在线 | 久久er国产精品免费观看2 | 国产AV天堂亚洲AV麻豆 | 国产专区_爽死777 | 99久久99久久久精品齐齐鬼色 | 操老太太的逼 | 国产极品白嫩超清在线观看 | 久久九九少妇免费看A片 | 日韩欧美国产免费看清风阁 | 国产亚洲美女在线视频视频 | 九九免费高清在线观看视频 | 1V1各种PLAY女主被肉 | 男同志在线观看 | 天天插天天舔 | 欧美白妞大战非洲大炮 | 国产在线AV一区二区香蕉 | 花蝴蝶在线直播观看 |