<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      jQuery is DSL (Part 1 - DSL)

      2009-08-10 23:47  Cat Chen  閱讀(6928)  評論(30)    收藏  舉報(bào)

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

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

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

      什么是Internal DSL?

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

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

      1. 使用通用語言描述該領(lǐng)域的問題(non-DSL)
      2. 發(fā)明一門全新的語言描述該領(lǐng)域的問題(External DSL
      3. 在一門現(xiàn)成語言內(nèi)實(shí)現(xiàn)針對領(lǐng)域問題的描述(Internal DSL
      例如說,我們現(xiàn)在要描述一個(gè)很簡單的金融領(lǐng)域問題,“我在花旗銀行存款$200”這樣一句話對應(yīng)的三種法寫法可能是:(假設(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í)體類設(shè)計(jì)出來,但可能和人類描述此領(lǐng)域問題的思維方式有一定偏差(為什么USD可以new?為什么不是deposit [something] to [somewhere]?)。

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

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

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

      常見的兩種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);

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

      由于這不是一篇專門講語法分析器和狀態(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)的,我們在下一篇文章里再作討論。

      小結(jié)

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

      如果你不希望錯(cuò)過下一篇文章,你可以考慮訂閱我的博客:

      主站蜘蛛池模板: 男女性高爱潮免费网站| 国产日韩av二区三区| 国产av中文字幕精品| 漂亮人妻中文字幕丝袜| 国产成人啪精品午夜网站 | 97久久精品人人澡人人爽| 91产精品无码无套在线| 午夜成人性爽爽免费视频| 成人国产亚洲精品一区二区| 四虎成人精品永久网站| 麻豆国产成人av高清在线| 色偷偷亚洲女人天堂观看| 深夜福利资源在线观看| 暖暖影院日本高清...免费| 中文字幕日韩欧美就去鲁| 久久香蕉国产线看观看怡红院妓院 | 忘忧草在线社区www中国中文| 老色99久久九九爱精品| 无码帝国www无码专区色综合| 色悠悠国产在线视频一线| 动漫av网站免费观看| 国产精品自在线拍国产手机版| 无码丰满人妻熟妇区| 国产精品大全中文字幕| 女人喷水高潮时的视频网站| 男人下部进女人下部视频| 日韩精品久久不卡中文字幕| 男人的天堂av社区在线| 四川丰满少妇无套内谢| 中文字幕 制服 亚洲 另类| 亚洲AV日韩AV综合在线观看| 天天干天天干| 韩国福利片在线观看播放| 亚洲性日韩一区二区三区| 一区二区三区av天堂| 国产精品对白刺激久久久| 日本喷奶水中文字幕视频| 丁香五月婷激情综合第九色 | 国产黄色精品一区二区三区| 隔壁老王国产在线精品| 久久精品一本到东京热|