Java DSL簡介(收集整理)


一、領域特定語言(DSL)

領域特定語言(DSL)通常被定義為一種特別針對某類特殊問題的計算機語言,它不打算解決其領域外的問題。對於DSL的正式研究已經持續很多年,直 到最近,在程序員試圖采用最易讀並且簡煉的方法來解決他們的問題的時候,內部DSL意外地被寫入程序中。近來,隨着關於Ruby和其他一些動態語言的出 現,程序員對DSL的興趣越來越濃。這些結構松散的語言給DSL提供某種方法,使得DSL允許最少的語法以及對某種特殊語言最直接的表現。

這里將描述怎樣使用Java語言來編寫領域特定語 言,並將建議一些組建DSL語言時可采用的模式。

Java適合用來創建內部領域特定語言嗎?

在我們審視Java語言是否可以作為創建DSL的工具之前,我們首先需要引進“內部DSL”這個概念。一個內部DSL在由應用軟件的主編程語言創 建,對定制編譯器和解析器的創建(和維護)都沒有任何要求。Martin Fowler曾編寫過大量各種類型的DSL,無論是內部的還是外部的,每種類型他都編寫過一些不錯的例子。但使用像Java這樣的語言來創建DSL,他卻 僅僅一筆帶過。

另外還要着重提出的很重要的一點是,在DSL和API兩者間其實很難區分。在內部DSL的例子中,他們本質上幾乎是一樣的。在聯想到DSL這個詞匯 的時候,我們其實是在利用主編程語言在有限的范圍內創建易讀的API。“內部DSL”幾乎是一個特定領域內針對特定問題而創建的極具可讀性的API的代名 詞。

任何內部DSL都受它基礎語言的文法結構的限制。比如在使用Java的情況下,大括弧,小括弧和分號的使用是必須的,並且缺少閉包和元編程有可能會導致DSL比使用動態語言創建來的更冗長。

但從光明的一面來看,通過使用Java,我們同時能利用強大且成熟的類似於Eclipse和IntelliJ IDEA的集成開發環境,由於這些集成開發環境“自動完成(auto-complete)”、自動重構(auto-reconstruct)和debug等特性,使得DSL的創建、使用和維護 來的更加簡單。另外,Java5中的一些新特性(比如generic、varargs 和static imports)可以幫助我們創建比以往任何版本任何語言都簡潔的API。

一般來說,使用Java編寫的DSL不會造就一門業務用戶可以上手的語言,而會是一種業務用戶也會覺得易讀的語 言,同時,從程序員的角度,它也會是一種閱讀和編寫都很直接的語言。和外部DSL或由動態語言編寫的DSL相比有優勢,那就是編譯器可以增強糾錯能力並標 識不合適的使用,而Ruby或Pearl會“愉快接受”荒謬的input並在運行時失敗。這可以大大減少冗長的測試,並極大地提高應用程序的質量。然而, 以這樣的方式利用編譯器來提高質量是一門藝術,目前,很多程序員都在為盡力滿足編譯器而非利用它來創建一種使用語法來增強語義的語言。

利用Java來創建DSL有利有弊。最終,你的業務需求和你所工作的環境將決定這個選擇正確與否。

二、Camel DSL

Camel使用一種Java領域特定的語言(Domain Specific Language,DSL)來創建企業集成模式(Enterprise Integration Patterns)或路由。Camel同時支持一種基於Spring的 XML 配置,以及 Scala DSL。

    使用Java DSL的優點是你使用的IDE可以在你開始編寫時,智能的實例代碼,而不需要在大量的XML上浪費時間。Java DSL非常有表現能力,因為你可以在語言中混合搭配你自己的代碼,來進行表達式或斷言評估,或容易地添加自定義的處理模塊。

DSL的主要入口有

  • CamelContext 用於創建一個Camel 路由規則庫(routing rule base);
  • RouteBuilder 用於創建路由集合。

參考

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM